一、概述
监听器用于监听事件,如WEB启动、关闭,session链接、断开,用户请求到达,某某范围类属性值发生改变。
当事件发生时会回调监听器里的方法。
定义监听器需要两个步骤
1、定义Listener实现类。
2、通过Annotation或web.xml文件来配置。
二、监听器类型
按监听的对象划分:servlet2.4规范定义的事件有三种:
1.用于监听应用程序环境对象(ServletContext)的事件监听器
2.用于监听用户会话对象(HttpSession)的事件监听器
3.用于监听请求消息对象(ServletRequest)的事件监听器
按监听的事件类项划分
1.用于监听域对象自身的创建和销毁的事件监听器
2.用于监听域对象中的属性的增加和删除的事件监听器
3.用于监听绑定到HttpSession域中的某个对象的状态的事件监听器
在一个web应用程序的整个运行周期内,web容器会创建和销毁三个重要的对象,ServletContext,HttpSession,ServletRequest。
总共有8个监听器接口和6个Event类,其中HttpSessionAttributeListener与HttpSessionBindingListener皆使用HttpSessionBindingEvent;
HttpSessionListener和HttpSessionActivationListener则都使用HttpSessionEvent;
Listener对应的Event如下所示:
Listener接口 | Event类 | 事件描述 |
ServletContextListener | ServletContextEvent | 监听Web应用启动和关闭 |
ServletContextAttributeListener | ServletContextAttributeEvent | 监听ServletContext范围内(application)的属性值的改变 |
HttpSessionListener | HttpSessionEvent | 监听session的开始与结束 |
HttpSessionActivationListener | ||
HttpSessionAttributeListener | HttpSessionBindingEvent | 监听HttpSession范围内(session)属性的改变 |
HttpSessionBindingListener | ||
ServletRequestListener | ServletRequestEvent | 监听用户请求 |
ServletRequestAttributeListener | ServletRequestAttributeEvent | 监听ServletRequest范围内(request)属性的改变 |
以下为复制
一 ServletContext相关监听接口
补充知识:通过ServletContext 的实例可以存取应用程序的全局对象以及初始化阶段的变量。
在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。
注意:全局对象即Application范围对象,初始化阶段的变量指在web.xml中,经由<context-param>元素所设定的变量,它的范围也是Application范围,例如:
<context-param>
<param-name>Name</param-name>
<param-value>browser</param-value>
</context-param>
当容器启动时,会建立一个Application范围的对象,若要在JSP网页中取得此变量时:
String name = (String)application.getInitParameter("Name");
或者使用EL时:
${initPara.name}
若是在Servlet中,取得Name的值方法:
String name = (String)ServletContext.getInitParameter("Name");
1.ServletContextListener:
用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。
ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。
ServletContextListener接口的方法:
void contextInitialized(ServletContextEvent sce)
通知正在接受的对象,应用程序已经被加载及初始化。
void contextDestroyed(ServletContextEvent sce)
通知正在接受的对象,应用程序已经被载出。
ServletContextEvent中的方法:
ServletContext getServletContext()
取得ServletContext对象
2.ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。
ServletContextAttributeListener接口方法:
void attributeAdded(ServletContextAttributeEvent scab)
若有对象加入Application的范围,通知正在收听的对象
void attributeRemoved(ServletContextAttributeEvent scab)
若有对象从Application的范围移除,通知正在收听的对象
void attributeReplaced(ServletContextAttributeEvent scab)
若在Application的范围中,有对象取代另一个对象时,通知正在收听的对象
ServletContextAttributeEvent中的方法:
java.lang.String getName()
回传属性的名称
java.lang.Object getValue()
回传属性的值
二、HttpSession相关监听接口
1.HttpSessionBindingListener接口
注意:HttpSessionBindingListener接口是唯一不需要再web.xml中设定的Listener
当我们的类实现了HttpSessionBindingListener接口后,只要对象加入Session范围(即调用HttpSession对象的setAttribute方法的时候)或从Session范围中移出(即调用HttpSession对象的removeAttribute方法的时候或Session Time out的时候)时,容器分别会自动调用下列两个方法:
void valueBound(HttpSessionBindingEvent event)
void valueUnbound(HttpSessionBindingEvent event)
思考:如何实现记录网站的客户登录日志, 统计在线人数?
2.HttpSessionAttributeListener接口
HttpSessionAttributeListener监听HttpSession中的属性的操作。
当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。这和ServletContextAttributeListener比较类似。
3.HttpSessionListener接口
HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。
4.HttpSessionActivationListener接口
主要用于同一个Session转移至不同的JVM的情形。
四、ServletRequest监听接口
1.ServletRequestListener接口和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest
2.ServletRequestAttributeListener接口和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest
自己敲了一些
1 <listener> 2 <listener-class>package.class</listener-class> 3 </listener> 4 <!-- 用于xml配置 -->
1 @WebListener 2 public class HttpSessionListenerTest implements HttpSessionListener { 3 //再控制器或页面配合session.invalidate();使用 4 public void sessionCreated(HttpSessionEvent event) { 5 System.out.println("session开始"); 6 } 7 8 public void sessionDestroyed(HttpSessionEvent event) { 9 System.out.println("session结束"); 10 } 11 }
1 @WebListener 2 public class ServletContextAttributeListenerTest implements 3 ServletContextAttributeListener { 4 5 public void attributeAdded(ServletContextAttributeEvent event) { 6 System.out.println(event.getName()); 7 } 8 9 10 public void attributeRemoved(ServletContextAttributeEvent event) { 11 System.out.println(event.getName()); 12 } 13 14 15 public void attributeReplaced(ServletContextAttributeEvent event) { 16 System.out.println(event.getName()); 17 } 18 19 }
1 @WebListener 2 public class ServletContextListenerTest implements ServletContextListener { 3 ServletContext cxt = null; 4 5 public void contextDestroyed(ServletContextEvent event) { 6 System.out.println(cxt.getInitParameter("b")+"结束咯"); 7 } 8 9 public void contextInitialized(ServletContextEvent event) { 10 cxt = event.getServletContext(); 11 System.out.println(cxt.getInitParameter("a")+"开始咯"); 12 System.out.println(cxt.getRealPath("/")); 13 System.out.println(cxt.getServerInfo()); 14 System.out.println(cxt.getServletNames()); 15 System.out.println(cxt.getServletRegistrations()); 16 System.out.println(cxt.getContextPath()); 17 System.out.println(cxt.getMajorVersion()); 18 } 19 20 }
1 @WebListener 2 public class ServletRequestListenerTest implements ServletRequestListener { 3 4 public void requestDestroyed(ServletRequestEvent arg0) { 5 System.out.println("request抵达"); 6 } 7 8 public void requestInitialized(ServletRequestEvent arg0) { 9 System.out.println("request消失"); 10 } 11 12 }