监听器

 


监听器:监听器就是一个java程序,功能是监听另一个java对象变化(方法调用、属性变更)

Servlet规范定义三门技术之一 Servlet、监听器、过滤器

   javaee提供了八种监听器,分为了三类:
    
  第一类:监听三个数据范围对象(request、session、ServletContext)的创建和销毁监听器 
  第二类:监听三个数据范围对象中属性变更(增加、替换、删除)的监听器
  第三类:监听HttpSession中对象状态改变(被绑定、解除绑定、钝化、活化)的监听器
 
 
 编写监听器步骤:
   

1) 编写类 ,实现特定监听器接口 

2) Servlet监听器,不是注册在事件源上,而是注册在web.xml 中,由容器tomcat完成监听器注册 
   
       <!-- 注册监听器 , tomcat将监听器注册给事件源, 事件源操作后,会自动监听器执行 -->
       <!-- 和Servlet Filter不同,不需要配置url -->
       <listener>
            <listener-class>cn.web.listener.MyServletContextListener</listener-class>
       </listener>


 =======================================================================================================
    
    1.用来监听三大作用域创建和销毁的监听器

 1. --ServletContextListener监听ServletContex域创建和销毁的监听器 


            void contextInitialized(ServletContextEvent sce) ---- 监听Context对象创建 
            void contextDestroyed(ServletContextEvent sce)  ----- 监听Context对象的销毁

         生命周期:
                web应用加载后立即创建代表当前web应用的ServletContext对象,此对象一直驻留在内存中。
                web应用被移除出容器或服务器关闭时,随着应用的销毁代表应用的ServletContext销毁。
                                 
         应用:
            1) 保存全局范围对象,因为监听ServletContext对象,监听器都可以通过事件对象获得事件源  
                     // 获得被监听事件源对象
                      ServletContext context = sce.getServletContext();
            2) 读取框架配置文件 例如: spring框架 org.springframework.web.context.ContextLoaderListener 
            3) 在ServletContextListener 定义一些定时器程序 (任务调度程序)
            
          

 最简单java中任务调度 ----- 定时器Timer 和 TimerTask的使用
            Timer启动定时器任务

            void schedule(TimerTask task, Date firstTime, long period)  ------- 指定启动任务第一次时间,通过period参数指定任务重              复执行     

            void schedule(TimerTask task, long delay, long period) ----- 指定任务距离当前时间delay 多久开始启动,通过period指定             任务重复执行 
            
           终止定时器任务执行 timer.cancel(); 

                
  

 2. --HttpSessionListener:监听session域创建和销毁的监听器


      void sessionCreated(HttpSessionEvent se)  ----- 监听Session对象创建
      void sessionDestroyed(HttpSessionEvent se)  ---- 监听Session对象销毁

            
        生命周期:
             第一次调用request.getSession时创建出session
             超过30分钟没人使用就销毁,调用invalidate方法自杀,服务器非正常关闭时销毁。正常关闭时会钝化,下次正常启动时                会活化。
             想要随着session被钝化或活化的对象必须去实现Serializable接口。
                
             
        Session对象何时创建 : request.getSession()   第一次执行时 创建Session对象 
        * 访问JSP时,因为其内置对象session,所以一定会创建Session对象的 
        
        Session对象何时销毁 : 1) 不正常关闭服务器 2) Session对象过期 3) invalidate方法调用
        * 正常关闭服务器时,Session的数据保存tomcat/work目录下  --- 产生 SESSIONS.ser 
        * session的过期时间在web.xml 进行配置 
          <session-config>
              <!-- 单位是分钟,连续30分钟没有使用该Session对象,就会销毁对象 -->
              <session-timeout>30</session-timeout>
          </session-config>
        
        
    3. --ServletRequestListener :监听request域创建和销毁的监听器
          

          void requestDestroyed(ServletRequestEvent sre)   ----- 监听request对象销毁的
          void requestInitialized(ServletRequestEvent sre)  ---- 监听request对象创建的

           生命周期:
                请求开始,服务器创建代表请求的request
                请求结束,服务器销毁request
      
                每次客户端发起一次新的请求 产生request对象,当response响应结束后,request对象进行销毁 
                
                forward不会产生新的request对象,sendRedirect产生新的request对象 
                
                监听器案例:
                案例一: 统计当前在线人数 
                分析:统计Session 的个数 ,存在一个Session,意味着一个浏览器在访问 
                
                案例二: 自定义session定时扫描器(销毁session对象)
                编写定时器程序,定时去扫描系统中所有Session对象,发现如果一个Session ,1 分钟没有使用了,就销毁该Session对象 

==========================================================================================
  

 2.用来监听三大作用域中域属性变化的监听器
    
        --ServletContextAttributeListener
        --HttpSessionAttributeListener 
         --ServletRequestAttributeListener
                
            1、attributeAdded  属性添加方法 
            public void attributeAdded(ServletContextAttributeEvent scae) 
            public void attributeAdded (HttpSessionBindingEvent  hsbe) 
            public void attributeAdded(ServletRequestAttributeEvent srae)
            
            2、attributeRemoved  属性移除方法
            public void attributeRemoved(ServletContextAttributeEvent scae) 
            public void attributeRemoved (HttpSessionBindingEvent  hsbe) 
            public void attributeRemoved (ServletRequestAttributeEvent srae)
            
            3、attributeReplaced  属性替换方法
            public void attributeReplaced(ServletContextAttributeEvent scae) 
            public void attributeReplaced (HttpSessionBindingEvent  hsbe) 
            public void attributeReplaced (ServletRequestAttributeEvent srae)
            
            

何时调用attributeAdded 、attributeRemoved  、attributeReplaced  ? 
            以HttpSessionAttributeListener为例 
                    // 向session中添加了一个属性
                session.setAttribute("name","张三")  // 因为name属性还不存在 --- attributeAdded
            
                // 向Session保存属性name的值李四,因为name属性已经存在,替换效果
                session.setAttribute("name","李四")  // 因为name属性以及存在 --- attributeReplaced
                
                // 移除session的属性name
                session.removeAttribute("name")  // 移除name属性 ---- attributeRemoved
            
            ****** 如果执行session.invalidate()   销毁了Session 导致Session中所有属性被移除 

=======================================================================================================

  

 3.使javabean感知自己在session域中状态变化的监听器
        这两个监听器不需要在web.xml中进行注册,只要让javabean去实现这个接口就可以了
        
        Session中对象共有四种状态
            1.绑定 ----- 对象被添加到Session中
            2.解除绑定 ----- 对象从Session中移除 
            3.钝化 ----- Session中数据被序列化到硬盘上 
            4.活化 ----- Session序列化数据 从硬盘被加载回内存 


    --HttpSessionBindingListener
            javabean被存入session
            javabean被移除出session

  --HttpSessionActivationListener
            javabean随着session被钝化
            javabean随着session被活化
    
    
如果tomcat正常关闭,Session中对象会被序列化到硬盘上 ---- java对象如果能被序列化必须实现Serializable接口 
异常 :IOException while loading persisted sessions: java.io.WriteAbortedException: writing aborted; 
       java.io.NotSerializableException: cn.itcast.bean.Bean2
原因 :恢复Session.ser文件时,因为需要对象无法从文件中加载,发生异常 (删除Session.ser就可以了 )
* 保存到Session中对象,应该被序列化 

在Session中数据对象,保存了一段时间后没有使用,不想删除对象中数据,(在不关闭服务器情况下)可以让对象数据进行钝化 ---- 序列化到硬盘上 
下次再访问数据时,从钝化的文件中读取序列化数据 ----- 对数据进行活化 
* 由tomcat完成钝化和活化,配置<Context> 标签 


配置Context标签有三个常用位置
1) tomcat/conf/context.xml 所有虚拟主机、所有web应用都可以使用配置
2) tomcat/conf/Catalina/localhost/context.xml 当前虚拟主机 所有web应用都可以使用配置
3) 当前工程/META-INF/context.xml  只对当前工程有效 

配置钝化目录在tomcat/work 下 ---- 和Session默认保存位置一样 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值