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>  


 

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