Servlet監聽器


一、監聽器概述

 

監聽你的web應用,監聽許多信息的初始化,銷毀,增加,修改,刪除值等

 

Servlet監聽器用於監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生后可以做一些必要的處理。

 

1.Listener是Servlet的監聽器

2.可以監聽客戶端的請求、服務端的操作等。

3.通過監聽器,可以自動激發一些操作,如監聽在線用戶數量,當增加一個HttpSession時,給在線人數加1。

4.編寫監聽器需要實現相應的接口

5.編寫完成后在web.xml文件中配置一下,就可以起作用了

6.可以在不修改現有系統基礎上,增加web應用程序生命周期事件的跟蹤

 

 

 

servlet規范中為每種事件監聽器都定義了相應的接口,在編寫事件監聽器程序時只需實現這些接口就可以了。一些Servlet事件監聽器需要在web應用程序的部署 文件描述符文件(web.xml)中進行注冊(注冊之后才能發布),一個web.xml可以注冊多個servlet事件監聽器。web服務器按照它們在web.xml中注冊順序來加載和注冊這些servlet事件監聽器。servlet事件監聽器的注冊和調用過程都是由web容器自動完成的,當發生被監聽對象被創建,修改,銷毀等事件時,web容器將調用與之相關的servlet事件監聽器對象的相應方法(所監聽到的對象如果在創建、修改、銷毀事件觸發的時候就會調用這些監聽器這就相當於面向事件編程的概念),用戶在這些方法中編寫的事件處理代碼(相當於JS中的事件響應)即被執行。由於在一個web應用程序中只會為每個事件監聽器類創建一個實例對象,有可能出現多個線程同時調用一個事件監聽對象的情況,所以要注意多線程安全問題

 

 

 

二、監聽器類型

 

按監聽的對象划分:servlet2.4規范定義的事件有三種:

1.用於監聽應用程序環境對象(ServletContext)的事件監聽器

2.用於監聽用戶會話對象(HttpSession)的事件監聽器

3.用於監聽請求消息對象(ServletRequest)的事件監聽器

 

按監聽的事件類項划分

1.用於監聽域對象自身的創建和銷毀的事件監聽器

2.用於監聽域對象中的屬性的增加和刪除的事件監聽器

3.用於監聽綁定到HttpSession域中的某個對象的狀態的事件監聽器

 

在一個web應用程序的整個運行周期內,web容器會創建和銷毀三個重要的對象,ServletContext,HttpSession,ServletRequest。

 

PS:其中Context 為JSP頁面包裝頁面的上下文.由容器創建和初始化,管理對屬於JSP中特殊可見部分中已命名對象的訪問. 該接口用來定義了一個Servlet的環境對象。也可認為這是多個客戶端共享的信息,它與session的區別在於應用范圍的不同,session只對應於一個用戶。

 

PS:感覺好像這個對象與ASP中的Application對象是一樣的概念。

 

 

 

servlet2.4中定義了三個接口:

 

ServletContextListener,HttpSessionListener,ServletRequestListener

 

分別實現對應的接口就可以實現對應的監聽處理

 

1.在ServletContextListener接口中定義了兩個事件處理方法,分別是

 

contextInitialized()和contextDestroyed()

 

public void contextInitialized(ServletcontextEvent sce)

這個方法接受一個ServletContextEvent類型參數,在contextInitialized可以通過這個參數獲得當前被創建的ServletContext對象。

public void contextDestroyed(ServletContextEvent sce)

 

2.在HttpSessionListneter接口中共定義了兩個事件處理方法,分別是sessionCreated()和sessionDestroyed()

public void sessionCreated(HttpSessionEvent se)

這個方法接受一個(HttpSessionEvent類型參數,在sessionCreated可以通過這個參數獲得當前被創建的HttpSession對象。

public void sessionDestroyed(HttpSessionEvent se)

 

3.在ServletRequestListener接口中定義了兩個事件處理方法,分別是requestInitialized()和requestDestroyed()

public void requestInitialized(ServletRequestEvent sre)

這個方法接受一個(ServletRequestEvent類型參數,在requestInitialized可以通過這個參數獲得當前被創建的ServletRequest對象。

public void requestDestroyed(ServletRequestEvent sre)

 

可 以看出三個監聽器接口中定義的方法非常相似,執行原理與應用方式也相似,在web應用程序中可以注冊一個或者多個實現了某一接口的事件監聽器,web容器 在創建或銷毀某一對象(如ServletContext,HttpSession)時就會產生相應的事件對象

 

(如ServletcontextEvent,或者HttpSessionEvent),接着依次調用每個事件監聽器中的相應處理方法,並將產生的事件對象傳遞給這些方法。

 

三、分類及介紹

 

1. ServletContextListener:用於監聽WEB 應用啟動和銷毀的事件,監聽器類需要實現javax.servlet.ServletContextListener 接口。

 

2. ServletContextAttributeListener:用於監聽WEB應用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性,監聽器類需要實現javax.servlet.ServletContextAttributeListener接口。

 

3. HttpSessionListener:用於監聽Session對象的創建和銷毀,監聽器類需要實現javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者兩個都實現。

 

4. HttpSessionActivationListener:用於監聽Session對象的鈍化/活化事件,監聽器類需要實現javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者兩個都實現。

 

 

5. HttpSessionAttributeListener:用於監聽Session對象屬性的改變事件,監聽器類需要實現javax.servlet.http.HttpSessionAttributeListener接口。

 

四、部署

 

監聽器的部署在web.xml文件中配置,在配置文件中,它的位置應該在過濾器的后面Servle的前面

 

五、示例

 

5.1創建一個監聽器示例

 

第一步:編寫監聽器類

 

package cn.listen;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("die");
}
public void contextInitialized(ServletContextEvent sce) {
System.out.println("init");
}
}

第二步:布置安裝

 

<listener>

<listener-class>cn.listen.MyListener</listener-class>

 

</listener>

運行Resin服務器會出現

 

[20:42:38.406] {main} WebApp[http://default] active

init

 

[20:42:38.437] {main} WebApp[http://default/MyProj] active

監聽到了應用啟動。

PS:不清楚什么時候觸發contextInitialized事件?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM