监听器是一个专门用于对其余对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生状况时,当即采起相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另外一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法当即被执行。java
上述概念设计到3个名词概念:web
因为事件源能够产生多个动做(即产生多个事件),而监听器中的每个方法监听一个动做,故每一个监听器中都有不少方法。tomcat
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext、HttpSession和 ServletRequest这三大域对象的建立、销毁事件以及监听这些域对象中的属性发生修改的事件。服务器
在Servlet规范中定义了多种类型的监听器(一共8个监听器),它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象。Servlet规范针对这三个对象上的操做,又把多种类型的监听器划分为三种类型:session
事件源为:三大域
事件对象为:建立与销毁
监听器为:实现了ServletContextListener、HttpSessionListener、ServletRequestListener这三个接口的监听器ide
public class AListener implements ServletContextListener{ public void contextInitialized(ServletContextEvent sce) { //在项目启动时调用 } public void contextDestroyed(ServletContextEvent sce) { //在项目关闭时调用 } }
代码同上述基本一致:google
public class AListener implements HttpSessionListener{ public void sessionCreated(HttpSessionEvent sce) { //在会话产生时调用 } public void sessionDestroyed(HttpSessionEvent sce) { //在会话关闭时调用 } }
代码同上述基本一致:设计
public class AListener implements ServletRequestListener{ public void rquestInitialized(ServletRequestEvent sce) { //在请求产生时调用 } public void requestDestroyed(ServletRequestEvent sce) { //在请求关闭时调用 } }
ServletContextEvent类:类中有一个方法getServletContext(),该方法返回ServletContext对象。
HttpSessionEvent类:类中有一个方法getSession(),该方法返回一个HttpSession对象。
ServletRequestEvent类:类中有两个方法,getServletContext()用于返回一个ServletContext对象,getServletRequest()用于返回一个ServletRequest对象。
事件源:三大域
事件对象:属性的增长与删除
监听器:实现了ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener接口的监听器
public class AListener implements ServletContextAttributeListener{ public void attributeAdded(ServletcontextAttribute scab){ //给ServletContext对象添加属性时调用 } public void attributeRemoved(ServletContextAttributeEvent scab){ //给ServletContext对象删除属性时调用 } public void attributeReplaced(ServletContextAttributeEvent scab){ //给ServletContext对象替换属性值时调用 } }
一样须要在web.xml文件中对AListener进行配置。
public class AListener implements HttpSessionAttributeListener{ public void attributeAdded(HttpSessionAttribute scab){ //给HttpSession对象添加属性时调用 } public void attributeRemoved(HttpSessionAttributeEvent scab){ //给HttpSession对象删除属性时调用 } public void attributeReplaced(HttpSessionAttributeEvent scab){ //给HttpSession对象替换属性值时调用 } }
一样须要在web.xml中对AListener进行配置。
public class AListener implements ServletRequestAttributeListener{ public void attributeAdded(ServletRequestAttribute scab){ //给ServletRequest对象添加属性时调用 } public void attributeRemoved(ServletRequestAttributeEvent scab){ //给ServletRequest对象删除属性时调用 } public void attributeReplaced(ServletRequestAttributeEvent scab){ //给ServletRequest对象替换属性值时调用 } }
一样须要在web.xml中对AListener进行配置。
ServletContextAttributeEvent类:该类对象有三个方法,getSevletContext()用于返回一个ServletContext,getName()用于返回属性名,getValue()用于返回属性值。
HttpSessionBindingEvent类:该类对象有两个方法,getName()用于获取属性名,getValue()用于获取属性值。
ServletRequestAttributeEvent类:该类对象有两个方法,getName()用于获取属性名,getValue()用于获取属性值。
保存在Session域中的对象能够有多种状态:绑定(session.setAttribute(“bean”,Object))到Session中,随Session对象持久化到一个存储设备中;从Session域中解除(session.removeAttribute(“bean”))绑定,随Session对象从一个存储设备中恢复。
Servlet 规范中定义了两个特殊的监听器接口”HttpSessionBindingListener和HttpSessionActivationListener”来帮助JavaBean 对象了解本身在Session域中的这些状态,实现这两个接口的类不须要 web.xml 文件中进行注册。
实现了HttpSessionBindingListener接口的JavaBean对象能够感知本身被绑定到Session中和 Session中删除的事件。
当对象被绑定到HttpSession对象中时,web服务器调用该对象的void valueBound(HttpSessionBindingEvent event)方法。
当对象从HttpSession对象中解除绑定时,web服务器调用该对象的void valueUnbound(HttpSessionBindingEvent event)方法。
17public class JavaBeanDemo1 implements HttpSessionBindingListener { 18 19 private String name; 20 21 @Override 22 public void valueBound(HttpSessionBindingEvent event) { 23 System.out.println(name+"被加到session中了"); 24 } 25 26 @Override 27 public void valueUnbound(HttpSessionBindingEvent event) { 28 System.out.println(name+"被session踢出来了"); 29 } 30 31 public String getName() { 32 return name; 33 } 34 35 public void setName(String name) { 36 this.name = name; 37 } 38 39 public JavaBeanDemo1(String name) { 40 this.name = name; 41 } 42 }
上述的JavaBeanDemo1这个javabean实现了HttpSessionBindingListener接口,那么这个JavaBean对象能够感知本身被绑定到Session中和从Session中删除的这两个操做。
实现了HttpSessionActivationListener接口的JavaBean对象能够感知本身被活化(反序列化)和钝化(序列化)的事件。
当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被钝化(序列化)以前,web服务器调用该javabean对象的void sessionWillPassivate(HttpSessionEvent event) 方法。这样javabean对象就能够知道本身将要和HttpSession对象一块儿被序列化(钝化)到硬盘中。
当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被活化(反序列化)以后,web服务器调用该javabean对象的void sessionDidActive(HttpSessionEvent event)方法。这样javabean对象就能够知道本身将要和 HttpSession对象一块儿被反序列化(活化)回到内存中。(javabean随着HttpSession对象一块儿被活化的前提是该javabean对象除了实现该接口外还应该实现Serialize接口)。
27 public class JavaBeanDemo2 implements HttpSessionActivationListener, 28 Serializable { 29 30 31 private static final long serialVersionUID = 7589841135210272124L; 32 private String name; 33 34 @Override 35 public void sessionWillPassivate(HttpSessionEvent se) { 36 37 System.out.println(name+"和session一块儿被序列化(钝化)到硬盘了,session的id是:"+se.getSession().getId()); 38 } 39 40 @Override 41 public void sessionDidActivate(HttpSessionEvent se) { 42 System.out.println(name+"和session一块儿从硬盘反序列化(活化)回到内存了,session的id是:"+se.getSession().getId()); 43 } 44 45 public String getName() { 46 return name; 47 } 48 49 public void setName(String name) { 50 this.name = name; 51 } 52 53 public JavaBeanDemo2(String name) { 54 this.name = name; 55 } 56 }
既然这里谈到了session的序列化(钝化),反序列化(活化)那咱们就来具体聊聊。
在session上线时,会在tomcat/work/Catalina/localhost/项目名/
下生成一个sessions.ser文件,里面存放了全部session的信息,当你正在访问某个网页时若此时服务器关闭(关闭时才生成这个文件)又打开(打开后这个文件会消失),你依旧能正常访问该网页。(故说session有重生的效果)。
若想废掉session的序列化,须要在tomcat/conf/context.xml
中添加<Manager pathname=“”/>
Tomcat会在session一段时间内不被使用时钝化session对象,所谓钝化session,就是把session经过序列化的方法保存到硬盘文件中。当用户再使用session时,Tomcat还会把钝化的对象再活化session,所谓活化就是把硬盘文件中的session在反序列化中放回内存。当session被tomcat钝化时,sesseion中存储的对象也被钝化,当session被活化时,也会把session中存储的对象(javabean对象)活化。若是某个类(javabean对象)实现了HttpSessionActiveationListener接口后,当对象随着session被钝化和活化时,下面两个方法就会被调用:
public void sessionWillPassivate(HttpSessionEvent se):当对象感知被活化时调用本方法。 public void sessionDidActivate(HttpSessionEvent se):当对象感知被钝化时调用本方法。
钝化时会在tomcat/work/Catalina/localhost/项目/mysession/
文件下生成一个后缀为.session的文件,网页中一个被钝化的session就对应一个.session文件(而上面的序列化是一个.ser文件存在全部的session),在活化时此文件也不会消失(不一样于上述的.ser文件消失)。
固然要看到上述效果,应该先配置tomcat钝化session的参数,在tomcat/conf/catalina/localhost
目录下,添加如下配置内容(google一下吧)。