JavaWeb开发知识总结(Listener) 一时失言乱红尘 2022-06-15 12:21 224阅读 0赞 # JavaWeb开发知识总结(Listener) # ## **1. 监听器概述** ## > JavaWeb中监听器:本质是一个Java类,作用是用来监听其他Java对象所处状态的变化。 ### **1.1 监听器相关的术语** ### 1. 事件源:指被监听的Java对象;如:按钮 2. 监听器:指监听其他Java对象状态的Java对象;如:定义的函数 3. 事件源与监听器的绑定:指的是将监听器去监听指定的事件源对象;如:将按钮的点击事件绑定到指定函数 4. 事件:指的是事件源对象的状态改变。如:按钮被点击等事件 ### **1.2 JavaWeb中的监听器** ### **JavaWeb中的监听器主要是用来监听Servlet中三个域对象的状态变化,监听器分为3类8种。** > # 事件源:Servlet中的3个域对象servletContext,HttpSession,ServletRequest; > > > # 监听器:自定义类实现8个接口即可实现监听器; > > > # 事件源和监听器的绑定:通过在配置文件的形式进行配置; > > > # 事件:3个域对象状态的变化。 ### **1.3 JavaWeb中监听器的分类** ### **JavaWeb中有3类8种监听器(8个接口),用来监听三个域对象的状态。** > # 第一类:监听三个域对象的[创建]和[销毁],每个接口各有2个方法分别用于监听域对象的创建和销毁 > > * ServletContextListener接口 :用于监听ServletContext对象的创建和销毁 > * HttpSessionListener接口 :用于监听HttpSession对象的创建和销毁 > * ServletRequestListener接口 :用于监听ServletRequest对象的创建和销毁 > > # 第二类:监听三个域对象的属性变更[属性添加],[属性移除],[属性替换],属性变更是指向域对象中存取数据,每个接口中各有三个方法对应属性的3种状态 > > * ServletContextAttributeListener接口 :用于监听ServletContext对象中存储数据的变化 > * HttpSessionAttributeListener接口 :用于监听HttpSession对象中存储数据的变化 > * ServletRequestAttributeListener接口 :用于监听ServletRequest对象中存储数据的变化 > > # 第三类:监听HttpSession中JavaBean对象的状态改变[绑定],[解除绑定],[钝化],[活化] > > * HttpSessionBindingListener接口 :绑定和解除绑定的监听器,绑定就是存储javabean对象,解除绑定就是移除域中存储的javabean对象 > * HttpSessionActivationListener接口 :钝化和活化的监听器,钝化就是将javabean对象从session域中序列化到硬盘,活化就是将javabean对象从硬盘反序列化到session域中 ### **1.4 JavaWeb中监听器的使用** ### #### **1.4.1 第一类监听器使用:监听3个域对象的创建和销毁** #### **使用步骤:** 1. 自定义类实现对应监听器的接口,并实现接口中的方法; 2. 在项目下的web.xml中配置`<listener><listener-class>监听器实现类的完全限定名</listener-class></listener>`。 **ServletContextListener监听器:监听ServletContext对象的创建和销毁** > ServletContext对象的生命周期: > > # ServletContext对象的作用范围:是整个项目工程,被所有的Servlet对象共享. > > > # ServletContext对象的创建:tomcat服务器启动时为每一个项目创建一个单独的ServletContext对象. > > > # ServletContext对象的销毁:当项目被从tomcat服务器移除或者服务器关闭的时候,ServletContext对象销毁. > > 接口的两个方法: > > <table> > <thead> > <tr> > <th>监听器中的方法</th> > <th>说明</th> > </tr> > </thead> > <tbody> > <tr> > <td>contextInitialized(ServletContextEvent sce)</td> > <td>监听ServletContext对象创建,servletContext对象创建时会调用该方法</td> > </tr> > <tr> > <td>contextDestroyed(ServletContextEvent sce)</td> > <td>监听ServletContext对象销毁,servletContext对象被销毁时会调用该方法</td> > </tr> > </tbody> > </table> > > **监听器用途:** > > # 企业开发中的应用: > > * 1.加载框架的配置文件:如:Spring框架使用ContextLoaderListener监听器进行配置文件的加载(该监听器本质是实现了ServletContextListener接口) > * 2.定时任务调度:如:天气的定时更新(定时任务类Timer类,TimerTask定时任务类) > > 测试案例: > > // 自定义类实现ServletContextListener接口,并重写方法 > public class MyServletContextListener implements ServletContextListener{ > > @Override > public void contextInitialized(ServletContextEvent sce) { > // 当ServletContext对象创建时会调用该方法 > System.out.println("ServletContext对象被创建了..."); > } > @Override > public void contextDestroyed(ServletContextEvent sce) { > // 当ServletContext对象销毁时会调用该方法 > System.out.println("ServletContext对象被销毁了..."); > } > } > // web.xml中配置该监听器 > <listener> > <listener-class>com.weblistener.MyServletContextListener</listener-class> > </listener> **HttpSessionListener监听器:监听HttpSessionListener对象的创建和销毁** > HttpSession对象的生命周期: > > # HttpSession的创建:服务器端第一次调用`getSession()`创建session。 > > > # HttpSession的销毁: 三种情况销毁HttpSession:浏览器关闭后,session是没有销毁的,而是保存在cookie中的sessionID随着cookie的销毁不存在了,但是服务器端的session还是存在的。 > > 1. HttpSession过期. 默认过期时间为30分钟,session的默认有效时间是30分钟; > 2. 非正常关闭服务器或将项目移除服务器将直接销毁session,如果正常关闭服务器时,服务器会将session序列化到硬盘,下次启动时自动加载该session; > 3. 手动调用`session.invalidate()`进行销毁。 > > # 作用范围:一次会话的过程(多次请求)。不管是重定向(多次请求)或者是转发都能获取到session域中存储的数据, 当客户端关闭浏览器后就不存在了(一次会话过程)。 > > 接口的两个方法: > > <table> > <thead> > <tr> > <th>监听器中的方法</th> > <th>说明</th> > </tr> > </thead> > <tbody> > <tr> > <td>sessionCreated(HttpSessionEvent se)</td> > <td>监听HttpSession对象创建,HttpSession对象创建时会调用该方法</td> > </tr> > <tr> > <td>sessionDestroyed(HttpSessionEvent se)</td> > <td>监听HttpSession对象的销毁,HttpSession对象销毁时会调用该方法</td> > </tr> > </tbody> > </table> > > **HttpSession对象需要注意问题(面试):** > > # 访问Servlet会不会创建Session:不会,调用getSession()方法时才会创建 > > > # 访问JSP会不会创建Session :会,Session是jsp的内置对象,在jsp翻译后的java文件中会调用getSession()方法创建 > > > # 访问html会不会创建Session :不会,html中不能调用创建session的方法,并且不会被翻译成java文件 > > 测试案例: > > // 自定义类实现HttpSessionListener接口 > public class MyHttpSessionListener implements HttpSessionListener{ > > @Override > public void sessionCreated(HttpSessionEvent se) { > System.out.println("HttpSession被创建了..."); > } > @Override > public void sessionDestroyed(HttpSessionEvent se) { > System.out.println("HttpSession被销毁了..."); > } > } > 项目下的web.xml文件中配置: > <listener> > <listener-class>com.weblistener.MyHttpSessionListener</listener-class> > </listener> **ServletRequestListener监听器:监听ServletRequestListener对象的创建和销毁** > **ServletRequest对象的生命周期:** > > # HttpServletRequest作用范围: 一次请求的范围(转发多次属于是一次请求,就是一次请求和一次响应的范围). > > > # HttpServletRequest对象创建: 当有客户端向服务器请求该servlet时,服务器就会创建request对象; > > > # HttpServletRequest对象销毁: 当服务器对本次请求做出响应后就销毁该request对象. > > > > # 客户端向服务器发送一次请求,服务器就会创建request对象.只要有向服务器发送请求,服务器都会创建request对象进行响应,因为服务器会做出404等错误提示,这些错误提示也是有request对象进行接收请求并由response对象进行响应的。 > > 接口中的两个方法: > > <table> > <thead> > <tr> > <th>监听器中方法</th> > <th>说明</th> > </tr> > </thead> > <tbody> > <tr> > <td>requestDestroyed(ServletRequestEvent sre)</td> > <td>监听ServletRequest对象创建,ServletRequest对象创建时会调用该方法</td> > </tr> > <tr> > <td>requestInitialized(ServletRequestEvent sre)</td> > <td>监听ServletRequest对象销毁,ServletRequest对象销毁时会调用该方法</td> > </tr> > </tbody> > </table> > > **ServletRequest对象需要注意的问题(面试):** > > # 访问一个Servlet会不会创建request对象:会,请求Servlet时创建request对象用于封装用户的请求数据; > > > # 访问一个JSP会不会创建request对象 :会,request对象时jsp的内置对象,原理是jsp本质是Servlet,则访问jsp页面和访问Servlet是相同的效果,则会创建request对象; > > > # 访问一个HTML会不会创建request对象 :会,因为服务器会对任何和该项目相关的请求做出响应如404等状态,则在服务器响应时也会创建request对象用于封装用户的请求数据。 > > 测试案例: > > // 自定义类实现ServletRequestListener接口 > public class MyServletRequestListener implements ServletRequestListener{ > > @Override > public void requestDestroyed(ServletRequestEvent sre) { > System.out.println("ServletRequest被销毁了..."); > } > @Override > public void requestInitialized(ServletRequestEvent sre) { > System.out.println("ServletRequest被创建了..."); > } > } > 项目下web.xml文件中配置: > <listener> > <listener-class>com.itheima.weblistener.MyServletRequestListener</listener-class> > </listener> #### **1.4.2 第二类监听器使用:监听3个域对象属性的添加,属性移除和属性替换** #### **使用说明:** # 属性添加:指每次向域中存储数据,就是调用setAttribute()方法; # 属性移除:指从域中移除数据,就是调用removeAttribute()方法; # 属性替换:两次或多次存在域中的数据名称相同,后添加的替换了之前添加的数据,就是多次调用setAttribute()方法,存储的数据名称相同,将之前存储的数据覆盖。 **使用步骤:** 1. 自定义类实现对应监听器的接口,并实现接口中的方法; 2. 在项目下的web.xml中配置`<listener><listener-class>监听器实现类的完全限定名</listener-class></listener>`。 **ServletContextAttributeListener监听器:监听ServletContext对象属性的添加,移除和替换** <table> <thead> <tr> <th>监听器中方法</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>attributeAdded(ServletContextAttributeEvent scab)</td> <td>监听ServletContext对象属性添加,向ServletContext域中存储数据时会调用该方法</td> </tr> <tr> <td>attributeRemoved(ServletContextAttributeEvent scab)</td> <td>监听ServletContext对象属性移除,从ServletContext域中移除数据时会调用该方法</td> </tr> <tr> <td>attributeReplaced(ServletContextAttributeEvent scab)</td> <td>监听ServletContext对象属性替换,向ServletContext域中存储相同名称的数据时会调用该方法</td> </tr> </tbody> </table> **HttpSessionAttributeListener监听器:监听HttpSession对象属性的添加,移除和替换** <table> <thead> <tr> <th>监听器中方法</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>attributeAdded(HttpSessionBindingEvent se)</td> <td>监听HttpSessionAttribute对象属性添加,向HttpSessionAttribute域中存储数据时会调用该方法</td> </tr> <tr> <td>attributeRemoved(HttpSessionBindingEvent se)</td> <td>监听HttpSessionAttribute对象属性移除,从HttpSessionAttribute域中移除数据时会调用该方法</td> </tr> <tr> <td>attributeReplaced(HttpSessionBindingEvent se)</td> <td>监听HttpSessionAttribute对象属性替换,向HttpSessionAttribute域中存储相同名称的数据时会调用该方法</td> </tr> </tbody> </table> **ServletRequestAttributeListener监听器:监听ServletRequest对象属性的添加,移除和替换** <table> <thead> <tr> <th>监听器中方法</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>attributeAdded(ServletRequestAttributeEvent srae)</td> <td>监听ServletRequest对象属性添加,向ServletRequest域中存储数据时会调用该方法</td> </tr> <tr> <td>attributeRemoved(ServletRequestAttributeEvent srae)</td> <td>监听ServletRequest对象属性移除,从ServletRequest域中移除数据时会调用该方法</td> </tr> <tr> <td>attributeReplaced(ServletRequestAttributeEvent srae)</td> <td>监听ServletRequest对象属性替换,向ServletRequest域中存储相同名称的数据时会调用该方法</td> </tr> </tbody> </table> #### **1.4.3 第三类监听器使用:监听HttpSession中JavaBean对象的状态改变\[绑定\],\[解除绑定\],\[钝化\],\[活化\]** #### **使用说明:** # 第三类监听器很特殊,不需要进行配置的.作用在JavaBean上的监听器.JavaBean可以自己感知到在Session中的状态. * 其中的Javabean对象需要实现序列化接口; # 绑定:将javabean存到session域中,就是调用setAttribute()方法存储数据; # 解除绑定:将javabean对象从session域中移除或被替换,就是调用removeAttribute()方法移除数据或调用setAttribute()方法将数据覆盖; # 钝化:将session中javabean对象序列化到硬盘中,不会自动消失,一直存在; # 活化:将硬盘中的javabean对象反序列化到session中。 **使用步骤:** 1. 自定义类实现接口,并实现接口中的方法; 2. 自定义的类实现`HttpSessionActivationListener`接口监听钝化和活化时需要自定义的类实现`Serializable`接口。 **HttpSessionBindingListener接口:监听HttpSession中的JavaBean的绑定和解除绑定** > 接口的方法: > > <table> > <thead> > <tr> > <th>监听器中方法</th> > <th>说明</th> > </tr> > </thead> > <tbody> > <tr> > <td>valueBound(HttpSessionBindingEvent event)</td> > <td>监听javabean对象被添加到HttpSession域中</td> > </tr> > <tr> > <td>valueUnbound(HttpSessionBindingEvent event)</td> > <td>监听javabean对象被从HttpSession域中移除或被替换</td> > </tr> > </tbody> > </table> **HttpSessionActivationListener接口:监听HttpSession中的JavaBean的钝化和活化** > 接口中的方法: > > <table> > <thead> > <tr> > <th>监听器中的方法</th> > <th>说明</th> > </tr> > </thead> > <tbody> > <tr> > <td>sessionWillPassivate(HttpSessionEvent se)</td> > <td>监听javabean对象钝化,当javabean对象被从HttpSession域中序列化到硬盘时会调用该方法</td> > </tr> > <tr> > <td>sessionDidActivate(HttpSessionEvent se)</td> > <td>监听javabean对象活化,当javabean对象被从硬盘反序列化到HttpSession域中时会调用该方法</td> > </tr> > </tbody> > </table> > > **监听器用途:可以定期的将服务器端的session域中的数据序列化到硬盘中,节省服务器资源,定时序列化的实现** > > # 优化Session:节省服务器资源,可以通过配置来定时将session进行序列化 > > > # 通过配置<Context>标签配置定时session序列化.context.xml文件名是固定的,对应目下没有时需要创建 > > 1. 在tomcat/conf/context.xml中配置<Context>:在tomcat中所有的虚拟主机和虚拟路径都会按照这个配置执行.(所有的工程项目都会按照此配置进行javabean的序列化) > 2. 在tomcat/conf/Catalina/localhost/context.xml配置<Context>:在tomcat中的localhost虚拟主机中的所有虚拟路径按照这个配置执行. > 3. 在当前的工程下的META-INF/context.xml配置<Context>:当前这个工程按照配置执行. > > <!--context.xml文件配置内容及格式--> > <?xml version="1.0" encoding="UTF-8"?> > <Context> > <!-- > maxIdleSwap:1 ,1分钟后session会自动序列化到硬盘,时间指的是session在多长时间内不使用且序列化对象的文件不会自动消失 > directory:somnus,序列化后存放的位置,在tomcat/work/项目名/文件夹(somnus) > --> > <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"/> > <Store className="org.apache.catalina.session.FileStore" directory="somnus"/> > </Manager> > </Context>
还没有评论,来说两句吧...