Listerner:监听器,可以监听对象的创建、删除、属性绑定、属性删除、属性修改等,最常用的就是用来实现在线用户的统计
在Servlet中一共有8种监听器,可监听ServletContext、HttpSession、ServletRequest(不是HttpSerlvetRequest),按监听的域不同可分为3类:
1. 域对象的创建与销毁
ServletContextListener:
contextInitialized():ServletContext容器初始化
contextDestroyed():ServletContext容器销毁
HttpSessionListener:
sessionCreated():session的创建
sessionDestroyed():session的销毁
ServletRequestListener:
requestInitialized():request的初始化
requestDestroyed():request的销毁
2. 域对象中属性的创建、修改、销毁
ServletContextAttributeListener:
HttpSessionAttributeListener
ServletRequestAttributeListener
这三个监听器都有三个方法:
attributeAdded() 添加属性
attributeRemoved() 移出属性
attributeReplaced() 替换属性
3. 感知型监听器:监听对象合时绑定到session,合时从session移除,合时序列化以及合时被存储到硬盘上
HttpSessionBindngListener:
valueBound():对象被绑定到Session
valueUnbound():对象被移出Session
HttpSessionActivationListener:
sessionDidActivate():对象激活
sessionWillPassivate():对象钝化
1、2两类监听器在创建时必须实现对应的接口,然后再web.xml中进行注册
实例:
/** * 实现了对SerlvetRequest生命周期和绑定在上面的属性的监听,也可以单独实现一个接口 */ public class RequestHelpListener implements ServletRequestListener,ServletRequestAttributeListener { /** * 销毁请求 */ @Override public void requestDestroyed(ServletRequestEvent sre) { StringUtils.println("销毁ServletRequest"); } /** * 初始化请求 */ @Override public void requestInitialized(ServletRequestEvent sre) { StringUtils.println("创建ServletRequest"); } /** * 添加属性 */ @Override public void attributeAdded(ServletRequestAttributeEvent srae) { StringUtils.println("向ServletContext添加属性"); } /** * 移除属性 */ @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { StringUtils.println("向ServletRequest移除属性"); } /** * 替换属性 */ @Override public void attributeReplaced(ServletRequestAttributeEvent srae) { StringUtils.println("向ServletRequest替换属性"); } }
注册:
<listener> <description>监听ServeltRequest的创建、销毁,属性绑定、移出和修改</description> <display-name>ServeltRequest监听器</display-name> <listener-class>framework.web.listener.RequestHelpListener</listener-class> </listener>
3类监听比较特别,如果需要监听某个对象合适被绑定在session上,只需要使该对象实现HttpSessionBindingListener即可,不需要在web.xml中注册
public class UserVO implements Serializable, HttpSessionBindingListener, HttpSessionActivationListener { /** * 对象被绑定到Session */ @Override public void valueBound(HttpSessionBindingEvent event) { StringUtils.println("绑定UserVO"); } /** * 对象被移出Session */ @Override public void valueUnbound(HttpSessionBindingEvent event) { StringUtils.println("移除UserVO"); } /** * 对象激活 */ @Override public void sessionDidActivate(HttpSessionEvent se) { StringUtils.println("激活UserVO"); } /** * 对象钝化 */ @Override public void sessionWillPassivate(HttpSessionEvent se) { StringUtils.println("钝化UserVO"); } }
(HttpSessionActivationListener我并不太懂,查了一下,应该是在分布式系统中使用的,当把某个session从一个jvm中移动到另一个jvm中时,需要先钝化保存这个session,再序列化到jvm中)