Servlet之间数据共享及监听器+过滤器介绍

 一   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将数据共享给TwoServletOneServlet{public void doGet(HttpServletRequest requset,HttpServletResponse response){//1.通过请求对象向Tomcat索要当前网站中的全局作用域对象ServletContext application = request.getServletContext();//2.将数据添加到全局作用域对象中作为共享数据application.setAttribute("key1",数据);}}TwoServlet{public void doGet(HttpServletRequest requset,HttpServletResponse response){//1.通过请求对象向Tomcat索要当前网站中的全局作用域对象ServletContext application = request.getServletContext();//2.从全局作用域对象中得到指定关键字所对应的数据Object 数据 = application.getAttribute("key1");}}二  Cookie(里面放当前用户的私人数据,提供服务质量)1介绍:1)来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中2)如果两个Servlet来自于同一个网站,并且他们为同一个浏览器/用户提供服务,此时借助于Cookie对象进行数据共享3)Cookie存放当前用户的私人数据,用于在共享数据过程中提高服务质量4)在现实生活场景中,Cookie相当于用户在服务端所得到的vip卡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=xxxxxxxxxxxxxxxx;****cookie相当于一个map****一个cookie中只能存放一个键值对****这个键值对的key与value只能是String****键值对中的key不能是中文//2.【发卡】将cookie写入到响应头来交给浏览器resp.addcookie(card);resp.addcookie(card1);}}浏览器/用户 <--------------响应包 【状态行200】【cookie: key1=abc;key2=efg】【空白行】【响应体:处理结果】浏览器向myWeb网站发送请求访问TwoServlet------------->请求包【url:/myWeb/two   method:get】【请求参数:xxxxCookie   key1=abc;key2=efg】【空白行】【响应体:处理结果】TwoServlet{public void  doGet(HttpServletRequest request,HttpServletResponse resp){//1.调用请求对象通请求头中得到浏览器所返回的cookieCookie  cookieArray[] = request.getCookies();//2.循环遍历数据 得到每一个cookie的key与valuefor(Cookie card : cookieArray){String key= card.getName(); 读取key “key1”String value = card.getValue();读取value “abc”提供较好的服务..............}}}4.cookie销毁时机:1).在默认情况下,Cookie对象存放在浏览器的缓存中,因此只要浏览器关闭,cookie对象就被销毁掉了2).在手动设置情况下,可以要求浏览器将接收的Cooki存放在客户端计算机上的硬盘上,同时需要指定cookie在硬盘上存活时间,在存活时间范围内,关闭浏览器 关闭客户端计算机 关闭服务器 都不会导致cookie被销毁。在存活时间到达的时候,cookie将自动从硬盘上被删除cookie.setMaxAge(60);//cookie在硬盘上存活1分钟三  HttpSession接口【会话作用域对象】:1.介绍:1): HttpSession接口来自于Servlet规范下的一个接口,存在于Tomcat中servlet-api-jar其相关实现类由Http服务器提供,Tomcat提供的实现类存在于servlet-api-jar2): 如果两个Servlet来自于同一个网站,并且他们为同一个浏览器/用户提供服务,此时借助于HttpSession对象进行数据共享3): 开发人员习惯于将HttpSession接口修饰对象称为【会话作用域对象】2.HttpSession与Cookie的区别【常见面试题】1)存储位置不同:一个在天上,一个在地下Cookie存放在客户端计算机(浏览器内存/硬盘)HttpSession存放在服务端计算机内存中2)存储数据类型Cookie对象所存储的数据类型只能是字符串类型(String)HttpSession对象可以存储任意类型的共享数据(Object)3)数据数量一个Cookie对象只能存储一个共享数据HttpSession使用Map集合存储共享数据,可以存储任意数量共享数据4)参照物Cookie相当于客户在服务端【会员卡】HttpSession相当于客户在服务器【私人保险柜】3.命令实现:同一个网站(myWeb)下OneServlet将数据传递给TwoServletOneServlet{public void doGet(HttpServletRequest request,HttpServletResponse response){1.调用请求对象 向Tomcat索要当前用户在服务端的私人储物柜HttpSession session = request.getSession();//2.将数据添加到用户私人储物柜中session.setAttribute("key1",共享数据);}}浏览器访问/myWeb中TwoServlet                                      TwoServlet{public void  doGet(HttpServletRequest request,HttpServletResponse resp){//1.调用请求对象 向Tomcat索要当前用户在服务端的私人储物柜HttpSession session = request.getSession();//2.从会话作用域中得到OneServlet提供的共享数据Object 共享数据 = session.getAttribute("key1");}}4.Http服务器如何将用户与HttpSession关联起来Cookie JSessionid=xxx;5.getSession()与getSession(false)1)getSession():如果当前用户在服务端已经拥有了自己的私人储物柜要求Tomcat将这个私人储物柜进行返回如果当前用户在服务端尚未拥有自己的私人储物柜要求Tomcat为当前用户来创建一个全新的私人储物柜2)getSession(false):如果当前用户在服务端已经拥有了自己的私人储物柜要求Tomcat将这个私人储物柜进行返回如果当前用户在服务端尚未拥有自己的私人储物柜此时Tomcat将返回null6.HttpSession销毁时机:1.用户与HttpSession关联时使用的Cokkie只能存放在浏览器缓存中2.在浏览器关闭时,意味着用户与他的HttpSession关系被切断3.由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会导致Tomcat将浏览器关联的HttpSession进行销毁4.为了解决这个问题,Tomcat会为每一个HttpSession设置一个【空闲时间】这个空闲时间默认是30分钟,如果当前HttpSession对象空闲时间达到了30分钟此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就会销毁掉这个HttpSession7.HttpSession空闲时间的手动设置在当前网站/web/WEB-INF/web.xml<session-config><session-timeout>5</session-timeout>  <!--当前网站中每一个Session最大的空闲时间5分钟--></session-config>四 HttpServletRequest接口实现数据共享【请求作用域对象】1.介绍:1) 在同一个网站中,如果两个Servlet之间通过[请求转发]方式进行调用,彼此之间共享同一个请求协议包,而一个请求协议包只对应一个请求对象,因此这2个servlet之间共享一个请求对象此时可以利用请求对象在两个Servlet之间实现数据共享2) 在请求对象实现Servlet之间数据共享时,开发人员将请求对象称为【请求作用域对象】2.命令实现:OneServlet通过请求转发调用TwoServlet时,需要给TwoServlet提供共享数据OneServlet{public void doGet(HttpServletRequest req,HttpServletResponse response){//1.将数据添加到【请求作用域对象】中的Attribute属性req.setAttribute("key1",数据);//数据类型可以为任意类型Object//2.向Tomcat申请调用TwoServletreq.getRequestDispatcher("/two").forward(req,response);}}	TwoServlet{public void doGet(HttpServletRequest req,HttpServletResponse response){//1.从当前请求对象中得到OneServlet写入到的共享数据Object 数据 = req.getAttribute("key1");//2.向Tomcat申请调用TwoServletreq.getRequestDispatcher("/two").forward(req,response);}}	五 Servlet规范扩展----监听器接口					1.介绍:1)一组来自于Servlet规范下的接口,共有8个接口。在Tomcat中存在servlet-api.jar包中2)监听器接口需要开发人员来亲自实现,Http服务器提供的jar包中没有对应的实现类3)监听器接口的实现类用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】2.作用域对象:1)在Servlet认为在服务端内存中可以再某些条件下为2个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服务器进行销毁是触发调用5.ServletContextAttributeListener接口:1)作用:通过这个接口可以合法监测全局作用域对象共享数据变化时刻2)监听事件处理方法:public void contextAdd(); 在全局作用域对象去添加共享数据时触发public void contextReplaced(); 在全局作用域对象更新共享数据时触发public void contextRemove(); 在全局作用域对象删除共享数据时触发6.全局作用域对象共享数据变化时刻ServletContext application = request.getServletContext();application.setAttribute("key1",100); //新增共享数据application.setAttribute("key1",200); //更新共享数据application.removeAttribute("key1"); //删除共享数据		Servlet规范扩展----Filter接口(过滤器接口)					1.介绍:1)来自于Servlet规范下的接口,存在于Tomcat提供servlet-api.jar包中	2)Filter接口实现类由开发人员负责提供,Http服务器不负责提供3)Filter接口在Http服务器去调用资源文件之前,对Http服务器进行拦截2.具体作用:		1)拦截Http服务器,帮助Http服务器去检测当前请求的合法性2):拦截Http服务器,对当前请求进行增强操作3.Filter接口实现类开发步骤:3步	1):创建一个Java类实现Filter接口2):重写Filter接口中的doFilter()方法3):web.xml文件中,将Filter器接口实现类注册到Http服务器4.Filter拦截地址格式1):命令格式:<filter-mapping><filter-name>oneFilter<filter-name><url-patten>拦截地址</url-patten></filter-mapping>2):命令作用:拦截地址通知Tomcat在调用何种资源文件之前需要调用OneFilter过滤进行拦截3):要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截<url-patten>/img/mm.jpg</url-patten>4):要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截<url-patten>/img/*</url-patten>	5):要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截	<url-patten>*.jpg</url-patten>6):要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截<url-patten>/*</url-patten>