servlet listener

listener

       Web項目中,我們可以使用Listener接口來監聽Container的中一些對象狀態的變化,並且根據這些對象的狀態的變化做出相應的響應。

Servlet 2.4JSP 2.0 規範中一共有八個listener接口和六個event事件類。

當一個事件發生的時候我們可以使用listener中的某個方法去對事件做出相應的響應,這些方法的參數都是java.util.EventObject的子類。

這些Listener與其方法對應的Event參數類型如下圖:

 

上圖詳細描述了八個listener接口和與其對應的event

我們大致可以把八個listener分成三類,分別爲與ServletContextHttpSessionServletRuquest相關的listener,在上圖中已經使用不同的底色進行標註。

 

由於listener在實際的應用中好像不如預計的廣泛,所以底下只簡單介紹接口、方法、參數和注意點(統計在線人數和在線人員名單也許是用的最多的使用listener的實現了)

 

好了,讓我們從與ServletContext相關的兩個接口開始吧

 

首先ServletContext是整個Web應用的上下文,所以這個對象裏存放的應該是和整個Web應用相關的東西(在線人數明顯很符合這個特點)

 

ServletContextListener

 

void contextInitialized(ServletContextEvent sce)

這個方法在Container初始化整個Web應用時調用,運行在該Web應用中servletfilter初始化之前

 

void contextDestroyed(ServletContextEvent sce)

這個方法在Container卸載整個Web應用時調用,運行在該Web應用中servletfilterdestroy()方法之後

 

ServletContextAttributeListener

 

   void attributeAdded(ServletContextAttributeEvent scab)

   這個方法在通過ServletContextvoid setAttribute(String name, Object object)ServletContext新添加一個name爲名,object爲值得對象之後被調用

   void attributeReplaced(ServletContextAttributeEvent scab)

   這個方法在通過ServletContextvoid setAttribute(String name, Object object)替換ServletContextname對應的值之後被調用

void attributeRemoved(ServletContextAttributeEvent scab)

這個方法在通過ServletContextvoid removeAttribute(String name)刪除ServletContext中以name爲名的鍵值對之後或者ServletContext被銷燬之前被調用。

 

ServletContextAttributeEvent提供兩個方法:

String getName()返回鍵值對的名也就是name。

Object getValue()這個方法,在attributeAdded中返回新添的鍵值對的值;在attributeReplaced和中attributeRemoved返回原鍵值對的值。

 

 

HttpSessionListener

 

       void sessionCreated(HttpSessionEvent se)

    當一個session被創建之後,容器調用此方法。

void sessionDestroyed(HttpSessionEvent se)

 當一個session將要被銷燬時,容器調用此方法。

 

 HttpSessionEvent只有一個方法HttpSession getSession(),該方法返回對應的session

 

 

HttpSessionActivationListener

這個接口一般和Servlet容器的集羣有關係,它監聽的是同一個session轉移至不同的JVM的事件。

       void sessionDidActivate(HttpSessionEvent se)

       當一個session對象已經變成有效的狀態的時候,容器調用此方法

void sessionWillPassivate(HttpSessionEvent se)

 當一個session對象將要變成無效狀態的時候,容器調用此方法

 

 

HttpSessionAttributeListener

這個接口和ServletContextAttributeListener方法一樣,唯一的差別即是:

ServletContextAttributeListener針對的是ServletContext,而HttpSessionAttributeListener針對的Session

 

   void attributeAdded(HttpSessionBindingEvent se)

   這個方法在通過HttpSessionvoid setAttribute(String name, Object object)HttpSession新添加一個name爲名,object爲值得對象之後被調用

   void attributeReplaced(HttpSessionBindingEvent se)

   這個方法在通過HttpSessionvoid setAttribute(String name, Object object)替換HttpSessionname對應的值之後被調用

void attributeRemoved(HttpSessionBindingEvent se)

這個方法在通過HttpSessionvoid removeAttribute(String name)刪除HttpSession中以name爲名的鍵值對或者HttpSession失效時被調用之後被調用。

 

HttpSessionBindingEvent提供三個方法:

String getName()返回鍵值對的名也就是name。

Object getValue()這個方法,在attributeAdded中返回新添的鍵值對的值;在attributeReplaced和中attributeRemoved返回原鍵值對的值。

HttpSession getSession() 返回發生此事件的HttpSession對象。

 

 

HttpSessionBindingListener

注意:這個listener是一個比較特殊的listener它不需要在web.xml中進行配置

listener需要存放於session中的對象實現此接口,才能被響應。

 

       void valueBound(HttpSessionBindingEvent event)

 此方法通過HttpSessionvoid setAttribute(String name, Object object)被調用。其中object需要實現HttpSessionBindingListener接口。

   

void valueUnbound(HttpSessionBindingEvent event)

此方法通過HttpSessionvoid removeAttribute(String name)或者HttpSession失效時被調用。其中nam對應的object需要實現HttpSessionBindingListener接口。

 

這個接口和HttpSessionAttributeListener差別爲,此接口不需要在web.xml中配置並且可以監聽單個類的對象被放入session或者從session中去掉的動作。而HttpSessionAttributeListener需要在web.xml中配置,並且是監聽所有類的對象。

 

 

ServletRequestListener

   void requestInitialized(ServletRequestEvent sre)

       request初始化之後,容器調用此方法。

void requestDestroyed(ServletRequestEvent sre)

request消亡之前,容器調用此方法。

 

ServletRequestEvent提供二個方法:

       ServletContext getServletContext()

    返回此事件request對象對應的ServletContext

ServletRequest getServletRequest()

 返回此事件的request對象

 

ServletRequestAttributeListener

這個listener作用和ServletContextAttributeListenerHttpSessionAttributeListener類似,不過它監聽的是ServletRequest對象。

 

  void attributeAdded(ServletRequestAttributeEvent srae)

   這個方法在通過ServletRequestvoid setAttribute(String name, Object object)ServletRequest新添加一個name爲名,object爲值得對象之後被調用

   void attributeReplaced(ServletRequestAttributeEvent srae)

   這個方法在通過ServletRequestvoid setAttribute(String name, Object object)替換ServletRequestname對應的值之後被調用

void attributeRemoved(ServletRequestAttributeEvent srae)

這個方法在通過ServletRequestvoid removeAttribute(String name)刪除ServletRequest中以name爲名的鍵值對或者ServletRequest失效時被調用之後被調用。

 

 

ServletRequestAttributeEvent除了繼承了ServletRequestEventServletContext getServletContext()ServletRequest getServletRequest()還提供了:

    String getName()返回鍵值對的名也就是name

Object getValue()這個方法,在attributeAdded中返回新添的鍵值對的值;在attributeReplaced和中attributeRemoved返回原鍵值對的值。

 

 

除了HttpSessionBindingListener以外,其他的listener都必須在web.xml中進行配置。

配置的方法很簡單就是在web.xml中最後一個</filter-mapping>後,添加一個

 

 

 



<listener>

     
<listener-class>squall.servlet.listener.Listener</listener-class>

</listener>

 

其中squall.servlet.listener.Listener爲某一個listener的實現類。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章