Servlt之事件監聽器
一、事件三要素
事件源:要觸發的對象(一般是名詞,事件發起者,比如qq的啓動圖標)
事件:觸發事件的方式(一般是動詞,出發事件,比如雙擊圖標)
事件處理程序:發生了生麼事(處理的結果,比如彈出登錄界面)
二、什麼是監聽器
簡介:監聽器就是一個實現特定接口的普通java程序,這個程序專門用於監聽另一個java對象的方法調用或屬性的改變,當被監聽對象發生上述事件後,監聽器某個方法將立即被執行。
監聽器典型案例:監聽window窗口事件的監聽器
監聽器: 主要是用來監聽特定對象的創建或銷燬、屬性的變化的!
是一個實現特定接口的普通java類!
對象:
- 自己創建自己用 (不用監聽)
- 別人創建自己用 (需要監聽)
Servlet中哪些對象需要監聽?
request / session / servletContext
分別對應的是request監聽器、session相關監聽器、servletContext監聽器
監聽器(listener)
三、Servlet中的監聽器
1.在Servlet規範中定義了多種類型的監聽器,但是他們用於監聽的時間源分別有三個域對象:
- ServletRequest
- HttpSession
- ServletContext
2.Servlet規範針對這三個對象上的操作,又把這多種類型的監聽器劃分爲三種類型。
- 監聽三個域對象創建和銷燬的事件監聽器
- 監聽域對象中屬性的增加和刪除的事件監聽器
- 監聽綁定到HttpSession域中的某個對象的狀態的事件監聽器
四、監聽三個域對象的創建和銷燬
1.監聽ServletContext域對象創建和銷燬
servletContext域對象的生命週期:
創建:服務器啓動針對每一個web應用創建servletcontext
銷燬:服務器關閉前先關閉代表每一個web應用的servletContext
(生命週期最長,在服務器關閉前纔會關閉)
ServletContextListener 接口:用於監聽 ServletContext對象的創建和銷燬事件。
當 ServletContext 對象被創建時,激發contextInitialized (ServletContextEvent sce)方法
當 ServletContext 對象被銷燬時,激發contextDestroyed(ServletContextEvent sce)方法。
2.監聽HttpSession域對象創建和銷燬
HttpSessoin域對象的生命週期:
創建:用戶每一次訪問時,服務器創建session
銷燬:如果用戶的session 30分鐘沒有使用,服務器就會銷燬session,我們在web.xml裏面也可以配置session失效時間
(生命週期相對ServletContext較短,如果沒有設置銷燬的時間默認30分鐘關閉)
<!-- session的銷燬時間配置 配置的時間是按照分鐘來算的不能有小數 (默認是30分鐘)-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
HttpSessionListener接口用於監聽HttpSession的創建和銷燬
創建一個Session時,sessionCreated(HttpSessionEvent se)方法將會被調用。
銷燬一個Session時,sessionDestroyed (HttpSessionEvent se)方法將會被調用。
3.監聽HttpRequest域對象創建和銷燬
servletRequest域對象的生命週期:
創建:用戶每一次訪問,都會創建一個reqeust
銷燬:當前訪問結束,request對象就會銷燬
(生命週期較短,當訪問一個頁面時創建,結束訪問時就會銷燬)
ServletRequestListener 接口用於監聽ServletRequest 對象的創建和銷燬。
Request 對象被創建時,監聽器的requestInitialized方法將會被調用。
Request對象被銷燬時,監聽器的requestDestroyed方法將會被調用。
五、監聽三個域對象屬性變化
Servlet規範定義的監聽三個對象屬性變更信息事件的監聽器接口分別是:
- ServletContextAttributeListener,
- HttpSessionAttributeListener ,
- ServletRequestAttributeListener
這三個接口中都定義了三個方法來處理被監聽對象中的屬性的增加,刪除和替換的事件,同一個事件在這三個接口中對應的方法名稱完全相同,只是接受的參數類型不同。
屬性監聽器主要有三種方法:
1. attributeAdded方法
當向被監聽器對象中增加一個屬性時,web容器就調用事件監聽器的attributeAdded方法進行相應,這個方法接受一個事件類型的參數,監聽器可以通過這個參數來獲得正在增加屬性的域對象和被保存到域中的屬性對象
2. attributeRemoved方法
當刪除被監聽對象中的一個屬性時,web容器調用事件監聽器的這個方法進行相應的監聽
3. attributeReplaced方法
當監聽器的域對象中的某個屬性被替換時,web容器調用事件監聽器的這個方法進行相應的監聽
生命週期,和屬性監聽器需要配置web.xml文件
需要添加:
<listener>
<listener-class>監聽器的全類名</listener-class>
</listener>
六、感知Session綁定事件的監聽器
保存在 Session 域中的對象可以有多種狀態:
- 綁定到 Session 中;
- 從 Session 域中解除綁定;
- 隨 Session 對象持久化到一個存儲設備中(鈍化)
- 隨 Session 對象從一個存儲設備中恢復(活化)
Servlet 規範中定義了兩個特殊的監聽器接口來幫助 JavaBean對象瞭解自己在Session域中的這些狀態:
- HttpSessionBindingListener接口
- HttpSessionActivationListener接口
(實現這兩個接口的類不需要 web.xml文件中進行註冊)
1.實現HttpSessionBindingListener接口
實現了HttpSessionBindingListener接口的JavaBean對象可以感知自己被綁定到Session中和從Session中刪除的事件:
綁定對象:
當對象被綁定到 HttpSession 對象中時,web 服務器調用該對象的
void valueBound(HttpSessionBindingEvent event)方法
當對象從 HttpSession 對象中解除綁定時,web 服務器調用該對象的
void valueUnbound(HttpSessionBindingEvent event)方法
2.實現httpSessionActivationListenter接口:
實現了HttpSessionActivationListener接口的JavaBean對象可以感知自己被活化和鈍化的事件
當綁定到HttpSessoion 對象中的對象將要隨HttpSession對象被鈍化之前,web服務器調用如下方法,
sessionWillPassivate(HttpSessionBindingEvent event)方法;
當綁定到 HttpSession 對象中的對象將要隨 HttpSession 對象被活化之後,web服務器調用該對象的
void sessionDidActive(HttpSessionBindingEvent event)方法
(注意:實現HttpSessionBindingListener接口還必須實現Serializable序列化接口。)
詳解請看本博客 HttpSession的四個常用監聽器的區別
重點:三類事件概述,八個接口六個Event類別
Servlet 中的 Listener 和 Event:
1. 在 JSP 2.0/Servlet 2.4 中,共有八個 Listener 接口,六個 Event 類別。
ServletContextListener 接口
[ 接口方法 ] contextInitialized() 與 contextDestroyed()
[ 接收事件 ] ServletContextEvent
[ 觸發場景 ] 在 Container 加載 Web 應用程序時(例如啓動 Container 之後),會呼叫 contextInitialized() ,而當容器移除 Web 應用程序時,會呼叫 contextDestroyed () 方法。
2. ServletContextAttributeListener
[ 接口方法 ] attributeAdded() 、 attributeReplaced() 、 attributeRemoved()
[ 接收事件 ] ServletContextAttributeEvent
[ 觸發場景 ] 若有對象加入爲 application ( ServletContext )對象的屬性,則會呼叫 attributeAdded() ,同理在置換屬性與移除屬性時,會分別呼叫 attributeReplaced() 、 attributeRemoved() 。
3. HttpSessionListener
[ 接口方法 ] sessionCreated() 與 sessionDestroyed ()
[ 接收事件 ] HttpSessionEvent
[ 觸發場景 ] 在 session ( HttpSession )對象建立或被消滅時,會分別呼叫這兩個方法。
4. HttpSessionAttributeListener
[ 接口方法 ] attributeAdded() 、 attributeReplaced() 、 attributeRemoved()
[ 接收事件 ] HttpSessionBindingEvent
[ 觸發場景 ] 若有對象加入爲 session ( HttpSession )對象的屬性,則會呼叫 attributeAdded() ,同理在置換屬性與移除屬性時,會分別呼叫 attributeReplaced() 、 attributeRemoved() 。
5. HttpSessionActivationListener
[ 接口方法 ] sessionDidActivate() 與 sessionWillPassivate()
[ 接收事件 ] HttpSessionEvent
[ 觸發場景 ] Activate 與 Passivate 是用於置換對象的動作,當 session 對象爲了資源利用或負載平衡等原因而必須暫時儲存至硬盤或其它儲存器時(透 過對象序列化),所作的動作稱之爲 Passivate ,而硬盤或儲存器上的session 對象重新加載 JVM 時所採的動作稱之爲 Activate ,所以容 易理解的, sessionDidActivate() 與sessionWillPassivate() 分別於 Activeate 後與將 Passivate 前呼叫。
6. ServletRequestListener
[ 接口方法 ] requestInitialized() 與 requestDestroyed()
[ 接收事件 ] RequestEvent
[ 觸發場景 ] 在 request ( HttpServletRequest )對象建立或被消滅時,會分別呼叫這兩個方法。
7. ServletRequestAttributeListener
[ 接口方法 ] attributeAdded() 、 attributeReplaced() 、 attributeRemoved()
[ 接收事件 ] HttpSessionBindingEvent
[ 觸發場景 ] 若有對象加入爲 request ( HttpServletRequest )對象的屬性,則會呼叫 attributeAdded() ,同理在置換屬性與移除屬性時,會分別呼叫 attributeReplaced() 、 attributeRemoved() 。
8. HttpSessionBindingListener
[ 接口方法 ] valueBound() 與 valueUnbound()
[ 接收事件 ] HttpSessionBindingEvent
[ 觸發場景 ] 實現 HttpSessionBindingListener 接口的類別,其實例如果被加入至 session ( HttpSession )對象的屬性中,則會 呼叫 valueBound() ,如果被從 session ( HttpSession )對象的屬性中移除,則會呼叫valueUnbound() ,實現 HttpSessionBindingListener 接口的類別不需在 web.xml 中設定。
具體使用方法:在 web.xml 中添加如下語句:
< listener >
< listener -class > com.servlet .listener .實現Listenter接口的類 < /listener -class >
< /listener >
類 com.servlet .listener . 爲你的包名。