servlet
1.servlet规范来自于JAVAEE规范中的一种
2.作用:
1)在Servlet规范中,指定【动态资源文件】开发步骤
2)在Servlet规范中,指定Http服务器调用动态资源文件规则
3)在Servlet规范中,指定Http服务器管理动态资源文件实例对象规则
二、Servlet接口实现类
1.Servlet接口来自于Servlet规范下得一个接口,这个接口存在Http服务器
提供jar包
2.Tomcat服务器下lib文件有一个servlet-api.jar存放Servlet接口(javax.servlet.Servlet接口)
3.Servlet规范中任务,Http服务器能调用的【动态资源文件】必须是一个Servlet接口实现类
例子:
class Student{ //不是动态资源文件,Tomcat无权调用 } class Teacher implements Servlet{ //合法动态资源文件,Tomcat有权利调用 Servlet obj = new Teacher(); obj.doGet() }
三、Servlet接口实现类开发步骤
第一步:创建一个Java类继承于HttpServlet父类,使之成为一个Servlet接口实现类
第二步:重写HttpServlet父类两个方法。doGet或则doPost
get
浏览器------》oneServlet.doGet()
post(阅后即焚不会放到浏览器缓存中)
浏览器------》oneServlet.doPost()
第三步:将Servlet接口实现类信息【注册】到Tomcat服务器
【网站】--->【web】---》【WEB-INF】--->web.xml
<!--将Servlet接口实现类类路径地址交给Tomcat--> <servlet> <servlet-name>mm</servlet-name> <!--声明一个变量存储servlet接口实现类类路径--> <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class><!--声明servlet接口实现类类路径--> </servlet>
Tomcat String mm = "com.bjpowernode.controller.OneServlet"
<!--为了降低用户访问Servlet接口实现类难度,需要设置简短请求别名--> <servlet-mapping> <servlet-name>mm</servlet-name> <url-pattern>/one</url-pattern> <!--设置简短请求别名,别名在书写时必须以"/"为开头--> </servlet-mapping>
如果现在浏览器向Tomcat索要OneServlet时地址
http://localhost:8080/myWeb/one
四、Servlet对象生命周期
2.在默认的情况下,Http服务器接收到对于当前Servlet接口实现类第一次请求时自动创建这个Servlet接口实现类的实例对象
在手动配置情况下,要求Http服务器在启动时自动创建某个Servlet接口实现类的实例对象
<servlet> <servlet-name>mm</servlet-name> <!--声明一个变量存储servlet接口实现类类路径--> <servlet-class> com.bjpowernode.controller.OneServlet</servlet-class> <load-on-startup>30</load-on-startup><!--填写一个大于0的整数即可(默认值是0),tomact启动,并创建某个Servlet接口实现类的实例对象--> </servlet>
3.在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象
4.在Http服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁
1.介绍:
1)HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
2)HttpServletResponse接口实现类由Http服务器负责提供
3)HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【响应体】交给浏览器
4)开发人员习惯于将HttpServletResponse接口修饰的对象称为【响应对象】
2.主要功能:
1) 将执行结果以二进制形式写入到【响应体】
2) 设置响应头中[content-type]属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字,图片,视频,命令】
3) 设置响应头中【location】属性,将一个请求地址赋值给location.从而控制浏览器向指定服务器发送请求
Http响应协议包内部结构
1.按照自上而下划分,分为4个空间
2.空间划分:
状态行:[
Http状态码
]
响应头:[
content-type: 指定浏览器采用对应编译器
对响应体二进制数据进行解析
]
空白行:[
没有任何内容,起到隔离作用
]
响应体:[
可能被访问静态资源文件内容
可能被访问的静态资源文件命令
可能被访问的动态资源文件运行结果
*****都是以二进制形式***
]
六、HttpServletRequest接口
1.介绍:
1)HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
2)HttpServletRequest接口实现类由Http服务器负责提供
3)HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
4)开发人员习惯于将HttpServletRequest接口修饰的对象称为【请求对象】
2.作用:
1)可以读取Http请求协议包中【请求行】信息
2)可以读取保存在Http请求协议包中【请求头】或则【请求体】中请求参数信息
3)可以代替浏览器向Http服务器申请资源文件调用
Http请求协议包内部空间:
1.按照自上而下划分,分为4个空间
2.空间划分:
请求行:[
url:请求地址(http://192.168.100.2:8080/index.html)
method:请求方式(POST/GET)
]
请求头:[
请求参数信息【GET】
]
空白行:[
没有任何内容,起到隔离作用
]
请求体:[
请求参数信息【POST】
]
1.在Http服务器接收到浏览器发送的【Http请求协议包】之后,自动为当前的【Http请求协议包】生成一个【请求对象】和一个【响应对象】
2.在Http服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】作为实参传递到方法,确保doGet/doPost正确执行
3.在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁
***【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中
***【请求对象】和【响应对象】相当于用户在服务端的代言人
八、欢迎资源文件(首页)
1.前提:
用户可以记住网站名,但是不会记住网站资源文件名
2.默认欢迎资源文件:
用户发送了一个针对某个网站的【默认请求】时,
此时由Http服务器自动从当前网站返回的资源文件
正常请求: http://localhost:8080/myWeb/index.html
默认请求: http://localhost:8080/myWeb/
3.Tomcat对于默认欢迎资源文件定位规则
1)规则位置:Tomcat安装位置/conf/web.xml
2)规则命令:
<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
4.设置当前网站的默认欢迎资源文件规则
1)规则位置: 网站/web/WEB-INF/web.xml
2)规则命令:
<welcome-file-list> <welcome-file>user/find</welcome-file><!--servlet作为默欢迎资源时,开头斜线必须抹掉--> <welcome-file>login.html</welcome-file> </welcome-file-list>
3)网站设置自定义默认文件定位规则,此时Tomcat自带定位规则将失效
用在web下的WEB-INf中的web.html中
1.介绍:
1)由三位数字组成的一个符号。
2)Http服务器在推送响应包之前,根据本次请求处理情况将Http状态码写入到响应包中【状态行】上
3)如果Http服务器针对本次请求,返回了对应的资源文件。
通过Http状态码通知浏览器应该如何处理这个结果
如果Http服务器针对本次请求,无法返回对应的资源文件
通过Http状态码向浏览器解释不能提供服务的原因
2.分类:
1)组成 100---599;分为5个大类
2)1XX :
最有特征 100; 通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收响应包之后,继续向Http服务器所要依赖的其他资源文件
3) 2XX:
最有特征200,通知浏览器本次返回的资源文件是一个完整独立资源文件,浏览器在接收到之后不需要所要其他关联文件
4)3xx:
最有特征302,通知浏览器本次返回的不是一个资源文件内容而是一个资源文件地址,需要浏览器根据这个地址自动发起请求来索要这个资源文件
response.sendRedirect("资源文件地址")写入到响应头中location
而这个行为导致Tomcat将302状态码写入到状态行
5)4XX:
404: 通知浏览器,由于在服务端没有定位到被访问的资源文件
因此无法提供帮助
405:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet)
但是这个Servlet对于浏览器采用的请求方式不能处理
6)5xx:
500:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet)
这个Servlet可以接收浏览器采用请求方式,但是Servlet在处理
请求期间,由于Java异常导致处理失败
十、多个Servlet之间调用规则
1.前提条件:
某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理。
但是浏览器一次只能访问一个Servlet,导致用户需要手动通过浏览器发起多次请求才能得到服务。
这样增加用户获得服务难度,导致用户放弃访问当前网站【98k,AKM】
2.提高用户使用感受规则:
无论本次请求涉及到多少个Servlet,用户只需要【手动】通知浏览器发起一次请求即可
3.多个Servlet之间调用规则:
1)重定向解决方案
2)请求转发解决方案
十一、重定向解决方案
1.工作原理: 用户第一次通过【手动方式】通知浏览器访问OneServlet。OneServlet工作完毕后,将TwoServlet地址写入到响应头location属性中,导致Tomcat将302状态码写入到状 态行。在浏览器接收到响应包之后,会读取到302状态。此时浏览器自动根据响应头中location属性地址发起第二次请求,访问TwoServlet去完成请求中剩余任务
2.实现命令:
response.sendRedirect("请求地址")
将地址写入到响应包中响应头中location属性
3.特征:
1)请求地址:
既可以把当前网站内部的资源文件地址发送给浏览器 (/网站名/资源文件名)也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)
2)请求次数
浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。后续请求都是浏览器自动发送的。
3) 请求方式:
重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此通过重定向解决方案调用的资源文件接收的请求方式一定是【GET】
4.缺点:
重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间
消耗在往返次数上,增加用户等待服务时间
public class OneServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Oneservlet负责洗韭菜"); //重定向解决方案 //response.sendRedirect("/myWeb/two");//地址格式【/网站名/资源文件名】(传递当前网站内部资源文件地址) response.sendRedirect("http://www.baidu.com");//传递其他网站的欢迎资源文件(即访问首页) } }
public class TwoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("TwoServlet ,韭菜炒鸡蛋"); } }
1.原理:用户第一次通过手动方式要求浏览器访问OneServlet。
OneServlet工作完毕后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet。Tomcat在接收到这个请求之后,自动调用TwoServlet来完成剩余任务
2.实现命令: 请求对象代替浏览器向Tomcat发送请求
//1.通过当前请求对象生成资源文件申请报告对象
RequestDispatcher report = request.getRequestDispatcher("/资源文件名");一定要以"/"为开头
//2.将报告对象发送给Tomcat
report.forward(当前请求对象,当前响应对象)
3.优点:
1)无论本次请求涉及到多少个Servlet,用户只需要手动通过浏览器发送一次请求
2) Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数
增加处理服务速度
4.特征:
1)请求次数
在请求转发过程中,浏览器只发送一次请求
2)请求地址
只能向Tomcat服务器申请调用当前网站下资源文件地址request.getRequestDispathcer("/资源文件名") ****不要写网站名****
3)请求方式
在请求转发过程中,浏览器只发送一个了个Http请求协议包。参与本次请求的所有Servlet共享同一个请求协议包,因此这些Servlet接收的请求方式与浏览器发送的请求方式保持一致
public class OneServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Oneservlet 实施麻醉"); //请求转发方案 //1.通过当前请求对象生成资源文件申请报告对象 RequestDispatcher report = request.getRequestDispatcher("/two"); //2.将报告对象发送给Tomcat report.forward(request,response); } }
public class TwoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("TwoServlet 实施手术"); request.getRequestDispatcher("/three").forward(request,response); } }
public class ThreeServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ThreeServlet 缝合"); } }
十三、多个Servlet之间数据共享实现方案
1.数据共享:OneServlet工作完毕后,将产生数据交给TwoServlet来使用
2.Servlet规范中提供四种数据共享方案
1).ServletContext接口
2).Cookie类
3).HttpSession接口
4).HttpServletRequest接口
(1)、ServletContext接口
1.介绍:
1)来自于Servlet规范中一个接口。在Tomcat中存在servlet-api.jar
在Tomcat中负责提供这个接口实现类
2)如果两个Servlet来自于同一个网站。彼此之间通过网站的ServletContext实例对象实现数据共享
3)开发人员习惯于将ServletContext对象称为【全局作用域对象】
2.工作原理:
每一个网站都存在一个全局作用域对象。这个全局作用域对象【相当于】一个Map.在这个网站中OneServlet可以将一个数据存入到全局作用域对象,当前网站中其他Servlet此 时都可以从全局作用域对象得到这个数据进行使用
3.全局作用域对象生命周期:
1)在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象
2)在Http服务器运行期间时,一个网站只有一个全局作用域对象
3)在Http服务器运行期间,全局作用域对象一直处于存活状态
4)在Http服务器准备关闭时,负责将当前网站中全局作用域对象
进行销毁处理
*****全局作用域对象生命周期贯穿网站整个运行期间***
4.命令实现: 【同一个网站】OneServlet将数据共享给TwoServlet
OneServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response){ //1.通过【请求对象】向Tomcat索要当前网站中【全局作用域对象】 ServletContext application = request.getServletContext(); //2.将数据添加到全局作用域对象作为【共享数据】 application.setAttribute("key1",数据) }} TwoServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response){ //1.通过【请求对象】向Tomcat索要当前网站中【全局作用域对象】 ServletContext application = request.getServletContext(); //2.从全局作用域对象得到指定关键字对应数据 Object 数据 = application.getAttribute("key1"); } }
全局作用域对象
public class OneServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1。通过请求对象向Tomcat索要当前网站全局作用域对象 ServletContext application = request.getServletContext(); //2.将数据添加到全局作用域对象中作为共享数据 application.setAttribute("key",100); } }
public class TwoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1。通过请求对象向Tomcat索要当前网站全局作用域对象 ServletContext application = request.getServletContext(); //2。从全局作用域变量的拿到指定关键字对应的值 Integer money = (Integer)application.getAttribute("key"); } }
(2)、Cookie
1.介绍:
1)Cookie来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中
2)如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于Cookie对象进行数据共享
3) Cookie存放当前用户的私人数据,在共享数据过程中提高服务质量
4) 在现实生活场景中,Cookie相当于用户在服务端得到【会员卡】
2.原理:
用户通过浏览器第一次向MyWeb网站发送请求申请OneServlet。
OneServlet在运行期间创建一个Cookie存储与当前用户相关数据
OneServlet工作完毕后,【将Cookie写入到响应头】交还给当前浏览器。
浏览器收到响应响应包之后,将cookie存储在浏览器的缓存一段时间之后,用户通过【同一个浏览器】再次向【myWeb网站】发送请求申请TwoServlet时。
【浏览器需要无条件的将myWeb网站之前推送过来的Cookie,写入到请求头】发送过去,此时TwoServlet在运行时,就可以通过读取请求头中cookie中信息,得到OneServlet 提供的共享数据
3.实现命令: 同一个网站 OneServlet 与 TwoServlet 借助于Cookie实现数据共享
OneServlet{ public void doGet(HttpServletRequest request,HttpServletResponse resp){ //1.创建一个cookie对象,保存共享数据(当前用户数据) Cookie card = new Cookie("key1","abc"); Cookie card1= new Cookie("key2","efg"); ****cookie相当于一个map ****一个cookie中只能存放一个键值对 ****这个键值对的key与value只能是String ****键值对中key不能是中文 //2.【发卡】将cookie写入到响应头,交给浏览器 resp.addCookie(card); resp.addCookie(card1) } }
浏览器/用户 <---------响应包 【200】【cookie: key1=abc; key2=eft】
【】
【处理结果】
浏览器向myWeb网站发送请求访问TwoServlet---->请求包 【url:/myWeb/two method:get】
【
请求参数:xxxx
Cookie key1=abc;key2=efg
】
【】
【】
TwoServlet{ public void doGet(HttpServletRequest request,HttpServletResponse resp){ //1.调用请求对象从请求头得到浏览器返回的Cookie Cookie cookieArray[] = request.getCookies();//此方法将请求头中的所有的cookie读取出来封装成数组 //2.循环遍历数据得到每一个cookie的key 与 value for(Cookie card:cookieArray){ String key = card.getName(); 读取key "key1" Strign value = card.getValue();读取value "abc" 提供较好的服务。。。。。。。。 } } }
4.Cookie销毁时机:
1.在默认情况下,Cookie对象存放在浏览器的缓存中。因此只要浏览器关闭,Cookie对象就被销毁掉
2.在手动设置情况下,可以要求浏览器将接收的Cookie存放在客户端计算机上硬盘上,同时需要指定Cookie在硬盘上存活时间。在存活时间范围内,关闭浏览器关闭客户端计算机,关闭服务器,都不会导致Cookie被销毁。在存活时间到达时,Cookie自动从硬盘上被删除
cookie.setMaxAge(60); //cookie在硬盘上存活1分钟
cookie工作原理图
cookie模拟划卡消费功能
网上订餐图(代码如下)
public class OneServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName,money; //1.调用请求对象读取【请求头】参数信息 userName = request.getParameter("userName"); money = request.getParameter("money"); //2.开卡 Cookie card1 = new Cookie("userName", userName); Cookie card2 = new Cookie("money",money); //3.发卡,将Cookie写入到响应头交给浏览器 response.addCookie(card1); response.addCookie(card2); //4.通知Tomcat将【点餐页面】内容写入到响应体交给浏览器(请求转发) request.getRequestDispatcher("/index_2.html").forward(request, response); } }
public class TwoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.调用请求对象,向Tomcat索要当前用户在服务端私人储物柜 HttpSession session = request.getSession();//使用cookie进行判断是否有柜子 //2.将session中所有的key读取出来,存放一个枚举对象 Enumeration goodsNames =session.getAttributeNames(); while(goodsNames.hasMoreElements()){ String goodsName =(String) goodsNames.nextElement(); int goodsNum = (int)session.getAttribute(goodsName); System.out.println("商品名称 "+goodsName+" 商品数量 "+goodsNum); } } }
<body> <table border="2" align="center"> <tr> <td>商品名称</td> <td>商品单价</td> <td>供货商</td> <td>放入购物车</td> </tr> <tr> <td>华为笔记本电脑pro13</td> <td>7000</td> <td>华为</td> <td><a href="/myWeb/one?goodsName=华为笔记本电脑pro13">放入购物车</a></td> </tr> <tr> <td>榴莲</td> <td>300</td> <td>泰国</td> <td><a href="/myWeb/one?goodsName=榴莲">放入购物车</a></td> </tr> <tr> <td>男士内裤</td> <td>1000</td> <td>老崔</td> <td><a href="/myWeb/one?goodsName=男士内裤">放入购物车</a></td> </tr> <tr align="center"> <td colspan="4"> <a href="/myWeb/two">查看我的购物车</a> </td> </tr> </table> </body>
(4)、HttpServletRequest接口实现数据共享
1.介绍:
1) 在同一个网站中,如果两个Servlet之间通过【请求转发】方式进行调用,彼此之间共享同一个请求协议包。而一个请求协议包只对应一个请求对象
因此servlet之间共享同一个请求对象,此时可以利用这个请求对象在两个
Servlet之间实现数据共享
2) 在请求对象实现Servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】
2.命令实现: OneServlet通过请求转发申请调用TwoServlet时,需要给TwoServlet提供共享数据
OneServlet{ public void doGet(HttpServletRequest req,HttpServletResponse response){ //1.将数据添加到【请求作用域对象】中attribute属性 req.setAttribute("key1",数据); //数据类型可以任意类型Object //2.向Tomcat申请调用TwoServlet req.getRequestDispatcher("/two").forward(req,response) } } TwoServlet{ public void doGet(HttpServletRequest req,HttpServletResponse response){ //从当前请求对象得到OneServlet写入到共享数据 Object 数据 = req.getAttribute("key1"); } }
public class OneServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.将数据添加到请求作用域对象中,作为共享数据 request.setAttribute("key1","hello world"); //2.代替浏览器,向Tomcat索要TwoServlet来完成剩余任务 request.getRequestDispatcher("/two").forward(request,response); } }
public class TwoServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //从同一个请求作用域对象中得到OneServlet写入到共享数据 String value= (String)request.getAttribute("key1"); System.out.println("TwoServlet得到共享数据"+value); } }
1.介绍:
1)一组来自于Servlet规范下接口,共有8个接口。在Tomcat存在servlet-api.jar包
2)监听器接口需要由开发人员亲自实现,Http服务器提供jar包并没有对应的实现类
3)监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】
2.作用域对象:
1)在Servlet规范中,认为在服务端内存中可以在某些条件下为两个Servlet之间提供数据共享方案的对象,被称为【作用域对象】
2)Servlet规范下作用域对象:
ServletContext: 全局作用域对象
HttpSession : 会话作用域对象
HttpServletRequest:请求作用域对象
3.监听器接口实现类开发规范:三步
1)根据监听的实际情况,选择对应监听器接口进行实现
2)重写监听器接口声明【监听事件处理方法】
3)在web.xml文件将监听器接口实现类注册到Http服务器
4.ServletContextListener接口:
1)作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻
2)监听事件处理方法:
public void contextInitlized() :在全局作用域对象被Http服务器初始化被调用 public void contextDestory(): 在全局作用域对象被Http服务器销毁时候触发调用
public class OneListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("恭喜,来世走一遭"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("兄弟别怕,20年之后还是一条好汉"); } }
web.xml中
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--将监听器接口实现类注册到Tomcat--> <listener> <listener-class>com.bjpowernode.listener.OneListener</listener-class> </listener> </web-app>
5.ServletContextAttributeListener接口:
1)作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻
2)监听事件处理方法:
public void contextAdd():在全局作用域对象添加共享数据时触发 public void contextReplaced():在全局作用域对象更新共享数据时触发 public void contextRemove():在全局作用域对象删除共享数据时触发
十五、Servlet规范扩展-----------------Filter接口(过滤器接口)
1.介绍:
1)来自于Servlet规范下接口,在Tomcat中存在于servlet-api.jar包
2)Filter接口实现类由开发人员负责提供,Http服务器不负责提供
3)Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
2.具体作用:
1)拦截Http服务器,帮助Http服务器检测当前请求合法性
2)拦截Http服务器,对当前请求进行增强操作
3.Filter接口实现类开发步骤:三步
1)创建一个Java类实现Filter接口
2)重写Filter接口中doFilter方法
3)web.xml将过滤器接口实现类注册到Http服务器
4.Filter拦截地址格式
1) 命令格式:
2) 命令作用:
拦截地址通知Tomcat在调用何种资源文件之前需要调用OneFilter过滤进行拦截
3) 要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截
<url-pattern>/img/mm.jpg</url-pattern>
4)要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截
<url-pattern>/img/*</url-pattern>
5)要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截
<url-pattern>*.jpg</url-pattern>
6)要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截
<url-pattern>/*</url-pattern>
Filter接口实现类开发步骤:三步的简单代码:
public class OneFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //1.通过我们拦截的请求对象得到请求包参数信息,从而得到来访用户真实年龄 String age = servletRequest.getParameter("age"); //2.跟据年龄,帮助Http服务器判断本次请求合法性 if(Integer.valueOf(age)<70&&Integer.valueOf(age)>18){//合法请求 //将我们拦截的请求对象个响应对象交换给Tomcat,有Tomcat继续调用资源文件 filterChain.doFilter(servletRequest,servletResponse);//放行 }else{ //过滤器代替Http服务器拒绝本次请求 servletResponse.setContentType("text/html;charset=utf-8"); PrintWriter out = servletResponse.getWriter(); out.print("<center><font style=' color:red;font-size:40px'>珍爱生命</font></center>"); } } }
<filter> <filter-name>oneFilter</filter-name> <filter-class>com.bjpowernode.fiter.OneFilter</filter-class> </filter> <!--通知Tomcat在调用何种资源文件时需要被当前过滤器拦截--> <filter-mapping> <filter-name>oneFilter</filter-name> <url-pattern>/mm.jpg</url-pattern> <!--一般使用<url-pattern>/*</url-pattern>即可--> </filter-mapping>
Filter接口实现类开发步骤:三步的增强代码
在过滤器中进行字符集设定
public class OneFilter implements Filter { //通知拦截的请求对象,使用utf-8字符集对方前请求体信息进行一次重新编辑 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8");//增强 filterChain.doFilter(servletRequest,servletResponse); } }
public class OneServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //直接从请求体里读取请求参数 String userName = request.getParameter("userName"); System.out.println("Oneservlet 从请求体得到参数"+userName); } }
public class TwoServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //直接从请求体里读取请求参数 String userName = request.getParameter("userName"); System.out.println("Twoservlet 从请求体得到参数"+userName); } }
<body> <form action="/myWeb/one" method="post"> 参数:<input type="text" name="userName"/><br/> <input type="submit" value="POST方式访问Oneservlet"/> </form> <form action="/myWeb/one" method="post"> 参数:<input type="text" name="userName"/><br/> <input type="submit" value="POST方式访问Twoservlet"/> </form> </body>
<filter> <filter-name>OneFilter</filter-name> <filter-class>som.bjpowernode.controller.filter.OneFilter</filter-class> </filter> <filter-mapping> <filter-name>OneFilter</filter-name> <url-pattern>/*</url-pattern><!--通知Tomcat在调用所有资源文件前都与要调用Oneservlet进行拦截--> </filter-mapping>