轉自於http://www.open-open.com/lib/view/open1350703815649.html
一、監聽器原理:
監聽器就是一個實現特定接口的普通java程序,這個程序專門用於監聽一個java對象的方法調用或屬性改變,當被監聽對象發生上述事件後,監聽器某個方法將立即被執行。
簡單的說,被監聽對象A中,關聯着B對象。事件源A類對外提供一個方法,用於設置監聽器對象B到A類的某一實例變量中。在需要監聽事件源的方法中,方法體的某一處先構造創建一個Event對象,將this即B與相關的動作封裝進Event對象中,然後調用監聽器B對象的doXXXX(event)方法,將事件對象傳入方法實參中。
簡單的類圖示例:
二、簡介:
在Servlet規範中定義了多種類型的監聽器,它們用於監聽的事件源分別爲SerlvetConext,HttpSession和ServletRequest這三個域對象。
Servlet規範針對這三個對象上的操作,又把這多種類型的監聽器劃分爲三種類型:
1>監聽三個域對象創建和銷燬的事件監聽器
2>監聽域對象中屬性的增加和刪除的事件監聽器
3>監聽綁定到HttpSession域中的某個對象的狀態的時間監聽器。
a、如三個域對象的創建與銷燬方法簽名:
ServletRequestListener有以下兩個方法
void requestDestroyed(ServletRequestEvent sre)
void requestInitialized(ServletRequestEvent sre)
HttpSessionListener有以下兩個方法
void sessionCreated(HttpSessionEvent se)
void sessionDestroyed(HttpSessionEvent se)
ServletContextListener
void contextDestroyed(ServletContextEvent sce)
void contextInitialized(ServletContextEvent sce)
b、三個類型對象域中增、刪、改的監聽器(3個)
ServletContextAttributeListener,
HttpSessionAttributeListener,
ServletRequestAttributeListener
c、感知型監聽器(2個):監聽自己何時被幫到session上,何時解綁了;何時被鈍化了,何時被活化了(序列化到某個存儲設置中)。
注意:這種監聽器不需要註冊。某個javabean實現這些接口後就可以監聽何時被綁定、解綁或被激活或鈍化。
HttpSessionBindingListener:實現該接口的類,能檢測自己何時被Httpsession綁定,和解綁
HttpSessionActivationListener:實現該接口的類(要求些javabean必須是實現了Serializable接口的),能監測自己何時隨着HttpSession一起激活和鈍化。
三、Listenner的註冊
Javaweb的這些特別的監聽器註冊比較簡單,因爲ServletRequest、HttpSession、ServletContext對象都是容器創建的,所以需要它們的監聽器的話,只需要在應用的web-info的web.xml裏配置即可:
<listener>
<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>
<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>
<!-- 多個實現相同的Listenner接口,在執行時是按web.xml註冊出現的來決定。 -->
</listener>
注意:感知型監聽器HttpSessionBindingListener、HttpSessionActivationListener不需要註冊。
三、應用場景:
由於ervletRequest、HttpSession、ServletContext對象都是容器創建的,什麼時候創建,用戶都不知道。通過實現這些對象的監聽器後,就可以得知了。比如:
1>在ServletContextLintener監聽器的contextInitialized方法中,進行應用級的資源初始化以便提高效率,在contextDestroyed方法中對應用級的資源進行釋放。
2>又比如web應用中,會存在會話,通常的作法是將當前登錄的用戶存放在session會話中。那麼如何統計在線人數話,如何顯示出當前登錄的用戶呢。如何踢出某些已登錄的用戶呢。就可以通過HttpSessionAttributeListener監聽器的attributeAdded方法。
等等。