目录
JavaWeb之Servlet知识点总结
文章目录
一、Servlet及其相关类与接口
1.Servlet
2.Servlet接口
3.编写Servlet程序的相关接口
4.编写Servlet程序的相关抽象类
5.自定义Servlet的过程
6.Servlet的生命周期
7.servlet的执行流程
8.ServletContext
二、Servlet的功能
1.请求
2.请求转发
3.响应
4.重定向
5.请求转发和重定向的区别
6.Cookie
7.Cookie的使用案例
8.Session
9.Cookie和Session进行对比
10.Filter过滤器
11.四个域对象的范围从小大到
三、java注解与HTTP协议
1.Java注解(Annotation)
6.HTTP协议
(1)概念:Servlet(Server Applet的简称)是服务器端的程序(代码、功 能实现),可交互式的处理客户端发送到服务端的请求,并完成响应操 作。
是JavaWeb程序开发的基础,JavaEE规范(一套接口)的一个组成 部分。
(2)作用
1)接收客户端请求,完成操作。
2)动态生成网页(页面数据可变)。
3)将包含操作结果的动态网页响应给客户端。
(3)Servlet的结构体系
1)在Servlet结构体系中,Servlet接口是最高父接口。
2)GenericServlet抽象类实现Servlet接口,重写了其中的方法。
3)HttpServlet抽象类继承了GenericServlet类,重写了service方法, 实现了不同提交方式完成不同的业务方法。
4)自定义类一般继承HttpServlet类,重写其中的doGet()方法和 doPust()方法,处理请求和响应。
(4)Servlet程序的三种创建方式:
实现Servlet接口,继承GenericServlet,或HttpServlet类。
(1)描述:在Servlet API中最重要的是Servlet接口,所有Servlet都会直 接或间接的与该接口发生联系。或是直接实现该接口,或间接继承自实 现了该接口的类。
(2)方法:
init(ServletConfig config)
作用:初始化servlet对象,该方法只能被调用一次。
ServletConfig getServletConfig()
作用:获得Servlet配置对象。
service(ServletRequest req,ServletResponse res)
作用:接受客户端请求对象,执行业务操作,通过响应对象响应客户端 请求。
String getServletInfo()
获取servlet相关信息。
destroy()
作用:当服务器监测到一个servlet从服务器中被移除时,调用该方法, 释放资源,或服务器重启/关闭。
(1)ServletConfig(Servlet配置对象)接口:具备获得servlet的配置信息 的功能。
(2)ServletConfig的方法:
ServletContext getServletContext()
作用:获取servlet的上下文对象(全局对象)。
String getServletName();
作用:获取servlet的名字。
String getInitParameter(String name);
作用:获取servlet在web.xml中指定参数名的配置参数(单个参数)。
Enumeration
作用:获取servlet在web.xml中的所有配置参数,返回枚举对象。
(1)GenericServlet抽象类
GenericServlet使编写Servlet变得更容易。它提供生命周期方法 init 和 destroy 的简单实现,要编写一般的 Servlet,只需重写抽象 service方法即可。
(2)HttpServlet类
HttpServlet是继承GenericServlet的基础上进一步的扩展。
提供将要被子类化以创建适用于Web站点的HTTP servlet的抽象类。
(3)HttpServlet的子类至少必须重写一个方法,该方法通常是以下这些方法 之一:
doGet(),如果 servlet 支持 HTTP GET 请求
doPost(),用于 HTTP POST 请求
doPut(),用于 HTTP PUT 请求
doDelete(),用于 HTTP DELETE 请求
(4)JavaEE通用的规范:get提交/post提交方式,都可以获取前台页面中的 参数数据,只是提交方式不同,处理请求的操作相同。
(1)自定义一个类继承自HttpServlet。
(2)覆盖业务方法中具体的某个doGet()/doPost()分别代表了get提交 /post提交(常用的)。
(3)配置自定义的servlet
1)方式一:在web工程核心配置文件web.xml中配置。
2)方式二:只需在对应的servlet类上添加@WebServlet注解。
(4)在web工程核心配置文件web.xml中配置自定义的servlet。
1)Servlet的基本配置信息
自定义类名
包名.自定义类名
2)servlet映射配置信息(uri)
自定义类名
/first
3)注意:
url-pattern配置的内容就是浏览器地址栏输入的URL中项目名称后的资源名称。
配置的映射路径(url-pattern)不能重名。
4)uri中的资源路径配置方式
精确匹配:/名称,只有资源路径是具体的名称时才会触发 Servlet。
后缀匹配:*.xxx,只要是以xxx结尾的就匹配触发Servlet。
通配符匹配:/*,匹配所有请求,包含服务器的所有资源。
通配符匹配 /,匹配所有请求,包含服务器的所有资源,不包括.jsp。
5)load-on-startup
①元素标记容器是否应该在web应用程序启动的时候就加载这个 servlet。
②它的值必须是一个整数,表示servlet被加载的先后顺序。
③如果该元素的值为负数或者没有设置,则容器会当Servlet被请 求时再加载。
④如果值为正整数或者0时,表示容器在应用启动时就加载并初始 化这个servlet。
⑤值越小,servlet的优先级越高,就越先被加载。值相同时,容 器就会自己选择顺序来加载。
(5)注解配置(@WebServlet)
1)案例:@WebServlet(“/servlet作为资源被访问的路径”)
2)作用:用于将一个类声明为servlet
该注解在部署时会被容器处理,容器将根据具体的属性配置将相应 的类部署为servlet。
3)属性:下面是一些常用属性,value和url一般是必须的,但是二者 不能共存,若同时指定,一般自动忽略value。
属性名 |
类名 |
属性描述 |
name |
String |
指定servlet的name属性,等价于 |
value |
String[] |
等价于urlPatterns,两者不能共存 |
urlPatterns |
String[] |
指定一组servlet的url的匹配模式,等价于 |
loadOnStartup |
int |
指定servlet的加载顺序,等价于 |
initParams |
WebinitParams[] |
指定一组初始化参数,等价于 |
asyncSupported |
boolean |
申明servlet是否支持异步操作模式,等价于 |
displayName |
String |
servlet的显示名,等价于 |
description |
String |
servlet的描述信息,等价于 |
(6)地址栏输入访问地址:http://localhost:8080/项目名/资源路径。
(1)生命周期:Servlet对象的创建、servlet的初始化、服务方法(请求与 响应),销毁servlet对象。
(2)对象的创建以及初始化都是执行一次:是一个单例的。
(3)Servlet的子实现类对象默认在被访问的时候交由服务器完成创建的。
(4)多次访问同一个servelet,只调用service()方法。这个方法是servlet 程序的入口。
(5)继承HttpServlet类的自定义类,需要重写具体的对应请求方式的方 法:doGet()/doPost()等。
(6)tomcat服务器终止或重启,都会引起servlet被销毁。
(1)地址栏: http://localhost:8080/项目名称/资源路径。
(2)给tomcat服务器发送请求
请求行:GET(默认)/项目名/资源路径 HTTP/1.1 (反复请求)。
(3)在web.xml文件中查找url-pattern(资源路径)。
(4)通过url-pattern查询得到servlet的名字。
(5)再通过这个名字得到serlvet的基本配置信息和 servlet-class(servlet的全限定名)。
(6)如果Servlet自定义类的全限定名(包名.类名)存在,tomcat服务器就会通过反射技术创建该类对象。
Class clazz=Class.forName(“类的全限定名”);
Object obj=clazz.newInstance();
(7)通过字节码文件对象获取对应的方法对象。
Method m = clazz.getDeclaredMethod("doGet",
HttpServletRequest.class,HttpServletResponse.class);
(8)通过方法对象调用doGet方法。
m.invoke(obj,request,response) ;
(1)描述:Servlet的全局(上下文)对象。
(2)获取全局对象的方法:
public ServletContext getServletContext()
具有该方法的类:
GenericServlet提供了getServletContext()方法。
HttpServletRequest提供了getServletContext()方法。
HttpSession提供了getServletContext()方法。
(3)方法:
1)可以获取web工程的上下文路径(项目名)。
public String getContextPath()
2)给当前域对象中设置属性以及绑定的属性值。
Public void setAttribute("属性名", 属性值);
3)通过域对象中设置的属性名称获取绑定的内容。
public Object getAttribute(String name);
4)通过域对象中设置的属性名称删除属性。
removeAttribute(name);
5)获取当前项目在服务器发布的真实路径
getRealPath("/")
(4)作用
1)可以获取web工程的上下文路径
获取全局对象,然后通过该方法获取路径。
public String getContextPath()
2)可以作为域对象去使用,范围最大:代表web应用程序。
获取全局对象,作为域对象,为其设置属性以及绑定的属性值。
servletContext.setAttribute("name", "张三");
获取全局对象,从ServletContext域对象中获取数据。
public Object getAttribute(String name);
String s = (String) context.getAttribute("name") ;
3)请求转发
(1)请求:HttpServletRequest,获取浏览器发送请求的请求信息。
(2)请求中的方法
1)作用:根据表单组件名称获取提交的指定组件的数据。
String getParameter(String name)
2)给当前域对象中设置属性以及绑定的属性值。
public void setAttribute("属性名", 属性值);
3)通过域对象中设置的属性名称获取绑定的内容。
public Object getAttribute(String name);
4)通过域对象中设置的属性名称删除属性。
removeAttribute(name);
5)作用:指定每个请求的编码。
void setCharacterEncoding(String charset)
6)获取请求信息中的请求行信息
请求行:请求提交方式 uri http协议版本
获取请求的提交方式:public String getMethod()
获取uri:public String getRequestURI()
获取url:public Stringget RequestURL()
获取Http协议版本:public String getProtocol()
(1)问题:调用业务逻辑和显示结果页面都在同一个Servlet里,就会产生 设计问题,应该将业务逻辑和显示结果分离开。
不符合单一职能原则、各司其职的思想。
不利于后续的维护。
(2)引入:业务逻辑和显示结果分离,业务逻辑得到的数据结果需要传递给显 示结果的servlet。可以通过转发请求来实现。
(3)转发请求:转发的作用在服务器端,将请求发送给服务器上的其他资源, 以共同完成一次请求的处理。
(4)实现方式:
1)方式一:通过ServletContext
获取域对象(servletContext)对象
ServletContext servletContext = this.getServletContext() ;
获取请求转发(分发)对象
public RequestDispatcher getRequestDispatcher(String path)
RequestDispatcher rd = servletContext.getRequestDispatcher("/adv.html");
从业务逻辑servlet中将请求转发到该工程其他资源路径。
rd.forward(request, response);
2)方式二:域对象为HttpServletRequest的对象
设置域对象的属性和属性值
request.setAttribute("name","lisi");
转发请求
request.getRequestDispatcher("/hello.jsp").forward(request, response);
(5)数据传递
1)forward()表示在一次请求中,在服务器内部跳转,可以共享同一次 request作用域中的数据。
2)request作用域:拥有存储数据的空间,作用范围是一次请求有效, 一次请求可以经过多次转发。
3)可以将数据存入request后,在一次请求过程中的任何位置进行获取。
4)可传递任何数据(基本数据类型、对象、数组、集合等)。
5)存数据:request.setAttribute(key,value);
以键值对形式存储在request作用域中。key为String类型,value 为Object类型。
6)取数据:request.getAttribute(key);
通过String类型的key访问Object类型的value。
(6)转发特点
转发是服务器行为;
转发时浏览器只做了一次访问请求;
转发时浏览器地址不变;
转发时两次跳转之间传输的信息不会丢失,所以可以通过request进行 数据的传递;
转发只能将请求转发给同一个Web应用中的组件,可以转发到任何资源, 包括WEB-INF下的资源。
(1)响应:HttpServletResponse,向浏览器端发送响应消息。
(2)方法:
setHeader(name,value)
作用:设置响应头与值。
public void setStatus(int sc);
作用:设置状态码
setContentType(String)
作用:设置响应文件类型、响应式的编码格式。
setCharacterEncoding(String charset)
作用:设置服务端响应内容编码格式。
getWriter()
作用:获取字符输出流。
public void sendRedirect(String location) throws IOException;
作用:指定重定向位置URL将临时重定向响应发送到客户端,页面跳转。
(3)设置Content-Type响应头:text/html;charset=utf-8
等价于:response.setHeander("Content-Type","text/html;charset=utf-8") ;
(4)设置refresh响应头:定时刷新/定时跳转页面
2秒后定时刷新这个后台地址
response.setHeader("refresh", "2");
3秒后跳转到指定页面
response.setHeader("refresh", "3;/adv.html");
(5)请求与响应内容的中文乱码问题:
1)原因:编辑器环境的编码格式是GBK,获取或输出内容时浏览器的编码 格式是UTF-8,格式不同。
2)解决:
设置请求时的编码格式:request.setCharacterEncoding("utf-8");
设置响应时的编码格式:response.setContentType("text/html;charset=utf-8");
(1)重定向作用在客户端,客户端将请求发送给服务器后,服务器响应给客 户端一个新的请求地址,客户端重新发送新请求。
(2)实现方式1:设置location响应头+状态码
响应码(状态码):
200:成功
404:访问的资源不存在
500:服务器代码有问题
304:读缓存
302:重定向原理:
设置响应头:location
重定向到同项目下的资源:response.setHeader("location", "/项目名/资源路径");
重定向到其他项目下的资源:response.setHeader("location", "http://localhost:8080/Servlet_01/form.html");
设置状态码:进一步请求
response.setStatus(302);
(3)简写方式:HttpServletResponse的sendRedirect方法
response.sendRedirect(request.getContextPath()+"/adv.html" )
(4)数据传递
sendRedirect跳转时,地址栏改变,代表客户端重新发送的请求。属于两次请求。
response没有作用域,两次request请求中的数据无法共享
传递数据:通过URI的拼接进行数据传递("uri?username=tom");
获取数据:request.getParameter("username");
(5)重定向特点
重定向是客户端行为。
重定向是浏览器做了至少两次的访问请求。
重定向浏览器地址改变。
重定向两次跳转之间传输的信息会丢失(request范围)。
重定向可以指向任何的资源,包括当前应用程序中的其他资源、同一个 站点上的其他应用程序中的资源、其他站点的资源。
请求转发:(服务器行为)HttpServletRequest作为域对象
(1)地址栏没有变化http://localhost:8080/webxx/demo1
(2)请求转发的整个过程:中间的请求对象是一致的。
(3)请求转发只能在本工程下的页面跳转,可以访问WEB-INF下的资 源文件(保证安全性)。
(4)转发用在有业务数据需要传递的时候。
重定向:(浏览器行为:写地址:绝对地址:request.getContextPath())
(1)地址栏发生明显变化。
http://localhost:8080/webxx/demo1
http://locahost:8080/webxx/xx.jsp/xx.html
(2)重定向的整个过程:中间的两次request对象不一样,所以不能使用request对象传递数据。
(3)重定向:既能访问本工程下面的资源文件,也可以访问外部资源文件。
(4)重定向用在没有业务数据需要传递的时候,仅仅是一个页面跳转。
(1)客户端状态管理技术(会话技术):代表性的是Cookie技术,存储在浏览器端。
(2)描述:Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中,附带传送给浏览器的一小段数据。
(3)举例:
生活中的会话:张三跟李四打招呼,李四回复张三...
程序中的会话:浏览器和服务器交互产生的一些数据(内容)。
(4)相关方法:
1)Cookie中的方法:
创建Cookie对象:public Cookie(String name, String value)
设置Cookie的最大存活时间(单位为秒):public void setMaxAge(int expiry)
默认的cookie存活(会话结束)时间:就是浏览器关闭的时候。
设置Cookie的有效路径:一般默认就是上下文路径(web工程名称)。
public void setPath(String uri)
获取当前cookie的名称:public String getName()
获取当前cookie的内容:public String getValue()
2)请求响应中的方法
将cookie添加响应信息中,相当于设置了一个响应头。一次发送多 个cookie数据,即向响应对象中添加多个cookie对象。
public void addCookie(Cookie cookie)
获取当前浏览器请求的所有的cookie信息(cookie数组)。
public Cookie[] getCookies()
(5)Cookie默认不支持中文,只能包含ASCII字符,对Cookie的内容进行加 密、解密。
解密:URLDecoder工具类
value = URLDecoder.decode(value, "utf-8");
加密:URLEocoder工具类
date_str = URLEncoder.encode(date_str, "utf-8");
(6)Cookie优点和缺点
1)优点
可配置到期时间(存活时间)。
简单性:Cookie 是一种基于文本的轻量结构,包含简单的键值对。
数据持久性:Cookie默认在过期之前,是可以一直存在客户端浏览 器上的。
2)缺点
cookie存储的内容都只能是String类型:存储中文、特殊符号(空格),需要进行加密/解密。
大小限制:大多数浏览器对Cookie的大小有 4K、8K字节的限制,。
cookie存储的数据量有限制:一个站点只能有20-30个左右的 cookie。
用户可配置为禁用:有些用户禁用了浏览器或客户端设备接收 Cookie的能力,因此限制了这一功能。
潜在的安全风险:Cookie可能会被篡改。会对安全性造成潜在风险,或者导致依赖于Cookie的应用程序出现问题。
(6)Cookie的使用过程:
1)当前第一次请求服务器:第一次浏览器端没有cookie数据。
http://localhost:8080/Cookie_Session_Jsp/CookieDemo1
2)服务器端:通过反射的方式
创建当前url-pattern=CookieDemo1的Servlet对象,调用doGet方 法。
解析:方法体的内容,在内存创建Cookie对象。
Cookie c = new Cookie(String name,String value)
3)将当前Cookie对象添加到响应信息中。
response.addCookie(c) ;
相当于:设置一个响应头,将cookie响应到浏览器端存储起来。
response.setHeader("Set-Cookie","msg=hello") ;
Set-Cookie: msg=hello
4)当前浏览器第二次请求服务器的时候:浏览器向服务器发送请求,就会 将上一次响应的cookie数据,发送到服务器。
http://localhost:8080/Cookie_Session_Jsp/CookieDemo1
将上面的存储的cookie的名称和内容添自动添加到请求头中
Cookie: msg=hello
5)浏览器发送请求到服务器端,后台通过请求对象获取所有的cookie的 数据,匹配cookie数据,有符合需求的cookie就进行操作。
Cookie[] cookies=request.getCookie();
(7)注意:只需要保证Cookie的名和路径一致即可修改。
如果改变cookie的name和有效路径会新建cookie。
而改变cookie值、有效期会覆盖原有cookie。
(1)需求:使用Cookie记住用户上一次访问的系统时间
分析:
(1)设置响应的编码格式:
(2)创建日期对象Date对象,使用SimpleDateFormat对象,对Date对象 进行解码,得到String日期文本。
(3)先获取当前请求对象中的所有cookie数据
Cookie[] cookies=request.getCookies();
(4)如果Cookie数组中不为null,并且当前cookie数组的长度>0 ,说明 存在cookie数据。
1)判断:cookie数组中,是否有cookie的名称为指定的名称 "lastTime"。
2)如果存在,使用URLEncoder工具类,将当前String日期文本 格式加密。
3)通过Cookie的setValue(String value)方法设置value。
4)设置cookie有效期:一个月
5)将cookie响应到浏览器端
提示:用户上一次访问的系统时间是:value
(5)如果当前Cookie数组为null或者长度=0,说明是第一次访问。
1)使用URLEncoder工具类,将当前String日期文本格式加密。
2)创建Cookie名称为"lastTime",value为加密后的日期文本的 对象。
3)设置cookie存活时间: 一个月
4)将cookie响应到浏览器端:response.addCookie(Cookie对象)
(1)服务器状态管理技术:将状态保存在服务器端,代表性的是session技术, 服务器响应sessionID(JSESSIONID)时需要使用Cookie的方式。
(2)概述:Session用于记录用户会话的状态。会话指的是在一段时间内,单 个客户端与Web服务器的交互过程。
(3)在一个Session中,客户可能会多次请求访问同一个资源,也有可能请 求访问各种不同的服务器资源。
(4)Session原理
1)服务器会为每一次会话分配一个Session对象。
2)同一个浏览器向同一个服务器发起的多次请求,同属于一次会话 (Session)。
3)首次使用到Session时,服务器会自动创建Session,并创建Cookie 存储SessionId发送回客户端。
4)注意:session是由服务端创建的。
(5)Session使用
1)Session作用域:拥有存储数据的空间,作用范围是一次会话有效,
2)一次会话:是使用同一浏览器发送的多次请求。一旦浏览器关闭,则结 束会话。
3)可以将数据存入Session中,在一次会话的任意位置进行获取。
4)可传递任何数据:基本数据类型、对象、集合、数组。
(6)方法:
1)获取HttpSession对象
public HttpSession getSession()
如果没有session对象,会创建session对象。
public HttpSession getSession(boolean create)
如果参数为true:创建创建一个新的会话。
如果false:说明当前请求过程的会话对象存在,不创建。
2)给Session对象设置属性以及绑定参数值。
public void setAttribute(String name, Object value)
3)获取当前会话对象的指定属性中绑定的数据。
public Object getAttribute(String name)
4)设置session最大的有效时间,如果为负整数/0:永远不会超时。
public void setMaxInactiveInterval(int interval):单位秒
5)从session中删除指定的属性及数据。
public void removeAttribute(String name);
6)手动删除session
public void invalidate():
7)获取当前session的唯一标识符(id)
public String getId();
(7)Session的存活时间:
1)sesison对象在内存默认的时间:30分钟
tomcat的安装目录中的web.xml文件
配置 :defaulServlet,session过期时间
30
2)一次会话,浏览器关闭/tomcat正常关闭,则Session也销毁。
3)手动删除session
4)到达设置的超时时间(有效时间)
(1)Cookie特点
1)存储在浏览器端
2)存储的内容都只能是String类型:存储中文、特殊符号(空格),必须进行加密和解密。
3)cookie存储的数据量有限制:一个站点:20-30cookie左右
4)cookie相对:不太安全。
(2)Session:
1)存储在服务器端
2)存储的内容可以是任意类型的数据,因为它是一个域对象,可以进行数 据共享。
setAttribute(String name,Object obj)
3)Session存储的数据大小没有限制。
4)相对于cookie,session更安全。
5)Session依赖于Cookie存在:Cookie的名称(session的标识):JSESSIONID
(1)概念:过滤器(Filter)是处于客户端与服务器目标资源之间的一道过 滤技术,执行地位在Servlet之前。
客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时,会根据执行流程再次反向执行Filter。
(2)过滤器作用
执行一些通用的操作,可以解决多个Servlet共性代码的冗余问题。
例如:乱码处理、登录验证。
(3)过滤器配置
1)注解配置
在自定义的Filter类上使用注解@WebFilter(value=“/过滤的目标资源路径”)。
2)web.xml配置,与servlet相似
sf
com.Test.web.filter.SecondFilter
sf
/*
(4)过滤器的过滤路径通常有三种形式:
1)精确过滤匹配:具体的路径,只有请求的jsp页面是过滤器中匹配的 具体页面,或具体的servlet的时候,过滤器才会被执行。比如/index.jsp ,/myservlet1 。
2)后缀过滤匹配,指定后缀名的方式: 只有当请求后缀名为指定后缀的 时候,过滤器才会被执行。比如*.jsp、*.html、*.jpg 。
3)通配符过滤匹配/*:表示拦截所有请求。注意过滤器不能使用/匹配。
4)目录匹配:/xxx/xxx/*,拦截指定目录下的所有资源请求。 例如:/aaa/bbb/*
(5)生命周期:与servlet相似
在启动服务器时就被创建和初始化了,只执行一次。
当有符合拦截的请求,执行doFilter()方法进行过滤,可以执行多次。
当服务器关闭或重启时被销毁,只执行一次。
(6)过滤器的执行流程
1)浏览器端在访问目标资源之前,被filter拦截。
2)服务器根据web.xml/注解中的url-pattern,找到对应的过滤器全限 定名。
3)服务器通过反射获取其成员方法对象,进行操作。
4)当完成过滤操作后,就可以访问目标资源了。
5)当服务器向浏览器发送响应时,会根据过滤器执行流程再次反向执行 Filter。
(7)Filter过滤类型(时机):
@WebFilter里面的属性
DispatcherType[] dispatcherTypes()
返回值DispatcherType 是枚举类型
public enum DispatcherType {
REQUEST:默认,在请求的时候,执行过滤器。
FORWARD:转发,请求转发进行页面跳转的时候,执行过滤器。
INCLUDE:包含,某个页面被包含的时候,执行过滤器。
ASYNC:异步,非同步请求的时候,执行过滤器。
ERROR:错误,错误页面跳转,执行过滤器。
}
注:通过请求转发过来的页面,过滤器才被执行。
过滤类型可以添加多个,符合其中一个就执行。
(7)过滤器链
在一个Web应用中,可以编写多个Filter,这些Filter组合起来称之为一个Filter链。
每个过滤器实现一个特定的功能,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象 传递给该方法。
在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则Web服务器会检查FilterChain对象中是否还有filter。
如果有,则调用第2个filter,如果没有,则调用目标资源。
(8)过滤器优先级
如果为注解配置方式,是按照类全名称的字符串顺序决定作用顺序。
如果是web.xml配置方式,按照 filter-mapping注册顺序,从上往下。
web.xml配置高于注解方式。
如果注解和web.xml同时配置,会创建多个过滤器对象,造成过滤多次。
PageContext:page域,在当前jsp页面中有效。
HttpServletRequest:request域,在一次请求中有效
HttpSession:session域,在一次会话(客户端--服务器端)中有效
ServletContext:全局对象,整个web工程 (web application)。
(1)注解:又称Java标注,是JDK5.0引入的一种注释机制。
(2)可以标注的类型:Java语言中的类、方法、变量、参数和包等都可以被 标注。
(3)注解的生存范围:和Javadoc(自定义类型的类等生成API文档)不同, Java标注可以通过反射获取标注内容。
在编译器生成类文件时,标注可以被嵌入到字节码中。
Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。
当然它也支持自定义Java标注。
(4)常用注解:
1)作用在代码的注解
@Override:检查该方法是否是重写方法。如果发现其父类,或者是 引用的接口中并没有该方法时,会报编译错误。
@Deprecated:标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings:指示编译器去忽略注解中声明的警告。
2)作用在其他注解的注解(元注解):
@Retention:标识这个注解怎么保存,是只在代码中,还是编入class 文件中,或者是在运行时可以通过反射访问。
@Documented:标记这些注解是否包含在用户文档中。
@Target:标记这个注解的可标记类型。
@Inherited:标记这个注解是继承于哪个注解类(默认注解并没有 继承于任何子类)
3)从Java7开始,额外添加了3个注解:
@SafeVarargs:Java7开始支持,忽略任何使用参数为泛型变量的方 法或构造函数调用产生的警告。
@FunctionalInterface:Java8开始支持,标识一个匿名函数或函数 式接口。
@Repeatable:Java8开始支持,标识某注解可以在同一个声明上使用 多次。
(5)Annotation中常用的类/接口
1)Annotation就是个接口
"每1个Annotation"(注解)都必有"1个RetentionPolicy"(作用 域),以及"1~n个ElementType"(可修饰的类型)。
可以通俗的理解为:每1个Annotation对象,都会有唯一的 RetentionPolicy属性;至于ElementType属性,则有1~n个。
2)ElementType是Enum枚举类型,它用来指定Annotation的类型。
"每1个Annotation"都必有"1~n个ElementType"(类型)。当 Annotation与某个ElementType关联时,就意味着:Annotation有 了某种用途。
例如,若一个Annotation对象是METHOD类型,则该 Annotation只能用来修饰方法。
3)RetentionPolicy 是 Enum 枚举类型,它用来指定 Annotation 的策略。通俗的说,就是不同 RetentionPolicy 类型的Annotation 的作用域不同。
(6)三者的取值和定义
1)RetentionPolicy的取值:
SOURCE:Annotation信息仅存在于编译器处理期间,编译器处理完 之后就没有该Annotation信息了。
CLASS:编译器将Annotation存储于类对应的.class文件中。默认 行为。
RUNTIME:编译器将Annotation存储于class文件中,并且可由JVM 读入。
2)ElementType的取值:
public enum ElementType{
TYPE:类、接口(包括注释类型)或枚举声明
FIELD:字段声明(包括枚举常量)
METHOD:方法声明
PARAMETER:参数声明
CONSTRUCTOR:构造方法声明
LOCAL_VARIABLE:局部变量声明
ANNOTATION_TYPE:注释类型声明
PACKAGE:包声明
}
3)自定义Annotattion的方式
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation1 {
//属性
String name();
String value();
}
如果自定义注解中有value属性,可以直接赋值,不需要在注解中书 写属性名称。
(1)描述:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,是一个基于请求与响应模式的、无状 态的、应用层的协议,运行于TCP协议基础之上。
(2)HTTP协议特点
1)支持客户端(浏览器)/服务器模式。
2)简单快速:客户端只向服务器发送请求方法和路径,服务器即可响应 数据,因而通信速度很快。常用的请求方法有GET、POST等。
3)灵活:HTTP允许传输任意类型的数据,传输的数据类型由 Content-Type标识。
4)无连接:无连接指的是每次TCP连接只处理一个或多个请求,服务器 处理完客户的请求后,即断开连接。采用这种方式可以节省传输时 间。
5)HTTP版本:
HTTP1.0版本是一个请求响应之后,直接就断开了。称为短连接。
HTTP1.1版本不是响应后直接就断开了,而是等几秒钟,这几秒钟之 内有新的请求,那么还是通过之前的连接通道来收发消息,如果 过了这几秒钟用户没有发送新的请求,就会断开连接。称为长连 接。
6)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有 记忆能力。
(3)HTTP协议通信流程
客户与服务器建立连接(三次握手)。
客户向服务器发送请求。
服务器接受请求,并根据请求返回相应的文件作为应答。
客户与服务器关闭连接(四次挥手)
(4)请求报文和响应报文
1)HTTP请求报文
当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块, 也就是请求信息(请求报文),HTTP请求信息由4部分组成:
1、请求行:请求方法/地址(URI) 协议/版本
2、请求头(Request Header)
3、空行
4、请求正文
2)HTTP响应报文
HTTP响应报文与HTTP请求报文相似,HTTP响应也由4个部分组成:
1、状态行
2、响应头(Response Header)
3、空行
4、响应正文
(5)常见状态码
200:OK,客户端请求成功
302:Found,临时重定向
403:Forbidden,服务器收到请求,但是拒绝提供服务。服务器通常会 在响应正文中给出不提供服务的原因。
404:Not Found,请求的资源不存在,例如,输入了错误的URL。
500:Internal Server Error,服务器发生不可预期的错误,导致无法完成客户端的请求。