Listener
Listener(監聽器)用來監控Servlet上下文或HTTP會話對象的狀態,監聽器部署到WEB模塊或應用中之後,一旦這些對象的狀態發生了變更,WEB容器就會向事件監聽器發出通知,由事件監聽器對狀態的變更做出響應。
Servlet上下文事件指WEB模塊或應用的部署或解部署,上下文屬性的添加、刪除和替換。下表列出了Servlet上下文事件的類型、事件監聽器必須實現的接口,以及上下文事件發生時調用的方法。
表1-1 Servlet上下文事件
事件類型 |
接口 |
方法 |
創建Servlet上下文 |
javax.servlet.ServletContextListener |
contextInitialized() |
關閉Servlet上下文 |
contextDestroyed() |
|
添加屬性 |
javax.servlet.ServletContextAttributesListener |
attributeAdded() |
刪除屬性 |
attributeRemoved() |
|
替換屬性 |
attributeReplaced() |
HTTP會話事件指HTTP會話的激活或鈍化,以及HTTP會話屬性的添加、刪除或替換。下表中列出了HTTP會話事件的類型、事件監聽器必須實現的接口,以及HTTP會話事件發生時調用的方法。
表1-2HTTP會話事件
事件類型 |
接口 |
方法 |
激活HTTP會話 |
javax.servlet.http.HttpSessionListener |
sessionCreated() |
鈍化HTTP會話 |
sessionDestroyed() |
|
添加屬性 |
javax.servlet.http.HttpSessionAttributeListener |
attributeAdded() |
刪除屬性 |
attributeRemoved() |
|
替換屬性 |
attributeReplaced() |
Servlet 3.0規範還包含javax.servlet.http.HttpSessionBindingListener和javax.servlet.http.HttpSessionActivationListener接口。這些接口由存儲爲會話屬性的對象來實現,不需要在web.xml中註冊事件監聽器。
下表中列出了Servlet請求事件的類型、事件監聽器必須實現的接口,以及請求事件發生時調用的方法。
表1-3 Servlet請求事件
事件類型 |
接口 |
方法 |
請求即將超出WEB模塊或應用的範圍 |
javax.servlet.ServletRequestListener |
requestDestroyed() |
請求即將進入WEB模塊或應用的範圍 |
requestInitialized() |
|
在Servlet請求中添加屬性 |
javax.servlet.ServletRequestAttributeListener |
attributeAdded() |
從Servlet請求中刪除屬性 |
attributeRemoved() |
|
替換了Servlet請求中的屬性 |
attributeReplaced() |
監聽器需要根據所響應的事件類型實現相應的接口,並實現接口定義的方法,有關接口的列表請參看前面章節。監聽器還需要創建不含任何參數的公共構造函數。
WEB容器在發出通知、調用監聽器的方法時,已將下列有用的事件類傳遞給相應的監聽器方法:
1. javax.servlet.http.HttpSessionEvent——提供對HTTP會話對象的訪問
2. javax.servlet.ServletContextEvent——提供對Servlet上下文對象的訪問
3. javax.servlet.ServletContextAttributeEvent——提供對Servlet上下文屬性的訪問
4. javax.servlet.http.HttpSessionBindingEvent——提供對HTTP會話及其屬性的訪問
Servlet 3.0規範可以使用註解@WebListener來定義監聽器,使用註解@WebListener標註的類必須至少實現以下接口之一:
1. javax.servlet.ServletContextListener
2. javax.servlet.ServletContextAttributeListener
3. javax.servlet.http.HttpSessionListener
4. javax.servlet.http.HttpSessionAttributeListener
5. javax.servlet.http.HttpSessionActivationListener
6. javax.servlet.http.HttpSessionBindingListener
7. javax.servlet.ServletRequestListener
8. javax.servlet.ServletRequestAttributeListener
下面的代碼片段定義了一個對創建和關閉Servlet上下文事件感興趣的監聽器:
import javax.servlet.ServletContextEvent;
importjavax.servlet.ServletContextListener;
importjavax.servlet.annotation.WebListener;
@WebListener
public class ContextListenerImplimplements ServletContextListener {
1.1.4 配置事件監聽器類
要將監聽器配置爲WEB模塊或應用的一部分,可以使用註解@WebListener標註相關的監聽器的實現類,同一種事件可以存在多個對其感興趣的監聽器。也可以將監聽器配置在web.xml(web-fragment.xml)中。如果同一種事件存在多個對其感興趣的監聽器,並且這些監聽器需要按照一定順序執行,則必須在web.xml(web-fragment.xml)中配置監聽器,BES應用服務器將按監聽器在部署描述符中出現的順序對其進行調用(關閉事件除外,將按相反的順序進行調用),舉例來說:
<listener>
<listener-class>samples.filter.ContextListenerImpl</listener-class>
</listener>
<listener-class>samples.filter.SessionAttributeListenerImpl</listener-class>
</listener>