- 輕量級Java EE企業(yè)應用開發(fā)實戰(zhàn)
- 柳偉衛(wèi)編著
- 1232字
- 2022-07-29 14:31:20
3.7 監(jiān)聽器
應用程序事件功能使Web應用程序開發(fā)人員可以更好地控制ServletContext、HttpSession和ServletRequest的生命周期,實現更好的代碼分解,并提高管理Web應用程序使用的資源的效率。
事件監(jiān)聽器是實現一個或多個Servlet事件監(jiān)聽器接口的類。它們在部署Web應用時實例化并注冊到Web容器中。它們由開發(fā)人員在WAR包中提供。
Servlet事件監(jiān)聽器支持在ServletContext、HttpSession和ServletRequest狀態(tài)改變時進行事件通知。Servlet上下文監(jiān)聽器用來管理應用的資源或JVM級別持有的狀態(tài)。HTTP會話監(jiān)聽器用來管理從相同客戶端或用戶進入Web應用的一系列請求關聯(lián)的狀態(tài)或資源。Servlet請求監(jiān)聽器用來管理整個Servlet請求生命周期的狀態(tài)。異步監(jiān)聽器用來管理異步事件,例如超時和完成異步處理。
可以有多個監(jiān)聽器類監(jiān)聽每一個事件類型,且開發(fā)人員可以為每一個事件類型指定容器調用監(jiān)聽器Bean的順序。
3.7.1 事件類型和監(jiān)聽器接口
事件類型和監(jiān)聽器接口總結如下:
1.Servlet上下文事件
Servlet上下文事件總結如表3-2所示。
表3-2 Servlet上下文事件

2.HTTP會話事件
HTTP會話事件總結如表3-3所示。
表3-3 HTTP會話事件

3.Servlet請求事件
Servlet請求事件總結如表3-4所示。
表3-4 Servlet請求事件

3.7.2 部署描述符示例
以下示例是注冊兩個Servlet上下文生命周期監(jiān)聽器和一個HttpSession監(jiān)聽器的部署語法。
假設com.waylau.java.MyConnectionManager和com.waylau.java.MyLoggingModule兩個都實現了javax.servlet.ServletContextListener,且com.waylau.java.MyLoggingModule又實現了javax.servlet.http.HttpSessionListener。此外,開發(fā)人員希望com.waylau.java.MyConnectionManager在com.waylau.java.MyLoggingModule得到Servlet上下文生命周期事件的通知。下面是這個應用的部署描述符:

3.7.3 監(jiān)聽器實例和線程
容器需要在開始執(zhí)行進入應用的第一個請求之前完成Web應用中的監(jiān)聽器類的實例化。容器必須保持到每一個監(jiān)聽器的引用直到為Web應用最后一個請求提供服務。
ServletContext和HttpSession對象的屬性改變可能會同時發(fā)生。不要求容器同步到屬性監(jiān)聽器類產生的通知。維護狀態(tài)的監(jiān)聽器類負責數據的完整性且應明確處理這種情況。
3.7.4 監(jiān)聽器異常
一個監(jiān)聽器里面的應用代碼在運行期間可能會拋出異常。一些監(jiān)聽器通知發(fā)生在應用中的另一個組件調用樹的過程中。這方面的一個例子是一個Servlet設置了會話屬性,該會話監(jiān)聽器拋出未處理的異常。容器必須允許未處理的異常由錯誤頁面機制處理。如果沒有為這些異常指定錯誤頁面,容器就必須確保返回一個狀態(tài)碼為500的響應。這種情況下,不再有監(jiān)聽器根據事件被調用。
有些異常不會發(fā)生在應用中的另一個組件調用棧的過程中。這方面的一個例子SessionListener接收通知的會話已經超時并拋出未處理的異常,或者ServletContextListener在Servlet上下文初始化通知期間拋出未處理的異常,或者ServletRequestListener在初始化或銷毀請求對象的通知期間拋出未處理的異常。這種情況下,開發(fā)人員沒有機會處理這種異常。容器能夠以HTTP狀態(tài)碼500來響應所有后續(xù)到Web應用的請求,表示應用出錯了。
3.7.5 分布式容器
在分布式Web容器中,HttpSession實例被限到特定的JVM服務會話請求,且ServletContext對象被限定到Web容器所在的JVM。分布式容器不需要傳播Servlet上下文事件或HttpSession事件到其他JVM。監(jiān)聽器類實例被限定到每個JVM的每個部署描述符聲明一個。
3.7.6 會話事件
監(jiān)聽器類提供給開發(fā)人員一種跟蹤Web應用內會話的方式。它通常是有用的,在跟蹤會話時能夠知道一個會話是否已經失效。會話失效有多種原因,可能是因為容器會話超時,或因為應用內的一個Web組件調用了invalidate方法。通過會話事件就能區(qū)別到底是什么原因導致的會話失效。
- 手機安全和可信應用開發(fā)指南:TrustZone與OP-TEE技術詳解
- UI圖標創(chuàng)意設計
- Visual C++程序設計學習筆記
- R語言經典實例(原書第2版)
- Maven Build Customization
- Learn to Create WordPress Themes by Building 5 Projects
- Oracle 12c中文版數據庫管理、應用與開發(fā)實踐教程 (清華電腦學堂)
- 深入分布式緩存:從原理到實踐
- Learning Unreal Engine Android Game Development
- Python Interviews
- JSP程序設計實例教程(第2版)
- 計算機應用基礎項目化教程
- jQuery for Designers Beginner's Guide Second Edition
- Learning Android Application Testing
- Learning Unreal Engine Game Development