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中)