Servlet事件监听

来源:互联网 发布:php三级分销数据库设计 编辑:程序博客网 时间:2024/05/19 11:50

1、ServletContextListener

     此事件是监听servlet容器的上下文创建和销毁的事件

     contextInitialized(ServletContextEvent)在servlet容器创建成功后调用,初始化一些全局servlte变量等。

     ServletContextEvent。getServletContext()得到一个上下文对象

     contextDestroyed(ServletContextEvent)

      servlet容器被销毁的时候调用。如在tomcat运行之后,删除项目。就会被调用。

2、属性改变事件  

ServletContextAttributeListener

HttpSessionAttributeListener

ServletRequestAttributeListener

      此事件是在ServletContext的setAttribute和removeAttribute方法调用时候触发。

       attributeAdded(ServletContextAttributeEvent event)

             属性添加的时候调用

       attributeRemoved(ServletContextAttributeEvent event)

             属性删除的时候调用

       attributeReplaced(ServletContextAttributeEvent event)

             属性重置的时候调用

             ServletContextAttributeEvent。 getName() 和getValue()得到对应的值

       HttpSessionAttributeListener  

此事件是在Session当前会话的setAttribute和removeAttribute方法调用时候触发。

             HttpSessionBindingEvent。 getName() 和getValue()得到对应的值

       ServletRequestAttributeListener   

此事件是在当前请求阶段的setAttribute和removeAttribute方法调用时候触发。

             ServletRequestAttributeEvent。 getName() 和getValue()得到对应的值

3、HttpSessionListener

       此事件是监听session会话的创建和销毁的

       sessionCreated(HttpSessionEvent se)

            当用浏览器第一次访问创建一个会话的时候就调用

       sessionDestroyed(HttpSessionEvent se)

        当会话被销毁的时候调用

        销毁的方式有两种:

         HttpSession。invalidate()调用就直接过期。在web。xml中配置过期时间

        <session-config>  
        <session-timeout>1</session-timeout>  分钟为单位
        </session-config>

        HttpSessionEvent。getSession()

可以得到一个HttpSession,HttpSession。getid()可以得到一个当前会话的唯一标识

       应用场景:可以在用户做登出或者登入的时候做个记录。

4、HttpSessionIdListener  

         tomact7只支持到3.0,这个是3.1的api 要到tomcat8.0才能;

5、HttpSessionActivationListener

当会话进入活化和钝化的事件监听

       sessionWillPassivate(HttpSessionEvent se)         

活化的时候调用

       sessionDidActivate(HttpSessionEvent se)

           钝化的时候调用

         应用场景:是在于当服务器重启的时候,正好用户在购物的时候,为了重启成功后还能有用户的会话。

         5.1

            建立一个类,实现HttpSessionActivationListener 和Serializable。然后不用注册事件。

         5.2

            session.setAttribute("p", 设置上面的新建的类);

         5.3

          配置

                5.3.1 context。xml中配置

                        <Context>

    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Manager className="org.apache.catalina.session.PersistentManager"
        debug="0"

saveOnRestart="true"

maxActiveSession="-1"  

maxActiveSessions-可处于活动状态的session数,default -1 不限制

minIdleSwap="-1"
 maxIdleSwap="-1"

minIdleSwap/maxIdleSwapsession处于不活动状态最短/长时间(s)sesson对象转移到File Store中;(1表示没有限制)

maxIdleBackup="-1"

maxIdleBackup超过这一时间,将session备份。(1表示没有限制)

>
        <Store className="org.apache.catalina.session.FileStore"

directory-文件存储位置  默认:work\Catalina\host name\web app\session\文件名.session

            directory="e:/see"

>
        </Store>
    </Manager>
</Context>

  在这里配置会报错,在活化的时候,过了一段时间会出现新建类找不到。但是不影响使用,可能是全部上下文都被适应的问题

     5.3.2 server.xml中

  <Context path="/sessionActivationWeb"    docBase="F:\myeclipse\javaweb\apache-tomcat-7.0.79-src\output\build\webapps\web4">     <Manager className="org.apache.catalina.session.PersistentManager"        debug="0" saveOnRestart="true" maxActiveSession="-1" minIdleSwap="-1"        maxIdleSwap="-1" maxIdleBackup="-1">        <Store className="org.apache.catalina.session.FileStore"            directory="e:/see">        </Store>    </Manager></Context>
   这样子是最正确的形式

效果是:

    你运行之后,浏览器访问。记录会话,然后停止tomcat,会钝化sessionDidActivate 这里可以保存会话信息。并且在dir中生成会话.seesion文件。重启之后会活化调用sessionWillPassivate()在这里可以重新恢复用户数据。实际上如果在tomcat配置PersistentManager,本身他就会去保存会话,但是不保存数据。只要没有关闭浏览器,就还是一个会话的。关闭了可以在url后面加上;jseesionid=就可以又是同一个会话。这功能貌似是在集群的时候比较有用

6  HttpSessionBindingListener

      此事件是在session绑定和解绑的时候调用。它不用配置到web。xml进行事件监听。只需要在session。setAttribute()设置它。

       valueBound

        session。setAttribute()时候立即调用

       valueUnbound

        session。setAttribute()替换,session。removeAttribute(),session。invalidate(),session过期这四种情况会调用


7 ServletRequestListener

   再一次请求的事件监听,需要注册

   requestDestroyed(ServletRequestEvent sre)

      请求结束的时候调用

    requestInitialized(ServletRequestEvent sre)
     请求前调用