java web 監聽器詳解

jopen 12年前發布 | 249K 次閱讀 Java JSP Java開發

一、監聽器原理:

監聽器就是一個實現特定接口的普通java程序,這個程序專門用于監聽一個java對象的方法調用或屬性改變,當被監聽對象發生上述事件后,監聽器某個方法將立即被執行。

java web 監聽器詳解

 

簡單的說,被監聽對象A中,關聯著B對象。事件源A類對外提供一個方法,用于設置監聽器對象BA類的某一實例變量中。在需要監聽事件源的方法中,方法體的某一處先構造創建一個Event對象,將thisB與相關的動作封裝進Event對象中,然后調用監聽器B對象的doXXXX(event)方法,將事件對象傳入方法實參中。

簡單的類圖示例:

java web 監聽器詳解

二、簡介:

Servlet規范中定義了多種類型的監聽器,它們用于監聽的事件源分別為SerlvetConext,HttpSessionServletRequest這三個域對象。

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的這些特別的監聽器注冊比較簡單,因為ServletRequestHttpSessionServletContext對象都是容器創建的,所以需要它們的監聽器的話,只需要在應用的web-infoweb.xml里配置即可:

<listener>

<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>

<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>

<!--  多個實現相同的Listenner接口,在執行時是按web.xml注冊出現的來決定。 -->

</listener>

注意:感知型監聽器HttpSessionBindingListenerHttpSessionActivationListener不需要注冊。

三、應用場景:

由于ervletRequestHttpSessionServletContext對象都是容器創建的,什么時候創建,用戶都不知道。通過實現這些對象的監聽器后,就可以得知了。比如:

1>ServletContextLintener監聽器的contextInitialized方法中,進行應用級的資源初始化以便提高效率,在contextDestroyed方法中對應用級的資源進行釋放。

2>又比如web應用中,會存在會話,通常的作法是將當前登錄的用戶存放在session會話中。那么如何統計在線人數話,如何顯示出當前登錄的用戶呢。如何踢出某些已登錄的用戶呢。就可以通過HttpSessionAttributeListener監聽器的attributeAdded方法。

等等。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!