空間站

          北極心空

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

          一、 listener

                 在Web項(xiàng)目中,我們可以使用Listener接口來(lái)監(jiān)聽(tīng)Container的中一些對(duì)象狀態(tài)的變化,并且根據(jù)這些對(duì)象的狀態(tài)的變化做出相應(yīng)的響應(yīng)。

          在Servlet 2.4和JSP 2.0 規(guī)范中一共有八個(gè)listener接口和六個(gè)event事件類(lèi)。

          當(dāng)一個(gè)事件發(fā)生的時(shí)候我們可以使用listener中的某個(gè)方法去對(duì)事件做出相應(yīng)的響應(yīng),這些方法的參數(shù)都是java.util.EventObject的子類(lèi)。

          這些Listener與其方法對(duì)應(yīng)的Event參數(shù)類(lèi)型如下圖:
           

          上圖詳細(xì)描述了八個(gè)listener接口和與其對(duì)應(yīng)的event類(lèi)

          我們大致可以把八個(gè)listener分成三類(lèi),分別為與ServletContext、HttpSession、ServletRuquest相關(guān)的listener,在上圖中已經(jīng)使用不同的底色進(jìn)行標(biāo)注。

           

          由于listener在實(shí)際的應(yīng)用中好像不如預(yù)計(jì)的廣泛,所以底下只簡(jiǎn)單介紹接口、方法、參數(shù)和注意點(diǎn)(統(tǒng)計(jì)在線人數(shù)和在線人員名單也許是用的最多的使用listener的實(shí)現(xiàn)了)。

           

          好了,讓我們從與ServletContext相關(guān)的兩個(gè)接口開(kāi)始吧

           

          首先ServletContext是整個(gè)Web應(yīng)用的上下文,所以這個(gè)對(duì)象里存放的應(yīng)該是和整個(gè)Web應(yīng)用相關(guān)的東西(在線人數(shù)明顯很符合這個(gè)特點(diǎn))

           

          ServletContextListener

           

          void contextInitialized(ServletContextEvent sce)

          這個(gè)方法在Container初始化整個(gè)Web應(yīng)用時(shí)調(diào)用,運(yùn)行在該Web應(yīng)用中servlet和filter初始化之前

           

          void contextDestroyed(ServletContextEvent sce)

          這個(gè)方法在Container卸載整個(gè)Web應(yīng)用時(shí)調(diào)用,運(yùn)行在該Web應(yīng)用中servlet和filter的destroy()方法之后

           

          ServletContextAttributeListener

           

             void attributeAdded(ServletContextAttributeEvent scab)

             這個(gè)方法在通過(guò)ServletContext的void setAttribute(String name, Object object)向ServletContext新添加一個(gè)name為名,object為值得對(duì)象之后被調(diào)用

             void attributeReplaced(ServletContextAttributeEvent scab)

             這個(gè)方法在通過(guò)ServletContext的void setAttribute(String name, Object object)替換ServletContext中name對(duì)應(yīng)的值之后被調(diào)用

          void attributeRemoved(ServletContextAttributeEvent scab)

          這個(gè)方法在通過(guò)ServletContext的void removeAttribute(String name)刪除ServletContext中以name為名的鍵值對(duì)之后或者ServletContext被銷(xiāo)毀之前被調(diào)用。

           

          ServletContextAttributeEvent提供兩個(gè)方法:

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

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

           

           

          HttpSessionListener

           

                 void sessionCreated(HttpSessionEvent se)

              當(dāng)一個(gè)session被創(chuàng)建之后,容器調(diào)用此方法。

          void sessionDestroyed(HttpSessionEvent se)

           當(dāng)一個(gè)session將要被銷(xiāo)毀時(shí),容器調(diào)用此方法。

           

           HttpSessionEvent只有一個(gè)方法HttpSession getSession(),該方法返回對(duì)應(yīng)的session。

           

           

          HttpSessionActivationListener

          這個(gè)接口一般和Servlet容器的集群有關(guān)系,它監(jiān)聽(tīng)的是同一個(gè)session轉(zhuǎn)移至不同的JVM的事件。

                 void sessionDidActivate(HttpSessionEvent se)

                 當(dāng)一個(gè)session對(duì)象已經(jīng)變成有效的狀態(tài)的時(shí)候,容器調(diào)用此方法

          void sessionWillPassivate(HttpSessionEvent se)

           當(dāng)一個(gè)session對(duì)象將要變成無(wú)效狀態(tài)的時(shí)候,容器調(diào)用此方法

           

           

          HttpSessionAttributeListener

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

          ServletContextAttributeListener針對(duì)的是ServletContext,而HttpSessionAttributeListener針對(duì)的Session。

           

             void attributeAdded(HttpSessionBindingEvent se)

             這個(gè)方法在通過(guò)HttpSession的void setAttribute(String name, Object object)向HttpSession新添加一個(gè)name為名,object為值得對(duì)象之后被調(diào)用

             void attributeReplaced(HttpSessionBindingEvent se)

             這個(gè)方法在通過(guò)HttpSession的void setAttribute(String name, Object object)替換HttpSession中name對(duì)應(yīng)的值之后被調(diào)用

          void attributeRemoved(HttpSessionBindingEvent se)

          這個(gè)方法在通過(guò)HttpSession的void removeAttribute(String name)刪除HttpSession中以name為名的鍵值對(duì)或者HttpSession失效時(shí)被調(diào)用之后被調(diào)用。

           

          HttpSessionBindingEvent提供三個(gè)方法:

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

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

          HttpSession getSession() 返回發(fā)生此事件的HttpSession對(duì)象。

           

           

          HttpSessionBindingListener

          注意:這個(gè)listener是一個(gè)比較特殊的listener,它不需要在web.xml中進(jìn)行配置。

          此listener需要存放于session中的對(duì)象實(shí)現(xiàn)此接口,才能被響應(yīng)。

           

                 void valueBound(HttpSessionBindingEvent event)

           此方法通過(guò)HttpSession的void setAttribute(String name, Object object)被調(diào)用。其中object需要實(shí)現(xiàn)HttpSessionBindingListener接口。

             

          void valueUnbound(HttpSessionBindingEvent event)

          此方法通過(guò)HttpSession的void removeAttribute(String name)或者HttpSession失效時(shí)被調(diào)用。其中nam對(duì)應(yīng)的object需要實(shí)現(xiàn)HttpSessionBindingListener接口。

           

          這個(gè)接口和HttpSessionAttributeListener差別為,此接口不需要在web.xml中配置并且可以監(jiān)聽(tīng)單個(gè)類(lèi)的對(duì)象被放入session或者從session中去掉的動(dòng)作。而HttpSessionAttributeListener需要在web.xml中配置,并且是監(jiān)聽(tīng)所有類(lèi)的對(duì)象。

           

           

          ServletRequestListener

             void requestInitialized(ServletRequestEvent sre)

                 request初始化之后,容器調(diào)用此方法。

          void requestDestroyed(ServletRequestEvent sre)

          request消亡之前,容器調(diào)用此方法。

           

          ServletRequestEvent提供二個(gè)方法:

                 ServletContext getServletContext()

              返回此事件request對(duì)象對(duì)應(yīng)的ServletContext

          ServletRequest getServletRequest()

           返回此事件的request對(duì)象

           

          ServletRequestAttributeListener

          這個(gè)listener作用和ServletContextAttributeListener和HttpSessionAttributeListener類(lèi)似,不過(guò)它監(jiān)聽(tīng)的是ServletRequest對(duì)象。

           

            void attributeAdded(ServletRequestAttributeEvent srae)

             這個(gè)方法在通過(guò)ServletRequest的void setAttribute(String name, Object object)向ServletRequest新添加一個(gè)name為名,object為值得對(duì)象之后被調(diào)用

             void attributeReplaced(ServletRequestAttributeEvent srae)

             這個(gè)方法在通過(guò)ServletRequest的void setAttribute(String name, Object object)替換ServletRequest中name對(duì)應(yīng)的值之后被調(diào)用

          void attributeRemoved(ServletRequestAttributeEvent srae)

          這個(gè)方法在通過(guò)ServletRequest的void removeAttribute(String name)刪除ServletRequest中以name為名的鍵值對(duì)或者ServletRequest失效時(shí)被調(diào)用之后被調(diào)用。

           

           

          ServletRequestAttributeEvent除了繼承了ServletRequestEvent的ServletContext getServletContext()和ServletRequest getServletRequest()還提供了:

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

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

           

           

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

          配置的方法很簡(jiǎn)單就是在web.xml中最后一個(gè)</filter-mapping>后,添加一個(gè)

           

           


           

           

          <listener>

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

          </listener>

           

          其中squall.servlet.listener.Listener為某一個(gè)listener的實(shí)現(xiàn)類(lèi)。

          文章出處:http://www.diybl.com/course/3_program/java/javashl/2008411/110050.html

          posted on 2008-10-24 09:19 蘆葦 閱讀(8953) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): JAVA

          Feedback

          # re: Servlet介紹-listener 2013-10-28 14:06 uty
          dfhdfhfdhfdhjhgjhgjhgkghkghk  回復(fù)  更多評(píng)論
            

          # re: Servlet介紹-listener 2013-10-28 14:07 uty
          gdfgdfhdfhtrytrutru  回復(fù)  更多評(píng)論
            

          # re: Servlet介紹-listener 2014-06-04 10:00 admin
          沒(méi)有實(shí)際例子,我還是不知道怎么用  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 重庆市| 新疆| 乌审旗| 玉田县| 怀远县| 宁阳县| 定陶县| 丰顺县| 普陀区| 云南省| 新宁县| 德令哈市| 休宁县| 石台县| 松原市| 云南省| 府谷县| 栾川县| 瑞丽市| 福清市| 松溪县| 银川市| 清远市| 彰化县| 余江县| 瓦房店市| 东安县| 夏津县| 南平市| 嘉峪关市| 长治市| 宾川县| 库伦旗| 万山特区| 辽阳县| 西畴县| 手游| 宜州市| 两当县| 电白县| 大关县|