1,Listener是Servlet规范的高级特性。Listener应用于监听Java Web程序中的事件,例如创建,修改,删除 Session,request,context等,并用于触发相应的事件。利用Listener能够用很少的代码实现很绚丽的效果。
2,目前Servlet 2.5规范中有8种Listener,分别对应不同事件的监听。
以下3种监听用于监听session,context,request的创建与销毁。
- HttpSessionListener :监听Session的创建与销毁,创建Session时执行sessionCreated(HttpSessionEvent se) 方法,超时或者执行session.invalidate()时执行 sessionDestroyed(HttpSessionEvent se)方法。该Listeren可用于收集在线者的信息等。
- ServletContextListener:监听context的创建与销毁。context代表当前的web应用程序。服务器启动或者热部署war包时执行contextInitialized(ServletContextEvent event)方法。服务器关闭时或只关闭该web时会执行contextDestroyed(ServletContextEvent event)方法。该Listener可用于启动时获取web.xml里配置的初始化参数。
- ServletRequestListener:监听request的创建与销毁。用户每次请求request都会执行requestInitialized(ServletRequestListener event)方法。request处理完毕自动销毁前执行requestDestoryed(ServletRequestListener event)方法。注意的是,如果一个HTML页面内含有多个图片,则请求一次HTML页面可能会触发多次request事件。
以下3种监听用于监听session,context,request的属性变化,接口名称为xxxAttributeListener。
- 包括 HttpSessionAttributeListener,ServletContextAttributeListener,ServletRequestAttributeListener。当向被监听对象中添加,更新,移除属性时,会分别执行xxAdded(),xxReplaced(),xxRemoved()方法。xx分别代表Session,context,request
以下2种监听用于监听session内的对象,分别是HttpSessionBindingListener与HttpSessionActivationListener。触发机制如下
- HttpSessionBindingListener:当对象被放入session里时执行valueBound(HttpSessionBindingEvent event)方法。当对象被从session里移除时执行valueUnbound(HttpSessionBindingEvent event)方法。对象必须实现该Listener。
- HttpSessionActivationListener:服务器关闭时,会将Session里的内容进行保存到硬盘上这个过程叫钝化。服务器重新启动时,会将session内容从硬盘上重新加载。当session里的对象被钝化时会执行sessionWillPassivate(HttpSessionEvent se)方法,当对象被重新加载时会执行sessionDidActivate(HttpSessionEvent se)对象必须实现该Listener接口
ps : !!!注意 由于监听session内对象不同于以上6种监听,所以不需要在web.xml中进行配置。
3,使用Listener需要在web.xml中进行配置。
<listener>
<listener-class>com.demo.biz.Test</listener-class>
</listener>
并且需要在Test.java类中集成Listener接口,下面的例子仅仅是在项目启动时输出“启动时进行监听!”
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class Test implements ServletContextListener{
/* (non-Javadoc)
* @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
*/
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
*/
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("启动时进行监听!-------------------------------------------------------------------------------------------");
}
}
注意:一个完整的Listener包括Listener类,<listener>配置,在一个web.xml中可以配置多个Listener,同一种类型的Listener也可以配置多个,触发的时候服务器会顺序执行各个Listener的相应方法。