一、Listener生命周期
listener是web三大组件之一,是servlet监听器,用来监听请求,监听服务端的操作。
listener分为:(都是接口类,必须实现相应方法)
1.生命周期监听器(3个)
ServletContextListener
requestDestroyed 在容器启动时被调用(在servlet被实例化前执行)
requestInitialized 在容器销毁时调用(在servlet被销毁后执行)
HttpSessionListener
sessionCreated 在HttpSession创建后调用
sessionDestroyed 在HttpSession销毁前调用(执行session.invalidate();方法)
ServletRequestListener
requestDestroyed 在request对象创建后调用(发起请求)
requestInitialized 在request对象销毁前调用(请求结束)
2.属性变化监听器(3个)
attributeAdded(ServletContextAttributeEvent event) 向appliction中添加属性时调用
attributeRemoved(ServletContextAttributeEvent event) 从appliction中删除属性时调用
attributeReplaced(ServletContextAttributeEvent event) 替换application中的属性时调用
HttpSessionAttributeListener
attributeAdded(HttpSessionBindingEvent event)
attributeRemoved(HttpSessionBindingEvent event)
attributeReplaced(HttpSessionBindingEvent event)
ServletRequestAttributeListener
attributeAdded(ServletRequestAttributeEvent event)
attributeRemoved(ServletRequestAttributeEvent event)
attributeReplaced(ServletRequestAttributeEvent event)
3.session中指定类属性变化监听器(2)
HttpSessionBindingListener
valueBound(HttpSessionBindingEvent event)当该类实例设置进session域中时调用
valueUnbound(HttpSessionBindingEvent event)当该类的实例从session域中移除时调用
HttpSessionActivationListener
sessionWillPassivate(HttpSessionEvent se) 当对象session被序列化(钝化)后调用
sessionDidActivate(HttpSessionEvent se) 当对象session被反序列化(活化)后调用
二、测试范例
1.生命周期监听:
ServletContentAttribute_Listener.java
1 public class ServletContentAttribute_Listener implements ServletContextListener { 2 /** 3 * ServletContextListener实现方法 4 * @param sce 5 */ 6 public void contextInitialized(ServletContextEvent sce) { 7 System.out.println("ServletContextListener初始化"); 8 } 9 10 public void contextDestroyed(ServletContextEvent sce) { 11 System.out.println("ServletContextListener销毁"); 12 } 13 }
其他两个监听器类似,不在重复贴出。
在web.xml中配置
1 2 3 4 study.myListener.ServletContentAttribute_Listener 5 6 7 8 9 study.myListener.HttpSessionAttribute_Listener 10 11 12 13 14 study.myListener.ServletRequestAttribute_Listener 15
运行结果:
2.属性监听:
ServletContentAttribute_Listener.java
1 public class ServletContentAttribute_Listener implements ServletContextAttributeListener{ 2 3 /** 4 * ServletContextAttributeListener实现方法 5 * @param event 6 */ 7 public void attributeAdded(ServletContextAttributeEvent event) { 8 String meg = MessageFormat.format("ServletContent添加属性:{0},属性值:{1}",event.getName(),event.getValue()); 9 System.out.println(meg); 10 } 11 12 public void attributeRemoved(ServletContextAttributeEvent event) { 13 String meg = MessageFormat.format("ServletContent删除属性:{0},属性值:{1}",event.getName(),event.getValue()); 14 System.out.println(meg); 15 } 16 17 public void attributeReplaced(ServletContextAttributeEvent event) { 18 String meg = MessageFormat.format("ServletContent替换属性:{0},属性值:{1}",event.getName(),event.getValue()); 19 System.out.println(meg); 20 } 21 22 }
另外两个监听器类似,不在赘诉。接下来用jsp页面测试
listenerDemo.jsp
1 8 9 10 11监听器设置 12 13 14 36 37
执行结果如下:
注意:其中遇到一个问题:就是在启动tomcat的时候servletcontextListener监听执行了两次,最后删除掉server.xml中 Context 的手动配置,这样就不会加载两次了。
解决思路:http://www.linuxidc.com/Linux/2017-10/147812.htm
:http://www.linuxidc.com/Linux/2017-10/147811.htm