一、Servlet監(jiān)聽(tīng)器的概念
Servlet監(jiān)聽(tīng)器是Servlet規(guī)范中定義的一種特殊類,用于監(jiān)聽(tīng)ServletContext、Httpsession和ServletRequest等域?qū)ο蟮膭?chuàng)建與銷毀事件,以及監(jiān)聽(tīng)這些域?qū)ο笾袑傩园l(fā)生修改的事件。
監(jiān)聽(tīng)對(duì)象:
1、ServletContext:application,整個(gè)應(yīng)用只存在一個(gè)
2、HttpSession:session,針對(duì)每一個(gè)對(duì)話
3、ServletRequest:request,針對(duì)每一個(gè)客戶請(qǐng)求
監(jiān)聽(tīng)內(nèi)容:創(chuàng)建、銷毀、屬性改變事件
監(jiān)聽(tīng)作用:可以在事件發(fā)生前、發(fā)生后進(jìn)行一些處理,一般可以用來(lái)統(tǒng)計(jì)在線人數(shù)和在線用戶、統(tǒng)計(jì)網(wǎng)站訪問(wèn)量、系統(tǒng)啟動(dòng)時(shí)初始化信息等。
二、監(jiān)聽(tīng)器的基本使用
創(chuàng)建步驟:
1、創(chuàng)建一個(gè)實(shí)現(xiàn)監(jiān)聽(tīng)器接口的類
2、配置web.xml文件,注冊(cè)監(jiān)聽(tīng)器
<listener> <listener-class>完整類名</listener-class></listener>
監(jiān)聽(tīng)器的啟動(dòng)順序:按照web.xml的配置順序來(lái)啟動(dòng)
加載順序:監(jiān)聽(tīng)器>過(guò)濾器>Servlet
三、監(jiān)聽(tīng)器的分類
3.1 按照監(jiān)聽(tīng)的對(duì)象劃分
1、用于監(jiān)聽(tīng)?wèi)?yīng)用程序環(huán)境對(duì)象(ServletContext)的事件監(jiān)聽(tīng)器,實(shí)現(xiàn)ServletContextListener、ServletContextAttributeListener接口
2、用于監(jiān)聽(tīng)用戶會(huì)話對(duì)象(HttpSeesion)的事件監(jiān)聽(tīng)器,實(shí)現(xiàn)HttpSessionListener、HttpSessionAttributeListener接口
3、用于監(jiān)聽(tīng)請(qǐng)求消息對(duì)象(ServletRequest)的事件監(jiān)聽(tīng)器,實(shí)現(xiàn)ServletRequestListener、ServletRequestAttributeListener接口
3.2按照監(jiān)聽(tīng)事件劃分
1、監(jiān)聽(tīng)域?qū)ο笞陨淼膭?chuàng)建和銷毀的事件監(jiān)聽(tīng)器
根據(jù)監(jiān)聽(tīng)對(duì)象不同分別實(shí)現(xiàn)ServletContextListener、HttpSessionListener、ServletRequestListener接口。
①ServletContext的創(chuàng)建和銷毀:contextInitialized方法和contextDestroyed方法
public void contextInitialized(ServletContextEvent sce)//ServletContext創(chuàng)建時(shí)調(diào)用public void contextDestroyed(ServletContextEvent sce)//ServletContext銷毀時(shí)調(diào)用
主要用途:作為定時(shí)器、加載全局屬性對(duì)象、創(chuàng)建全局數(shù)據(jù)庫(kù)連接、加載緩存信息等
實(shí)例:
在web.xml中可以配置項(xiàng)目初始化信息,在contextInitialized方法中進(jìn)行啟動(dòng)
<context-param> <param-name>屬性名</param-name> <param-value>屬性值</param-value></context-param>
自定義監(jiān)聽(tīng)器
public class MyFirstListener implements ServletContextListener{ public void contextInitialized(ServletContextEvent sce){ //獲取web.xml中配置的屬性 String value=sce.getServletContext().getInitParameter("屬性名"); System.out.PRintln(value); } public void contextDestroyed(ServletContextEvent sce){ //關(guān)閉時(shí)操作 }}②HttpSession的創(chuàng)建和銷毀:sessionCreated和sessionDestroyed方法
public void sessionCreated(HttpSessionEvent se)//session創(chuàng)建時(shí)調(diào)用public void sessionDestroyed(HttpSessionEvent se)//session銷毀時(shí)調(diào)用
主要用途:統(tǒng)計(jì)在線人數(shù)、記錄訪問(wèn)日志等
【注】
web.xml配置session超時(shí)參數(shù),單位:分,session超時(shí)的時(shí)間并不是精確的
<session-config> <session-timeout>10</session-timeout></session-config>
③ServletRequest的創(chuàng)建和銷毀:requestInitialized和requestDestroyed方法
public void requestInitialized(ServletRequestEvent sre)//request創(chuàng)建時(shí)調(diào)用public void requestDestroyed(ServletRequestEvent sre)//request銷毀時(shí)調(diào)用
主要用途:讀取request參數(shù),記錄訪問(wèn)歷史
實(shí)例:
public class MySRequestListener implements SevletRequestListener{ public void requestInitialized(ServletRequestEvent sre){ String value=sre.getServletRequest().getParameter("key");//獲取request中的參數(shù) System.out.println(value); } public void requestDestroyed(ServletRequestEvent sre){ System.out.println("request destroyed"); }} 2、監(jiān)聽(tīng)域?qū)ο笾械膶傩缘脑黾雍蛣h除的事件監(jiān)聽(tīng)器
根據(jù)監(jiān)聽(tīng)對(duì)象不同分別實(shí)現(xiàn)ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener接口。
實(shí)現(xiàn)方法:attributeAdded、attributeRemoved、attributeReplaced
3、監(jiān)聽(tīng)綁定到HttpSeesion域中的某個(gè)對(duì)象的狀態(tài)的事件監(jiān)聽(tīng)器(創(chuàng)建普通JavaBean)
HttpSession中的對(duì)象狀態(tài):綁定→解除綁定;鈍化→活化
實(shí)現(xiàn)接口及方法:HttpSessionBindingListener接口(valueBound和valueUnbound方法)、HttpSessionActivationListener接口(sessionWillPassivate和sessionDidActivate方法)
【注1】①要實(shí)現(xiàn)鈍化和活化必須實(shí)現(xiàn)Serializable接口
②不需要在web.xml中注冊(cè)
【注2】
綁定: 通過(guò)setAttribute保存到session對(duì)象當(dāng)中
解除綁定: 通過(guò)removeAttribue去除
鈍化: 將session對(duì)象持久化到存儲(chǔ)設(shè)備上
活化: 將session對(duì)象從存儲(chǔ)設(shè)備上進(jìn)行恢復(fù)
session鈍化機(jī)制:
①把服務(wù)器不常使用的session對(duì)象暫時(shí)序列化到系統(tǒng)文件或者是數(shù)據(jù)庫(kù)中,當(dāng)使用時(shí)反序列化到內(nèi)存中,整個(gè)過(guò)程由服務(wù)器自動(dòng)完成;
②session的鈍化機(jī)制由SessionManager管理,創(chuàng)建一個(gè)普通的JavaBean綁定和接觸需要實(shí)現(xiàn)HttpSessionBindingListener接口
四、Servlet3.0下監(jiān)聽(tīng)器的使用
4.1 使用條件
1、使用servlet3.0新標(biāo)準(zhǔn)的jar包
2、JDK在1.6以上版本
3、編譯器的編譯級(jí)別為6.0
4、在web.xml文件中,使用3.0規(guī)范
5、使用支持servlet3.0特性的web容器,比如tomcat7
4.2 servlet3.0下監(jiān)聽(tīng)器的用法
使用注解 @WebListener 即可,無(wú)法去定義監(jiān)聽(tīng)器的順序
| 屬性名 | 類型 | 是否可選 | 描述 |
| value | String | 是 | 該監(jiān)聽(tīng)器的描述信息 |
@WebListener("This is a listener")public class FirstListener impliements ServletRequestListener{}該注解用于將類聲明為監(jiān)聽(tīng)器,被@WebListener 標(biāo)注的類必須實(shí)現(xiàn)以下至少一個(gè)接口:
ServletContextListener
ServletContextAttributeListener
ServletRequestListener
ServletRequestAttributeListener
HttpSessionListener
HttpSessionAttributeListener
參考資料:慕課網(wǎng)【JAVA Web開(kāi)發(fā)技術(shù)應(yīng)用——監(jiān)聽(tīng)器】http://www.imooc.com/learn/271
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注