在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象。
Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型。
监听三个域对象创建和销毁的事件监听器
监听域对象中属性的增加和删除的事件监听器
监听绑定到 HttpSession 域中的某个对象的状态的事件监听器。(查看API文档)
(1)ServletContextListener
监听servletContext域对象创建和销毁
ServletContextListener 接口用于监听 ServletContext 对象的创建和销毁事件。
当 ServletContext 对象被创建时,激发contextInitialized (ServletContextEvent sce)方法
当 ServletContext 对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。
servletContext域对象何时创建和销毁:
创建:服务器启动针对每一个web应用创建servletcontext
销毁:服务器关闭前先关闭代表每一个web应用的servletContext
实例: 当我们系统使用spring框架时,我们要获取bean,在controller里可以通过配置文件直接注入,但是在公共方法(**Utils)里想要获取Service类或DaoImpl实例,
基本上都要先得到WebApplicationContext对象,要获取WebApplicationContext对象基本上都先要获取ServletContext,
一般情况下在公共类里不方面获取ServletContext,要使用 WebApplicationContext非常的不方面,这时,我们可以自定义一个ServletContextListener ,
在创建ServletContext时,创建一个WebApplicationContext,
然后作为静态变量缓存在公共方法里,用的时候随时都能得到,代码如下:
public class SystemContextListener implements ServletContextListener { /** * 获取一个context * @param servletContextEvent */ @Override public void contextInitialized(ServletContextEvent servletContextEvent) { ServletCommonUtils.setContext(WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext())); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } }
在web.xml配置监听器:
<!-- 自定义监听器,用来获取spring的WebApplicationContext --> <listener> <listener-class>com.intel.store.listener.SystemContextListener</listener-class> </listener>
缓存在公用方法中:
public class ServletCommonUtils { private static WebApplicationContext context; private static Logger logger = LoggerFactory.getLogger(ServletCommonUtils.class); public static WebApplicationContext getContext() { return context; } public static void setContext(WebApplicationContext context) { ServletCommonUtils.context = context; } }
(2)HttpSessionListener
监听HttpSession域对象创建和销毁
HttpSessionListener接口用于监听HttpSession创建和销毁
创建一个Session时,sessionCreated(HttpSessionEvent se) 方法将会被调用。
销毁一个Session时,sessionDestroyed (HttpSessionEvent se) 方法将会被调用。
Session域对象创建和销毁的时机创建:用户每一次访问时,服务器创建session
销毁:如果用户的session 30分钟没有使用,服务器就会销毁session,我们在web.xml里面也可以配置session失效时间
经典案例就是统计在线人数(需要在web.xml中配置,此处省略,同上):
public class SystemSessionListener implements HttpSessionListener { private static long onlineCounter = 0l; @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { onlineCounter++; } @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { onlineCounter--; } public static long getOnlineCounter() { return onlineCounter; } }
(3)ServletRequestListener
servletRequest域对象创建和销毁的时机:
创建:用户每一次访问,都会创建一个reqeust
销毁:当前访问结束,request对象就会销毁
(4)监听ServletContext, HttpSession, HttpServletRequest对象变化的监听器
监听三个域对象属性变化
Servlet规范定义了监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。
这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener ServletRequestAttributeListener
这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。
(5)还有一些不常用的监听器:HttpSessionBindingListener, HttpSessionBindingListener 可以参考(http://bbs.csdn.net/topics/190164471)