web中的listener 用作 应用 详解

在使用web.xml配置文件的时候,会问listener起什么作用的? 
Listener是一种监听的方式,我们可以把自定义的监听程序配置在web.xml文件中。Listener支持Servlet2.3或者2.4的版本,dtd定义的版本也必须是2.3或者2.4。 
例如我们在web.xml文件中可以如此配置: 
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>  
  2. <!DOCTYPE web-app PUBLIC  
  3.     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  4.     "http://java.sun.com/dtd/web-app_2_3.dtd">  
  5.      
  6. <web-app>  
  7.   <display-name>Struts Examples</display-name>  
  8.    
  9.   <listener>  
  10.       <listener-class>demo.listener.ContextLoader  
  11.       </listener-class>  
  12.   </listener>  
  13.   ... rest of web.xml  

在每一个java的web应用中都只能又一个单独的servlet context。而这个context被放置在整个应用级别上,当应用一旦启动之后,servlet容器就会创建这样一个servlet context来服务于web应用。因此我们也可以创建一个类并实现了一个ServletContextListerner接口,用于通知这个context是否被创建了或者被销毁了。这样当Context被创建时,就会收到一个相关的通知,并且在Context被销毁前也会得到一个通知。 
由于工作需要,最近在找一些解决方案,发现Listener是一个很好的东西, 能够监听到session,application的create,destroy,可以监听到session,application 属性绑定的变化,考虑了一下,可以应用在"在线人数统计","数据缓存"等各个方面, 
下面是整理的一些资料. 
Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时,就激发sessionCreated(HttpSessionEvent se)方法,这样就可以给在线人数加1。常用的监听接口有以下几个: 
  • ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。
  • ServletContextListener监听ServletContext。当创建ServletContext时,激发contextInitialized(ServletContextEvent sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。
  • HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。
  • HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。

下面我们开发一个具体的例子,这个监听器能够统计在线的人数。在ServletContext初始化和销毁时,在服务器控制台打印对应的信息。当ServletContext里的属性增加、改变、删除时,在服务器控制台打印对应的信息。 
要获得以上的功能,监听器必须实现以下3个接口: 
  • HttpSessionListener
  • ServletContextListener
  • ServletContextAttributeListener

我们看具体的代码,见示例14-9。 


Java代码   收藏代码
  1. import javax.servlet.http.*;  
  2. import javax.servlet.*;  
  3.   
  4. public class OnLineCountListener implements HttpSessionListener,  
  5. ervletContextListener,ServletContextAttributeListener  
  6. {  
  7.  private int count;  
  8.  private ServletContext context = null;  
  9.    
  10.  public OnLineCountListener()  
  11.  {  
  12.   count=0;  
  13.   //setContext();  
  14.  }  
  15.  //创建一个session时激发  
  16.  public void sessionCreated(HttpSessionEvent se)  
  17.  {  
  18.   count++;  
  19.   setContext(se);  
  20.     
  21.  }  
  22.  //当一个session失效时激发  
  23.  public void sessionDestroyed(HttpSessionEvent se)  
  24.  {  
  25.   count--;  
  26.   setContext(se);  
  27.  }  
  28.  //设置context的属性,它将激发attributeReplaced或attributeAdded方法  
  29.  public void setContext(HttpSessionEvent se)  
  30.  {  
  31.   se.getSession().getServletContext().setAttribute("onLine",new Integer(count));  
  32.  }  
  33.   //增加一个新的属性时激发  
  34.  public void attributeAdded(ServletContextAttributeEvent event) {  
  35.   
  36.  log("attributeAdded('" + event.getName() + "', '" +  
  37.      event.getValue() + "')");  
  38.   
  39.     }  
  40.      
  41.    //删除一个新的属性时激发  
  42.     public void attributeRemoved(ServletContextAttributeEvent event) {  
  43.   
  44.  log("attributeRemoved('" + event.getName() + "', '" +  
  45.      event.getValue() + "')");  
  46.   
  47.     }  
  48.   
  49.  //属性被替代时激发  
  50.     public void attributeReplaced(ServletContextAttributeEvent event) {  
  51.   
  52.   log("attributeReplaced('" + event.getName() + "', '" +  
  53.       event.getValue() + "')");  
  54.     }  
  55.     //context删除时激发  
  56.      public void contextDestroyed(ServletContextEvent event) {  
  57.   
  58.   log("contextDestroyed()");  
  59.   this.context = null;  
  60.   
  61.     }  
  62.   
  63.     //context初始化时激发  
  64.     public void contextInitialized(ServletContextEvent event) {  
  65.   
  66.   this.context = event.getServletContext();  
  67.   log("contextInitialized()");  
  68.   
  69.     }  
  70.     private void log(String message) {  
  71.   
  72.      System.out.println("ContextListener: " + message);  
  73.     }    
  74. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值