1. 程式人生 > >Servlet八大監聽器

Servlet八大監聽器

監聽器的分類

監聽域物件自身建立和銷燬的監聽器:

①ServletContextListener介面 監聽 SercvletContext物件

②HttpSessionListener介面 監聽 HttpSession物件

③ServletRequestListener介面 監聽 ServletRequest物件

監聽域物件中的屬性的增加、修改和刪除的事件監聽器

④ServletContextAttributeListener介面 監聽 SercvletContext物件屬性

⑤HttpSessionAttributeListener介面 監聽 HttpSession物件屬性

⑥ServletRequestAttributeListener介面 監聽 ServletRequest物件屬性

監聽繫結到 HttpSession 域中某個物件的狀態的事件監聽器

⑦HttpSessionBindingListener介面 監聽 實現了HttpSessionBindingListener介面的物件的session繫結和解除

⑧HttpSessionActivationListener介面 (實現會話的持久化)

監聽器的包含類及其作用

①ServletContextListener

相關方法

contextInitialized(ServletContextEvent arg0):在Web應用載入的時候被呼叫

contextDestroyed(ServletContextEvent arg0): 在Web應用解除安裝的時候被呼叫

arg0.getServletContext()可獲取當前應用的上下文物件

該監聽器的作用:

對相關資源進行初始化工作,如建立資料庫連線池、建立Spring IOC 容器、讀取當前Web應用的初始化引數等

②HttpSessionListener

相關方法

sessionCreated(HttpSessionEvent arg0): Session建立時被呼叫

sessionDestroyed(HttpSessionEvent arg0): Session銷燬時被呼叫

Session什麼時候銷燬?

關閉伺服器、Session過期、手動呼叫session.invalidate()方法

注意:使用者關閉瀏覽器時原有Session並不會銷燬,會等到timeout超時自動銷燬

該監聽器的作用:

統計線上人數、記錄訪問日誌等

③ServletRequestListener

相關方法

requestInitialized(ServletRequestEvent arg0): Request建立時被呼叫

requestDestroyed(ServletRequestEvent arg0): Request銷燬時被呼叫

每次請求相應會建立一次和銷燬一次

即每次重新整理頁面都會導致Request的建立和銷燬

轉發是一次響應,可以獲取Request的資訊

重定向是兩次響應,即前一個頁面的Request物件和重定向後的頁面的Request物件不是同一個物件,因此不能獲得前一個物件的Request資訊

該監聽器的作用:

讀取引數,記錄訪問歷史等

④ServletContextAttributeListener

相關方法

attributeAdded(ServletContextAttributeEvent arg0): request.getServletContext().setAttribute("name","value")初次建立呼叫

attributeReplaced(ServletContextAttributeEvent arg0): request.getServletContext().setAttribute("name","newValue")被修改時呼叫

attributeRemoved(ServletContextAttributeEvent arg0): 執行request.getServletContext().removeAttribute("name")時呼叫

以上三個方法中可用arg0.getName()獲取屬性名arg0.getValue()獲取屬性值,但是要注意在attributeReplaced()中獲取的是舊的值

⑤HttpSessionAttributeListener

相關方法

attributeAdded(HttpSessionBindingEvent arg0): session.setAttribute("name", "sessionValue")初次建立呼叫

attributeReplaced(HttpSessionBindingEvent arg0): session.setAttribute("name", "newSessionValue")被修改時呼叫

attributeRemoved(HttpSessionBindingEvent arg0): 執行session.removeAttribute("name")時呼叫

以上三個方法中可用arg0.getName()獲取屬性名arg0.getValue()獲取屬性值,但是要注意在attributeReplaced()中獲取的是舊的值

⑥ServletRequestAttributeListener

相關方法

attributeAdded(ServletRequestAttributeEvent arg0): request.setAttribute("name", "requestValue")初次建立呼叫

attributeReplaced(ServletRequestAttributeEvent arg0): request.setAttribute("name", "newRequestValue")被修改時呼叫

attributeRemoved(ServletRequestAttributeEvent arg0): 執行request.removeAttribute("name")時呼叫

以上三個方法中可用arg0.getName()獲取屬性名arg0.getValue()獲取屬性值,但是要注意在attributeReplaced()中獲取的是舊的值

⑦HttpSessionBindingListener

前提:javaBean實現了該介面

相關方法

valueBound(HttpSessionBindingEvent arg0): session.setAttribute("name", javaBean)觸發繫結方法

valueUnbound(HttpSessionBindingEvent arg0): session.removeAttribute("name")觸發繫結解除方法

⑧HttpSessionActivationListener

實現會話的持久化

前提:實現該介面和序列化介面Serializable

可以感知自己被活化(從硬碟到記憶體)和鈍化(從記憶體到硬碟)的過程

當伺服器突然關閉,使用者的session就不存在了,即使用者就需要重新登入等操作,這樣很麻煩,於是我們就需要實現會話的持久化來解決。

可以讓我們在重新啟動伺服器之後使用者的session還在伺服器中存在

相關方法

sessionWillPassivate(HttpSessionEvent arg0): 鈍化方法,關閉伺服器呼叫的方法

可以將使用者的Session儲存到tomcat目錄下的/work/Catalina/localhost/專案名 下的SESSION.ser檔案中

sessionDidActivate(HttpSessionEvent arg0): 活化方法,重新啟動伺服器時呼叫

Session從硬盤迴復到記憶體中,目錄下的SESSION.ser檔案小消失