Servlet 监听器 及实例

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

你可能感兴趣的:(spring,servlet,监听器,实例)