一、listener
1.概述
- 当web 应用在web容器中运行时,应用内部会不断的发生各种事件:如web应用被启动、应用停止,用户session的开始、结束,用户请求的到达等。通常来说,这些web 事件对开发者这透明的。listener可以监听这些web应用的内部事件,从而允许当事件触发时回调监听器内的方法。
- Servlet 2.3 规范以后加入了listener,用于监听web 应用中的事件,并根据需求作出适当的响应
- 根据监听对象不同,可将Listener分为三类:
1.监听ServletContext
2.监听Session
3.监听Request - 使用Listener 只需要两个步骤:1.定义Listener实现类 2. 配置Listener实现类
2. ServletContext监听器
Servlet上下文监听器有两个:ServletContextListener、ServletContextAttributeListener
1.ServletContextListener
用于监听web应用的启动和关闭,对应的事件类为ServletContextEvent。该接口提供了2个方法:
- contextInitialized(ServletContextEvent event)方法:启动web应用时(ServletContext对象创建时)调用此方法进行处理
contextDestroyed(ServletContextEvent event)方法:当ServletContext对象销毁时(关闭web容器或重新加载应用),调用此方法进行处理
上述两个方法都需要一个ServletContextEvent类型的参数,该类只有一个方法,即ServletContext getServletContext()来获得ServletContext对象
2.ServletContextAttributeListener 该接口用于监听ServletContext(application范围)内属性的变化。事件类:ServletContextAttributeEvent,该接口提供了3个方法:
- void attributeAdded(ServletContextAttributeEvent event ):当ServletContext中增加一个属性时,将会调用此方法处理
- void attributeRemoved(ServletContextAttributeEvent event ):当ServletContext中删除一个属性时,将会调用此方法处理
- void attributeReplaced(ServletContextAttributeEvent event ):当ServletContext中修改一个属性时,将会调用此方法处理
3. Session监听
针对Session会话的监听器有4个:
1.HttpSessionListener
该接口用于监听HTTP会话的创建和销毁,共两个方法:
- sessionCreate(HttpSessionEvent event):当一个HttpSession对象被创建时,调用方法处理
- sessionDestroyed(HttpSessionEvent event) :当一个HttpSession超时,或销毁时 调用方法处理
- 这两个方法的参数都是HttpSessionEvent,该类的getSession()方法返回当前创建的Session对象
2.HttpSessionAttributeListener
监听HttpSession (session范围)中属性的变化,事件类HttpSessionBindingEvent,该接口提供三个方法
- attributeAdded(HttpSessionBindingEvent event ):当Session中增加一个属性时,将会调用此方法处理
- attributeRemoved(HttpSessionBindingEvent event ):当Session中删除一个属性时,将会调用此方法处理
- attributeReplaced(HttpSessionBindingEvent event ):当Session中修改一个属性时,将会调用此方法处理
- HttpSessionBindingEvent有三个常用方法:getName()、getValue()、getSession()
3.HttpSessionActivationListener
该接口用于监听HTTP会话的有效(active)、无效(passivate)情况,该接口提供两个方法:
- sessionDidActivate(HttpSessionEvent event ) : 当session变为有效状态时,调用此方法处理
- sessionWillPassivate(HttpSessionEvent event) : 当session变为无效状态时,调用此方法处理
4.HttpSessionBindingListener
该接口用于监听HTTP会话中,对象的绑定信息,它是唯一不需要在web.xml中配置的listener,2个方法:
- valueBound(HttpSessionBindingEvent event ) : 当有对象加入到Session中,自动调用,处理
- valueUnBound(HttpSessionBindingEvent event) : 当有对象从Session中移除时,自动调用、处理
Request监听
利用该类监听器可以监听用户的请求,有两个监听器:
1.ServletRequestListener接口:
可以方便地监听请求的创建和销毁,可以通过实现该监听器来监听每个请求,实现系统日志;该接口提供两个方法:
- requestInitialized(ServletRequestEvent event ) : 当request创建时调用
- requestDestroyed(ServletRequestEvent event) : 当Request销毁时调用
ServletRequestEvent 事件类常用方法 getServletRequest()
2.ServletRequestAttributeListener:
监听ServletRequest (request范围)中属性的变化,提供3个方法:attributeAdded(ServletRequestAttributeEvent event ):当Request 中增加一个属性时,将会调用此方法处理
- attributeRemoved(ServletRequestAttributeEvent event):当Request 中删除一个属性时,将会调用此方法处理
- attributeReplaced(ServletRequestAttributeEvent event ):当Request 中修改一个属性时,将会调用此方法处理
- ServletRequestAttributeEvent类常用方法:getName()、getValue()
实现Listener
以实现ServletRequestListener为例:
//可以采用一个监听器类实现多个监听器接口,来监听多种事件
@WebListener
public class RequestListener implements ServletRequestListener, ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
ServletRequest request = arg0.getServletRequest();
String name= arg0.getName();
Object value = arg0.getValue();
System.out.println(request+"范围添加了名为"+name+"值为"+value+"的属性!");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
ServletRequest request = arg0.getServletRequest();
String name= arg0.getName();
Object value = arg0.getValue();
System.out.println(request+"范围remove了名为"+name+"值为"+value+"的属性!");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
ServletRequest request = arg0.getServletRequest();
String name= arg0.getName();
Object value = arg0.getValue();
System.out.println(request+"范围replace了名为"+name+"值为"+value+"的属性!");
}
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest)arg0.getServletRequest();
System.out.println("----发向"+request.getRequestURI()+"的请求被销毁!");
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest)arg0.getServletRequest();
System.out.println("----发向"+request.getRequestURI()+"的请求被初始化!");
}
}
配置Listener
配置Listener只需要向web应用注册Listener实现类即可,无须配置参数之类
- web.xml中配置
<listener>
<listener-class>com.test.RequestListener</listener-class>
</listener>
<!-- Listener配置信息必须在Filter和Servlet配置之前,Listener的初始化(ServletContentListener初始化)比Servlet和Filter都优先,而销毁比Servlet和Filter都慢 -->
- @WebListener 修饰Listener实现类