官术网_书友最值得收藏!

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ū)別到底是什么原因導致的會話失效。

主站蜘蛛池模板: 壶关县| 平江县| 沾化县| 肇州县| 中卫市| 广宗县| 榕江县| 贡觉县| 松潘县| 云安县| 缙云县| 姜堰市| 水富县| 通山县| 凤城市| 疏勒县| 元谋县| 鹤峰县| 彰化县| 资源县| 苏尼特右旗| 西宁市| 勃利县| 江永县| 安多县| 沁水县| 仙居县| 聊城市| 梓潼县| 门源| 莒南县| 云南省| 阜城县| 宿州市| 界首市| 安达市| 台江县| 屏东县| 昌宁县| 宁化县| 巩义市|