Web初步认识:
软件架构:
C/S:客户端/服务器端
B/S:浏览器/服务器端
资源分类:
静态资源:所有用户访问后,得到的展示结果都一样
静态资源可以直接被浏览器解析
如:html、css、JavaScript
动态资源:每个用户访问后,得到的结果可能不一样。
动态资源需要先转换为静态资源,再返回给浏览器
如:Servlet/jsp,php,asp…
网络通信三要素:
- IP:电子设备(计算机)在网络中的唯一标识。
- 端口:应用程序在计算机中的唯一标识。0~65536
- 传输协议:
基础传输协议:
TCP:安全协议,三次握手。速度稍慢
UDP:不安全协议,速度快
Web服务器软件:
服务器:安装了服务器软件的计算机
服务器软件:接收用户的请求,处理请求,做出响应。
Web服务器软件:
主要功能是提供网上信息浏览服务
常见的JAVA相关的Web服务器软件:
WebLogic: Oracle公司,大型JavaEE服务器,支持所有的JavaEE规范,收费的。
WebSphere: IBM公司,大型JavaEE服务器,支持所有的JavaEE规范,收费的。
JBOSS: JBOSS公司,大型JavaEE服务器,支持所有的JavaEE规范,收费的。
Tomcat: Apache基金组织,中小型JavaEE服务器,仅仅支持少量的JavaEE规范。开源、免费的。
Servlet:
概念:server apple,运行在服务器端的小程序
Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则
将来我们自定义一个类,实现Servlet接口,复写方法。
基本快速使用:
- 创建JavaEE项目
- 定义一个类,实现Servlet接口
- 实现接口中的抽象方法
- 配置Servlet:
web.xml中配置
Tomcat执行Servlet的原理:
1.当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2.查找web.xml文件,是否有对应的<url-pattern>标签体内容
3.有则找到对应的<servlet-class>全类名
4.tomcat会将字节码文件加载进内存并创建其对象
5.调用其方法
Servlet中的生命周期:
被创建:执行init方法,只执行一次(一般用于加载资源)
Servlet什么时候被创建?
- 默认情况下,第一次被访问时创建
- 可以配置指定Servlet的创建时机
在<servlet>标签下配置
1.第一次被访问时,创建
*<load-on-startup>的值为负数
2.在服务器启动时,创建
*<load-on-startup>的值为0或正数
inint方法只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
注意:多个用户同时访问时,可能存在线程安全问题。尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
提供服务:执行service方法,执行多次
每次访问Servlet时,Service方法都会被调用一次。
被销毁:执行destroy方法,只执行一次
Servlet被销毁时执行。服务器关闭时,Servlet被销毁
Servlet3.0注解配置:
好处:
支持注解配置。可以不需要web.xml。
在实现类上使用@WebServlet注解,进行配置
@WebServlet("资源路径")
Servlet体系结构:
Servlet --- 接口
|继承
GenericServlet --- 抽象类
|继承
HttpServlet --- 抽象类
GenericServlet:
该类将Servlet接口中的方法做了默认空实现,只将service()方法作为抽象
将来定义Servlet类时,可以继承GenericServlet类,实现service方法即可。
HttpServlet:
该类对Http协议的封装,简化操作。
使用步骤:
- 定义类继承HttpServlet
- 复写doGet/doPost方法
Servlet相关配置:
urlpartten:Servlet访问路径
一个Servlet可以定义多个访问路径@WebServlet({"url1","url2"})
路径定义规则:
1./xxx:一般路径
2./xxx/xxx:多层路径,目录结构
3.*.do:*通配符
Http协议:
概念: Hyper Text Transfer Protocol 超文本传输协议,规定了 浏览器和万维网之间互相通信的规则
传输协议:定义了客户端和服务器端通信时,发送数据的格式
特点:
- 基于TCP/IP的高级协议
- 默认端口号:80
- 基于请求/响应模型:一个请求一个响应
- 无状态的:每次请求之间相互独立,不能独立数据
历史版本:
1.0版本:每一次请求响应都会建立新的连接
1.1版本:会复用请求
请求消息:客户端发送给服务器端的数据
响应消息:服务器端发送给客户端的数据
请求消息数据格式:
请求行:
格式:
请求方式 | 请求url | 请求协议/版本 |
请求方式:
HTTP协议有七种请求方式,常用的两种:
GET:
1. 请求参数在请求行中
2. 请求的URL长度有限制
3. 不太安全
POST:
1. 请求参数在请求体中
2. 请求的URL长度无限制
3. 相对安全
请求头:客户端浏览器告诉服务器一些信息
请求头名称:请求头值
常见的请求头:
User-Agent:浏览器告诉服务器,访问服务器使用的浏览器版本信息
可以在服务器端获取该头的信息,解决浏览器的兼容性问题
Referer: 告诉服务器,当前请求从哪里来的。
作用:防盗链、统计工作
请求空行:
空行,做分隔POST请求头和请求体的作用
请求体:(正文)
封装POST请求消息的请求参数的
响应消息数据格式:
响应行:
格式:
协议/版本 | 响应状态码 | 状态码描述 |
HTTP/1.1 | 200 | OK |
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
状态码均由3位数字组成
状态码分类:
- 1xx:服务器接收客户端消息,但没有接收完成,等待一段时间后,发送1xx状态码
- 2xx:成功。代表:200
- 3xx:重定向。
- 302(重定向) 表示临时性重定向。访问一个Url时,被重定向到另一个url上
- 304(访问缓存)标识访问缓存。代表上次的文档已经被缓存了,还可以继续使用
- 4xx:客户端错误。
- 404(请求路径没有对应的资源)
- 405(请求方式和对应的方法(doPost/doGet))
- 5xx:服务器端错误。
- 500(服务器内部出现异常)
响应头:
请求头名称:请求头值
常见的响应头:
Content-Type:服务器告诉客户端本次响应消息体的数据格式及编码格式
Content-disposition:服务器告诉客户端以什么格式打开响应体数据
常用的值:
in-line:默认值,在当前页面展示
attachment;filename=XXX:以附件格式打开响应体。用于文件下载
响应空行:空格、分隔作用
响应体:传输的数据
Request对象:
request对象继承体系结构
servletRequest --接口
|继承
HttpServletRequest --接口
|实现
org.apache.catalina.connector.RequestFacade --类(Tomcat)
request功能:
获取请求消息数据:
获取请求行数据:
例:GET / serlvet/deom01?name=zhangsan HTTP/1.1
常用方法:
获取虚拟目录:serlvet
getContextPath()
获取请求的URI/URL:
getRequestURI():serlvet/deom01
getRequestURL():http://locahost/serlvet/deom01
URL:统一资源定位符
URI:统一资源标识符
获取请求头数据
方法:
getHeader(String name):通过请求头名称获取请求头的值
Enumeration<String> getHeaderNames():获取所有的请求头名称
获取请求体数据
请求体:只有PSOT请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:
1.获取流对象
BufferedReader getReader():获取字符输入流
ServletInputStream getInputStream():获取字节输入流
2.再从流对象中拿数据
获取请求参数通用方式:get/post通用(常用)
String getParameter(String name):根据参数名称获取参数值
String[] getParameterValues(String name):根据参数名称获取参数值的数组
Enumeration<String> getParameterNames():获取所有请 求的参数名称
Map<String,String[]> getParameterMap():获取所有参数的Map集合
常见问题:
中文乱码问题:
get方式:Tomcat8 已经将get方式乱码问题解决了
post方式:中文数据会乱码
解决:获取参数前,设置request编码
请求转发(forword):一种在服务器内部的资源跳转方式
步骤:
- 通过request对象获取请求转发器对象:
RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:
forward(ServletRequest request Servletponse reponse)
特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中
- 转发是一次请求,可以使用request域对象共享数据
共享数据:
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
void setAttribute(String name,Object obj):存储数据
Object getAttribute(String name):通过键获取值
void removeAttribute(String name):通过键移除键值对
获取ServletContext对象:
ServletContext getServletContext()
Response对象:
功能:设置响应消息
设置响应行:
格式: HTTP/1.1 200 OK
设置状态码:
setStatus(int sc)
设置响应头:
setHeader(String name,String value)
设置响应体:
使用步骤:
1.获取输出流
字符输出流:PrintWriter getWriter()
默认编码:ISO-8859-1
字节输出流:ServletOutputStream getOutputStream()
2.使用输出流,将数据输出到客户端浏览器
乱码问题:
获取流之前设置流的编码以及告诉浏览器响应体使用的编码:
setContentType("text/html;charset=utf-8");
重定向:redirect (资源跳转的方式)
sendRedirect(String name);
重定向的特点:
- 地址栏发送变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求,不能使用request域对象共享数据
ServletContext对象:
是一个全局对象, 服务器会给每一个项目(工程)都创建一个ServletContext对象
获取ServletContext对象:
1.通过request对象:getServletContext()
2.通过HttpServlet获取:getServletContext()
功能:
获取MIME类型(文件下载):
MIME类型:在互联网通信过程中定义的一种文件数据类型
格式:大类型/小类型 例: text/html image/jpeg
获取String getMimeType(String file):
通过file名获取对应的MIME类型。
域对象:共享数据
ServletContext对象范围:共享所有用户所有请求的数据
void setAttribute(String name,Object obj):存储数据
Object getAttribute(String name):通过键获取值
void removeAttribute(String name):通过键移除键值对
getRealPath(String Path):获取文件真实(服务器)路径
会话技术:
会话:一次会话中包含多次请求和响应
一次会话:浏览器第一次给服务器发送请求,会话建立,直到一方断开为止。
功能:共享数据
方式:
客户端会话技术: Cookie
服务器端会话技术: Session
Cookie:
概念:客户端会话技术,将数据保存到客户端浏览器
基本使用步骤:
1.创建Cookie对象,绑定数据:
new Cookie(String name,String value)
2.发送Cookie对象:
response.addCookie(Cookie cookie)
3.获取Cookie,获取数据:
request.getCookies():返回Cookie数组
实现的原理:
基于响应头set-cookie和请求头cookie传输实现
cookie的细节问题:
一次可不可以发送多个cookie?
可以
可以创建多个Cookie对象,使用response调用多次addCookie
cookie在浏览器中保存多长时间?
- 默认情况下,当浏览器关闭后,Cookie数据被销毁
- 持久化存储:
setMaxAgr(int seconds):
正数:将Cookie数据写到硬盘,持久化存储。
负数:默认值,跟随浏览器关闭而死亡
0:删除Cookie信息
cookie能否存储中文?
- 在Tomcat 8 之前,cookie中不能直接存储中文数据。
需要将中文数据转码 ---> 一般采用URL编码
- 在Tomcat 8之后,cookie支持中文数据
但是特殊符号数据还是需要采用URL编码
cookie共享问题?
- 在一个服务器中,部署多个Web项目,那么这些项目中Cookie能否共享?
- 默认情况下cookie不能共享
- setPath(String Path):设置cookie的获取范围。默认为当前的虚拟目录
如果要多个项目共享,则将path设置"/"即可
- 不同的服务器之间Cookie能否共享?
- 默认情况下cookie不能共享
- setDomain(String path):
如果设置一级域名相同,那么多个服务器之间cookie可以共享
例: setDomain(".bai.com")
那么 tieba.baidu.com 和news.baidu.com中cookie可以共享
Cookie的特点和作用:
特点:
- Cookie存储数据是在客户端浏览器
- 浏览器对于单个Cookie大小有限制(4kb)以及同一个域名下总Cookie数量也有限制(20个)
作用:
- cookie一般用于存储少量的不太敏感的数据(不安全)
- 在不登陆的情况下,完成服务器对客户端的身份识别
Session:
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
基本使用步骤:
- 获取HttpSession对象:
request.getSession()
- 使用HttpSession对象:
HttpSession对象:
Object getAttribute(String name):获取
void setAttribute(String name,Object value):设置
void removeAttribute(String name):删除
原理:Session的实现是依赖于Cookie的。
Cookie中会有一个 JSESSIONID = XXXXX;
细节上的问题:
客户端关闭后,服务器不关闭,两次获取Session是否为同一个?
- 默认情况下。不是
- 可以通过创建Cookie,键设置为 JSESSIONID,设置存活时间使Cookie持久化保存。
客户端不关闭,服务器关闭,两次获取Session是否为同一个?
不是同一个,但是要确保数据不丢失
- session的钝化:
在服务器正常关闭之前,将session对象序列化到硬盘上
- session的活化:
在服务器启动后,将session文件反序列化到内存中的session对象即可。
注意:在Tomcat中钝化和活化均已实现,而在IDEA工具中只实现了钝化,在服务器重新开启时Work目录会被删除然后重新创建所以无法实现活化操作。
Session什么时候被销毁?
- 服务器关闭
- session对象调用invalidate(),自我销毁
- session默认失效时间-->30分钟
也可以通过tomcat中的web.xml配置文件中修改
Session的特点:
- session用于存储一次会话的多次请求的数据,存储在服务器端
- Session可以存储任意类型,任意大小的数据
Session与Cookie的区别?
- Session存储数据在服务器端,Cookie存储数据在客户端
- Session没有数据大小限制,Cookie有限制
- Session数据安全,Cookie相对于不安全
Filter:过滤器
概念:当访问服务器的资源时,过滤器可以将其请求拦截下来,完成一些特殊的功能
作用:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤…
基本快速使用步骤:
- 定义一个类,实现接口Filter
- 复写方法
- 配置拦截路径
web.xml配置
注解配置
过滤器执行流程:
- 执行过滤器
- 执行放行后的资源
- 回来执行过滤器放行下的代码
过滤器声明周期方法:
- init:在服务器启动后,创建Filter对象,然后调用该方法。只执行一次,用于加载资源
- doFilter:每次请求被拦截资源时,会执行。执行多次
- destroy:在服务器关闭后,Fileter对象销毁。服务器正常关闭,调用该方法。执行一次,释放资源
过滤器配置详解:
拦截路径配置:
- 具体资源路径:/index.jsp 访问该资源时,过滤器才执行
- 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会执行
- 后缀名拦截: *.jsp 访问所有后缀名jsp资源时,过滤器都会执行
- 拦截所有: /* 访问所有资源时,过滤器都会执行
拦截方式配置:资源被访问的方式
1. .注解配置:
设置dispatcherTypes属性:
- REQUEST:默认值。浏览器直接请求资源
- FORWORD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
2. web.xml配置:
设置<dispatcher>标签即可
过滤器链(配置多个过滤器):
拦截顺序:
如果有两个过滤器:过滤器1和过滤器2
1执行---> 2执行 ---> 资源执行 ---> 2执行 ---> 1执行
过滤器先后顺序:
- 注解配置:
按照类名的字符串比较规则比较,值小的先执行
如 AFilter 和 Bfilter A先执行
- web.xml配置:
谁定义在上面,谁先执行
Listener:监听器
概念:web的三大组件之一
事件监听机制:
- 事件: 一件事情
- 事件源: 事件发生的地方
- 监听器: 一个对象
- 注册监听: 将事件、事件源、监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码
ServletContextListener:监听ServletContext对象的创建和销毁
方法:
- contextDestroyed(ServletContextEvent sce):ServletContext对象被销毁前调用该方法
- contextInitialized(ServletContextEvent sce):ServletContext对象创建后会调用该方法
步骤:
- 定义一个类实现ServletContextListener接口
- 复写方法
- 配置
web.xml中:
<listener>
<listener-class>类参数</listener-class>
</listener>
指定初始化参数:<context-param>
注解:
@WebListener 即可