java 监听器

java 监听器

文章来源:whuan博客

监听器的作用是监听Web应用程序中某一个对象,监听客户端的处理动作,然后做出相应的处理。

       Java Web应用程序中,Servlet容器提供了多种监听器的接口,使用的时候根据需求选择特定的接口实现就行。这些接口都是继承的java.util包中的EventListener接口。

      

        可以看出,监听器的种类确实很多。

        常用的有:

        (1)request对象的监听ServletRequestAttributeListener和ServletRequestListener

             ServletRequestListener用于监听用户请求的创建和销毁。

             ServletRequestAttributeListener则用于监听ServletRequest(request)范围内属性的变化,实现该接口的监听器需要实现attributeAdded、attributeRemoved、attributeReplaced三个方法,分别监听Request的增加,删除和修改。

 

        (2)Session对象的监听:HttpSessionAttributeListener和HttpSessionListener  

             HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发sessionCreated(SessionEvent se)方法;当销毁一个 Session时,激发sessionDestroyed (HttpSessionEvent se)方法。
             HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发 attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发 attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发 attributeReplaced(HttpSessionBindingEvent se) 方法。

 

        (3)ServletContext对象的监听:ServletContextAttributeListener和ServletContextListener。

                       

 

         ServletContextAttributeListener监听对ServletContext属性的操作,比如增加/删除/修改    

         ServletContextListener监听ServletContext,当创建ServletContext时,激发 contextInitialized                    (ServletContextEvent sce)方法;当销毁ServletContext时,激发 contextDestroyed(ServletContextEvent sce)方法。   

   

        由此可见,ServletRequestAttributeListener,ServletContextAttributeListener和HttpSessionAttributeListener的作用相似,都用于监听属性的改变,只是ServletRequestAttributeListener监听request范围内属性的改变,而ServletContextAttributeListener监听的是application范围内属性的改变而HttpSessionAttributeListener监听Session的改变。

        如果需要监听多个范围,可以创建多个实现不同接口的监听器,也可以采用一个监听器类来监听多种事件,只要让该监听器实现类同时实现多个监听器接口。

        监听类写了之后,还需要在web.xml中进行配置,让程序知道监听器的存在后才可以使用。 监听器不需要像Filter那样配置Mapping,因为每个监听器监听的内容是特定的。只需配置监听器路径即可。

 

       代码演示:web.xml <listener>      

  1. <span style="font-family:Microsoft YaHei;font-size:18px;"><listener>  
  2.     <listener-class>  
  3.            com.wh.drp.util.listener.TestHttpSessionAttributeListener  
  4.     </listener-class>  
  5. </listener>  
  6. <listener>  
  7.     <listener-class>  
  8.            com.wh.drp.util.listener.TestHttpSessionListener  
  9.     </listener-class>  
  10. </listener></span>  


       使用监听器非常方便,监听器自动触发,可以帮我们做很多事。监听器可以监听服务器端和客户端的状态变化,在变化是调用相应的Listener,这种机制可以称为回调机制。我觉得非常类似数据库里的触发器,都是自动触发,功能强大,使用方便。

       最后看一个使用Session监听器统计登录人数的例子。

      

  1. package com.wh.drp.util.listener;  
  2.   
  3. import javax.servlet.http.HttpSessionAttributeListener;  
  4. import javax.servlet.http.HttpSessionBindingEvent;  
  5.   
  6. public class TestHttpSessionAttributeListener implements  
  7.         HttpSessionAttributeListener {  
  8.   
  9.   
  10.   
  11.        //在Session增加的时候触发      
  12.     public void attributeAdded(HttpSessionBindingEvent se) {  
  13.         System.out.println("TestHttpSessionAttributeListener-->>>attributeAdded()");  
  14.         //判断是否是记录用户的Session  
  15.              if ("userinfo".equals(se.getName())) {  
  16.                    //取出Context中的记录数    
  17.   
  18.   
  19.                 Integer count = (Integer)se.getSession().getServletContext().getAttribute("count");  
  20.             //如果Context中没有count对象  
  21.                    if (count == null) {  
  22.                 count = 1;  
  23.   
  24.   
  25.             }else {  
  26.                 count++;  
  27.             }  
  28.                    //将记录数count重新写入到ServletContext中,其他需要该人数的地方可以在ServletContext中通过getServletContext().getAttribute("count")获得了count的具体值                    
  29.         se.getSession().getServletContext().setAttribute("count", count);  
  30.             }  
  31.         }  
  32.   
  33.     public void attributeRemoved(HttpSessionBindingEvent se) {               
  34.         System.out.println("TestHttpSessionAttributeListener-->>>attributeRemoved()");  
  35.     }  
  36.   
  37.     public void attributeReplaced(HttpSessionBindingEvent se) {  
  38.         System.out.println("TestHttpSessionAttributeListener-->>>attributeReplaced()");  
  39.     }  
  40.   
  41. }  

然后在web.xml中配置

  1. <listener>   
  2.       <listener-class>   
  3.          com.wh.drp.util.listener.TestHttpSessionAttributeListener   
  4.       </listener-class>  
  5. </listener>  


       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值