1. 程式人生 > >Servlet編程專題8之Servlet規範中的監聽器

Servlet編程專題8之Servlet規範中的監聽器

監聽器接口 seesion鈍化與活化 監聽器標簽 httpsessionbindinglistener接口 httpsessionlistener接口

- Servlet規範中的監聽器:

- Servlet規範中已經定義好了八個監聽器接口,它們要監聽的對象分別是request、session、servletContext對象,觸發監聽器事件是這三個對象的創建和銷毀,它們的域屬性空間愛你中的屬性的添加、刪除、修改,以及session的鈍化和活化操作。

- 在JavaWeb項目中使用監聽器,需要在web.xml文件中對監聽器進行註冊。

技術分享

- 下面對這八個監聽器接口接口進行介紹。


1、javax.servlet.ServletRequestListener接口:該監聽器用於完成對Request對象的創建以及銷毀的監聽,即當Request對象被創建或者被銷毀的時候,會觸發該監聽器中相應方法的執行。

- 該ServletRequestListener接口有兩個方法需要實現:接收通知,ServletRequest對象即將離開/進入web應用的範圍,可以通過在實現類中重寫這兩個方法來監聽ServletRequest對象。

技術分享


- javax.servlet.ServletRequestEvent類:這類事件表示ServletRequest對象生命周期的事件。

- 可以通過該ServletRequestEvent類的以下兩個方法獲取web應用的ServletContext對象和當前ServletRequest對象。

技術分享


- 示例代碼:

- 需要自定義ServletRequestListener實現類,並實現requestDestroyed(ServletRequestEvent sre)方法和requestInitialized(ServletRequestEvent sre)方法。

技術分享


- 並且在web.xml文件中定義監聽器標簽。

技術分享


- 可以發現,在瀏覽器訪問web應用的任何資源,都會在控制臺打印如下內容:

技術分享


2、javax.servlet.ServletRequestAttributeListener接口:該監聽器用於完成對Request對象域屬性添加、修改和刪除的監聽,即當Request對象域屬性被添加、修改和刪除時,會觸發該監聽器中相應方法的執行。

- 該ServletRequestAttributeListener接口有三個方法需要實現:用於接收ServletRequest域屬性被添加、刪除或者修改時的通知。(監聽ServletRequest域屬性的添加、刪除或者修改操作)

技術分享


- javax.servlet.ServletRequestAttributeEvent類:這類事件表示在應用中request對象域屬性被改動時的通知事件。

- 該ServletRequestAttributeEvent類有以下兩個方法:用於獲取ServletRequest對象域屬性改動的名字和值:

技術分享


- 示例代碼:

- 需要自定義ServletRequestAttributeListener實現類,並實現attributeAdded(ServletRequestAttributeEvent srae)方法、attributeRemoved(ServletRequestAttributeEvent srae)方法和attributeReplaced(ServletRequestAttributeEvent srae)方法。

技術分享

- 並且在web.xml文件中定義監聽器標簽。

技術分享

- 在index.jsp中添加java代碼塊,快中為request域空間添加屬性,啟動程序後打開這個頁面,可以看到控制臺中的打印如下。

技術分享

技術分享


3、javax.servlet.http.HttpSessionListener接口:該監聽器用於完成對Session對象的創建以及銷毀的監聽。(其接口中定義的方法和ServletRequestListener接口方法定義類似,與其不同的是,session對象在頁面第一次訪問的時候被創建,且只被創建一次。)

- HttpSessionListener接口中有兩個方法定義,分別用於對session對象的創建和銷毀進行監聽:

技術分享


- javax.servlet.http.HttpSessionEvent類:這個類表示當web應用中的session被改動時的通知事件。該類中的方法只有一個,用於獲取Session對象。

技術分享



4、javax.servlet.http.HttpSessionAttributeListener接口:該監聽器用於完成對session域屬性空間中屬性的添加、修改、刪除操作的監聽。(其接口定義的方法與ServletRequestAttributeListener接口定義的方法類似)

技術分享


- javax.servlet.http.HttpSessionBindingEvent類:這類事件表示在應用中request對象域屬性被改動時的通知事件。

- 該類中有用於獲取Session對象的getSession()方法,和獲取從session對象綁定或者解綁時的域屬性的名字或者值。

技術分享


5、javax.servlet.ServletContextListener接口:該監聽器用於完成對SessionContext對象的創建以及銷毀的監聽。不過需要註意的是,由於ServletContext在一個應用中只有一個,且是在服務器啟動時創建。另外,ServletContext的生命周期與整個應用的相同,所以當項目重新部署時,或者Tomcat正常關閉時(通過stop service關閉,不能是terminate關閉),可以銷毀ServletContext。(其接口中定義的方法和ServletRequestListener接口方法定義類似)

技術分享


- javax.servlet.ServletContextEvent類:這個類表示當web應用中的ServletContext被改動時的通知事件。該類中的方法只有一個,用於獲取ServletContext對象。

技術分享


6、javax.servlet.ServletContextAttributeListener接口:該監聽器用於完成對ServletContext域屬性空間中屬性的添加、修改、刪除操作的監聽。(其接口定義的方法與ServletRequestAttributeListener接口定義的方法類似)

技術分享


- javax.servlet.ServletContextAttributeEvent類:這類事件表示在應用中request對象域屬性被改動時的通知事件。(類中的方法與ServletRequestAttributeEvent類中方法類似)

技術分享


7、

javax.servlet.http.HttpSessionBindingListener接口:使對象在綁定session或者從session解綁時得以監聽。

技術分享

- 接口中定義的方法有兩個:通知對象正在從session綁定(或者解綁),並標識該session。

技術分享


- javax.servlet.http.HttpSessionBindingEvent類:當一個實現了HttpSessionBindingListener接口的對象從session域中綁定或者解綁時,這類事件將會被發送。

- 以下為該類中的三個方法:(與HttpSessionBindingEvent類類似,與之不同的是,getValue()方法返回的是實體類的對象)

技術分享


- 示例代碼:

技術分享

技術分享


8、javax.servlet.http.HttpSessionActivationListener接口:該監聽器用於監聽在session中存放的指定類型對象的鈍化與活化。

- 鈍化是指將內存中的數據寫入到硬盤中,而活化是指將硬盤中的數據恢復到內存中。當用戶正在訪問的應用或者該應用所在的服務器由於種種原因被停掉,然後在短時間內又重啟,此時用戶再訪問時session中的數據是不能丟失的,在應用關閉之前,需要將數據寫入到硬盤中,在重啟後可以立即重新恢復session中的數據,這就稱之為session的鈍化與活化。

- 那麽session中的哪些數據能夠鈍化呢?只有存放在JVM堆內存中的實現Serializable類的對象才能夠被鈍化。也就是說,對於字符串常量,基本數據類型等存放在JVM方法區中常量池常量,是無法被鈍化的。


HttpSessionActivationListener接口中定義的方法:當session已經被活化或者session將要被鈍化時通知監聽:

技術分享


- 示例代碼:

技術分享

技術分享


- 當服務器被關閉時,可以看到控制臺打印,說明session將要被鈍化時被通知監聽:

技術分享

- 當服務器重新啟動時,可以看到控制臺打印,說明session已經活化時被通知監聽:

技術分享


本文出自 “12392717” 博客,請務必保留此出處http://12402717.blog.51cto.com/12392717/1976935

Servlet編程專題8之Servlet規範中的監聽器