先說一下什么是監聽器,監聽器也叫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)?? 方法。?
下面帖上一個簡單的配置
- < listener > ??
- ?????? < listener-class > listener.MySessionListener </ listener-class > ??
- ?? </ listener > ??
?把它放到<web-app>里
再建一個監聽類
- package ?listener;??
- ??
- import ?javax.servlet.http.HttpSessionEvent;??
- import ?javax.servlet.http.HttpSessionListener;??
- ??
- public ? class ?MySessionListener? implements ?HttpSessionListener?{??
- ? public ? void ?sessionCreated(HttpSessionEvent?se)?{??
- ?? //?當session建立時觸發 ??
- ??System.out.println( "當session建立時觸發" );??
- ?}??
- ??
- ? public ? void ?sessionDestroyed(HttpSessionEvent?se)?{??
- ?? //?當session銷毀時觸發 ??
- ??System.out.println( "當session銷毀時觸發" );??
- ?}??
?}
這樣就配置成功了,打開頁面時就會輸出當session建立時觸發,退出時輸出當session銷毀時觸發!
下面我們開發一個
具體的例子
,這個監聽器能夠統計在線的人數。在ServletContext初始化和銷毀時,在服務器控制臺打印對應的信息。當ServletContext里的屬性增加、改變、刪除時,在服務器控制臺打印對應的信息。??
????????? 要獲得以上的功能,監聽器必須實現以下3個接口:???
??????????????
? HttpSessionListener???
??????????????
? ServletContextListener???
??????????????
? ServletContextAttributeListener?????
????
????????? 我們看具體的代碼,見示例14-9。?????
????
????????? 【程序源代碼】?????
???
- ? //???====================???Program???Discription???=====================??? ??
- ? //???程序名稱:示例14-9???:???EncodingFilter???.java??? ??
- ? //???程序目的:學習使用監聽器??? ??
- //???==============================================================??? ??
- ? import ???javax.servlet.http.*;?????
- ? import ???javax.servlet.*;?????
- ?????
- ? public ??? class ???OnLineCountListener??? implements ???HttpSessionListener,?????
- ServletContextListener,ServletContextAttributeListener?????
- ?{?????
- ? private ??? int ???count;?????
- ? private ???ServletContext???context???=??? null ;?????
- ?????
- ? public ???OnLineCountListener()?????
- ?{?????
- ?count= 0 ;?????
- ? //setContext();??? ??
- ?}?????
- ? //創建一個session時激發??? ??
- public ??? void ???sessionCreated(HttpSessionEvent???se)???????
- ?{?????
- ?count++;?????
- ?setContext(se);?????
- ?????
- ?}?????
- ? //當一個session失效時激發??? ??
- public ??? void ???sessionDestroyed(HttpSessionEvent???se)???????
- ?{?????
- ?count--;?????
- ?setContext(se);?????
- ?}?????
- ? //設置context的屬性,它將激發attributeReplaced或attributeAdded方法??? ??
- public ??? void ???setContext(HttpSessionEvent???se)?????
- ?{?????
- ?se.getSession().getServletContext().?????
- etAttribute( "onLine" , new ???Integer(count));?????
- ?}?????
- ??? //增加一個新的屬性時激發??? ??
- public ??? void ???attributeAdded(ServletContextAttributeEvent???event)???{?????
- ?????
- ?log( "attributeAdded('" ???+???event.getName()???+??? "',???'" ???+?????
- ?????????event.getValue()???+??? "')" );?????
- ?????
- ?????????}?????
- ?????????????
- ??????? //刪除一個新的屬性時激發??? ??
- ???????? public ??? void ???attributeRemoved(ServletContextAttributeEvent???event)???{?????
- ?????
- ?log( "attributeRemoved('" ???+???event.getName()???+??? "',???'" ???+?????
- ?????????event.getValue()???+??? "')" );?????
- ?????
- ?????????}?????
- ?????
- ? //屬性被替代時激發??? ??
- ???????? public ??? void ???attributeReplaced(ServletContextAttributeEvent???event)???{?????
- ?????
- ?log( "attributeReplaced('" ???+???event.getName()???+??? "',???'" ???+?????
- ?????????event.getValue()???+??? "')" );?????
- ?????????}?????
- ????????? //context刪除時激發??? ??
- ?????????? public ??? void ???contextDestroyed(ServletContextEvent???event)???{?????
- ?????
- ?log( "contextDestroyed()" );?????
- ? this .context???=??? null ;?????
- ?????
- ?????????}?????
- ?????
- ????????? //context初始化時激發??? ??
- ???????? public ??? void ???contextInitialized(ServletContextEvent???event)???{?????
- ?????
- ? this .context???=???event.getServletContext();?????
- ?log( "contextInitialized()" );?????
- ?????
- ?????????}?????
- ????????? private ??? void ???log(String???message)???{?????
- ?????
- ?????????System.out.println( "ContextListener:???" ???+???message);?????
- ?????????}???????????
- ?}?????
?????
??????????
【程序注解】
???
????????? 在OnLineCountListener里,用count代表當前在線的人數,OnLineCountListener將在Web服務器啟動時自動執行。當
OnLineCountListener構造好后,把count設置為0。每增加一個Session,OnLineCountListener會自動調用sessionCreated(HttpSessionEvent?
?se)方法;每銷毀一個Session,OnLineCountListener會自動調用sessionDestroyed(HttpSessionEvent?? se)方法。當調用sessionCreated
(HttpSessionEvent?? se)方法時,說明又有一個客戶在請求,此時使在線的人數(count)加1,并且把count寫到ServletContext中。
ServletContext的信息是所有客戶端共享的,這樣,每個客戶端都可以讀取到當前在線的人數。?????
????
? 為了使監聽器生效,需要在web.xml里進行配置,如下所示:?????
????
?
- < listener > ?????
- ?????????????????? < listener-class > OnLineCountListener </ listener-class > ?????
- ?????????? </ listener > ?????
?????
? 測試程序:?????
????
?
- < %@???page??? contentType = "text/html;charset=gb2312" ???% > ?????
- ??????
- ??目前在線人數:???????
- ??????
- ?? < font ??? color = red > < %=getServletContext().getAttribute("onLine")% > </ font > < br > ?????
- ??????
- ??退出會話:???????
- ??????
- ?? < form ??? action = "exit.jsp" ??? method = post > ?????
- ?? < input ??? type = submit ??? value = "exit" > ?????
- ?? </ form > ?????
- ??????
- ??getServletContext().getAttribute("onLine")獲得了count的具體值。客戶端調用???????
- ??????
- ?? < %session.invalidate()???;% > ?????
?
????
????????? 使Session失效,這樣監聽器就會使count減1。?????
????
????????? 【運行程序】???
????????? web.xml做好以上的配置,把OnLineCountListener放在WEB-INF/class目錄下,啟動Web服務器,在瀏覽器里輸入以下URL(根據具體
情況不同):
http://127.0.0.1:8080/ch14/listener.jsp
?????
????
????????? 瀏覽器將會打印目前在線人數。在服務器端有以下輸出:?????
????
?
- …?????
- ??ContextListener:???contextInitialized()?????
- ??ContextListener:???attributeReplaced('org.apache.?????
- ??catalina.WELCOME_FILES ',???' [Ljava.lang.String; @1d98a ')?????
- ??…?????
- ??ContextListener:???attributeAdded( 'onLine' ,??? '1' )?????
- ??ContextListener:???attributeReplaced( 'onLine' ,??? '1' )?????
- ??ContextListener:???attributeReplaced( 'onLine' ,??? '0' )?????
- ??ContextListener:???attributeReplaced( 'onLine' ,??? '1' )?????
- ??ContextListener:???attributeReplaced( 'onLine' ,??? '2' ) ?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
