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檔案小消失