java servlet listener

它是基于观察者模式设计的,Listener 的设计对开发 Servlet 应用程序提供了一种快捷的手段,能够方便的从另一个纵向维度控制程序和数据。目前 Servlet 中提供了 5 种两类事件的观察者接口,它们分别是:4 个 EventListeners 类型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener 和 2 个 LifecycleListeners 类型的,ServletContextListener、HttpSessionListener。如下图所示:

 

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

 

例子:

[java] view plaincopy
  1. /** 
  2.  *  
  3.  */  
  4. package com.ee.listener;  
  5.   
  6. import javax.servlet.ServletContextAttributeEvent;  
  7. import javax.servlet.ServletContextAttributeListener;  
  8. import javax.servlet.ServletContextEvent;  
  9. import javax.servlet.ServletContextListener;  
  10. import javax.servlet.http.HttpSessionEvent;  
  11. import javax.servlet.http.HttpSessionListener;  
  12.   
  13. /** 
  14.  * @author Administrator 
  15.  * 
  16.  */  
  17. public class OnlineUserListener implements HttpSessionListener,  
  18.         ServletContextListener, ServletContextAttributeListener {  
  19.     private long onlineUserCount = 0;  
  20.   
  21.     public long getOnlineUserCount() {  
  22.         return onlineUserCount;  
  23.     }  
  24.   
  25.     /* (non-Javadoc) 
  26.      * @see javax.servlet.ServletContextAttributeListener#attributeAdded(javax.servlet.ServletContextAttributeEvent) 
  27.      */  
  28.     @Override  
  29.     public void attributeAdded(ServletContextAttributeEvent arg0) {  
  30.   
  31.     }  
  32.   
  33.     /* (non-Javadoc) 
  34.      * @see javax.servlet.ServletContextAttributeListener#attributeRemoved(javax.servlet.ServletContextAttributeEvent) 
  35.      */  
  36.     @Override  
  37.     public void attributeRemoved(ServletContextAttributeEvent arg0) {  
  38.   
  39.     }  
  40.   
  41.     /* (non-Javadoc) 
  42.      * @see javax.servlet.ServletContextAttributeListener#attributeReplaced(javax.servlet.ServletContextAttributeEvent) 
  43.      */  
  44.     @Override  
  45.     public void attributeReplaced(ServletContextAttributeEvent attributeEvent) {  
  46.         System.err.println("...attributeReplaced...");  
  47.     }  
  48.   
  49.     /* (non-Javadoc) 
  50.      * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) 
  51.      */  
  52.     @Override  
  53.     public void contextDestroyed(ServletContextEvent arg0) {  
  54.   
  55.     }  
  56.   
  57.     /* (non-Javadoc) 
  58.      * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) 
  59.      */  
  60.     @Override  
  61.     public void contextInitialized(ServletContextEvent arg0) {  
  62.   
  63.     }  
  64.   
  65.     /* (non-Javadoc) 
  66.      * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent) 
  67.      */  
  68.     @Override  
  69.     public void sessionCreated(HttpSessionEvent httpSessionEvent) {  
  70.         onlineUserCount ++;  
  71.         toUpdateCount(httpSessionEvent);  
  72.     }  
  73.   
  74.     /* (non-Javadoc) 
  75.      * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent) 
  76.      */  
  77.     @Override  
  78.     public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {  
  79.         onlineUserCount --;  
  80.         toUpdateCount(httpSessionEvent);  
  81.     }  
  82.   
  83.     private void toUpdateCount(HttpSessionEvent httpSessionEvent){  
  84.         httpSessionEvent.getSession().setAttribute("onlineUserCount", onlineUserCount);  
  85.     }  
  86. }  

 

Web.xml

[html] view plaincopy
  1. <listener>  
  2.     <listener-class>com.ee.listener.OnlineUserListener</listener-class>  
  3. </listener>  


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章