1、Servlet監聽器的概念web
Servlet監聽器是Servlet規範中定義的一種特殊類,用於監聽ServletContext、HttpSession和ServletRequest等域對象的建立與銷燬事件,以及監聽這些域對象中屬性發生修改的事件。數據庫
監聽對象:緩存
一、ServletContext:application,整個應用只存在一個tomcat
二、HttpSession:session,針對每個對話服務器
三、ServletRequest:request,針對每個客戶請求session
監聽內容:建立、銷燬、屬性改變事件app
監聽做用:能夠在事件發生前、發生後進行一些處理,通常能夠用來統計在線人數和在線用戶、統計網站訪問量、系統啓動時初始化信息等。網站
2、監聽器的基本使用spa
建立步驟:日誌
一、建立一個實現監聽器接口的類
二、配置web.xml文件,註冊監聽器
<listener> <listener-class>完整類名</listener-class> </listener>
監聽器的啓動順序:按照web.xml的配置順序來啓動
加載順序:監聽器>過濾器>Servlet
3、監聽器的分類
3.1 按照監聽的對象劃分
一、用於監聽應用程序環境對象(ServletContext)的事件監聽器,實現ServletContextListener、ServletContextAttributeListener接口
二、用於監聽用戶會話對象(HttpSeesion)的事件監聽器,實現HttpSessionListener、HttpSessionAttributeListener接口
三、用於監聽請求消息對象(ServletRequest)的事件監聽器,實現ServletRequestListener、ServletRequestAttributeListener接口
3.2按照監聽事件劃分
一、監聽域對象自身的建立和銷燬的事件監聽器
根據監聽對象不一樣分別實現ServletContextListener、HttpSessionListener、ServletRequestListener接口。
①ServletContext的建立和銷燬:contextInitialized方法和contextDestroyed方法
public void contextInitialized(ServletContextEvent sce)//ServletContext建立時調用 public void contextDestroyed(ServletContextEvent sce)//ServletContext銷燬時調用
主要用途:做爲定時器、加載全局屬性對象、建立全局數據庫鏈接、加載緩存信息等
實例:
在web.xml中能夠配置項目初始化信息,在contextInitialized方法中進行啓動
<context-param> <param-name>屬性名</param-name> <param-value>屬性值</param-value> </context-param>
自定義監聽器
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){ //關閉時操做 } }
②HttpSession的建立和銷燬:sessionCreated和sessionDestroyed方法
public void sessionCreated(HttpSessionEvent se)//session建立時調用 public void sessionDestroyed(HttpSessionEvent se)//session銷燬時調用
主要用途:統計在線人數、記錄訪問日誌等
【注】
web.xml配置session超時參數,單位:分,session超時的時間並非精確的
<session-config> <session-timeout>10</session-timeout> </session-config>
③ServletRequest的建立和銷燬:requestInitialized和requestDestroyed方法
public void requestInitialized(ServletRequestEvent sre)//request建立時調用 public void requestDestroyed(ServletRequestEvent sre)//request銷燬時調用
主要用途:讀取request參數,記錄訪問歷史
實例:
public class MySRequestListener implements SevletRequestListener{ public void requestInitialized(ServletRequestEvent sre){ String value=sre.getServletRequest().getParameter("key");//獲取request中的參數 System.out.println(value); } public void requestDestroyed(ServletRequestEvent sre){ System.out.println("request destroyed"); } }
二、監聽域對象中的屬性的增長和刪除的事件監聽器
根據監聽對象不一樣分別實現ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener接口。
實現方法:attributeAdded、attributeRemoved、attributeReplaced
三、監聽綁定到HttpSeesion域中的某個對象的狀態的事件監聽器(建立普通JavaBean)
HttpSession中的對象狀態:綁定→解除綁定;鈍化→活化
實現接口及方法:HttpSessionBindingListener接口(valueBound和valueUnbound方法)、HttpSessionActivationListener接口(sessionWillPassivate和sessionDidActivate方法)
【注1】①要實現鈍化和活化必須實現Serializable接口
②不須要在web.xml中註冊
【注2】
綁定: 經過setAttribute保存到session對象當中
解除綁定: 經過removeAttribue去除
鈍化: 將session對象持久化到存儲設備上
活化: 將session對象從存儲設備上進行恢復
session鈍化機制:
①把服務器不常使用的session對象暫時序列化到系統文件或者是數據庫中,當使用時反序列化到內存中,整個過程由服務器自動完成;
②session的鈍化機制由SessionManager管理,建立一個普通的JavaBean綁定和接觸鬚要實現HttpSessionBindingListener接口
4、Servlet3.0下監聽器的使用
4.1 使用條件
一、使用servlet3.0新標準的jar包
二、JDK在1.6以上版本
三、編譯器的編譯級別爲6.0
四、在web.xml文件中,使用3.0規範
五、使用支持servlet3.0特性的web容器,好比tomcat7
4.2 servlet3.0下監聽器的用法
使用註解 @WebListener 便可,沒法去定義監聽器的順序
屬性名 | 類型 | 是否可選 | 描述 |
value | String | 是 | 該監聽器的描述信息 |
@WebListener("This is a listener") public class FirstListener impliements ServletRequestListener{}
該註解用於將類聲明爲監聽器,被 @WebListener 標註的類必須實現如下至少一個接口:
ServletContextListener
ServletContextAttributeListener
ServletRequestListener
ServletRequestAttributeListener
HttpSessionListener
HttpSessionAttributeListener
參考資料:慕課網【JAVA Web開發技術應用——監聽器】http://www.imooc.com/learn/271