JavaWeb中的監聽器是Servlet規範中定義的一種特殊類,它用於監聽web應用程序中的ServletContext, HttpSession和 ServletRequest等域對象的建立與銷燬事件,以及監聽這些域對象中的屬性發生修改的事件。java
在Servlet規範中定義了多種類型的監聽器,它們用於監聽的事件源分別爲ServletContext,HttpSession和ServletRequest這三個域對象 web
Servlet規範針對這三個對象上的操做,又把多種類型的監聽器劃分爲三種類型:服務器
監聽域對象自身的建立和銷燬的事件監聽器。session
監聽域對象中的屬性的增長和刪除的事件監聽器。app
監聽綁定到HttpSession域中的某個對象的狀態的事件監聽器。jsp
ServletContextListener接口用於監聽ServletContext對象的建立和銷燬事件。實現了ServletContextListener接口的類均可以對ServletContext對象的建立和銷燬進行監聽。ide
當ServletContext對象被建立時,激發contextInitialized (ServletContextEvent sce)方法。spa
當ServletContext對象被銷燬時,激發contextDestroyed(ServletContextEvent sce)方法。code
ServletContext域對象建立和銷燬時機: xml
建立:服務器啓動針對每個Web應用建立ServletContext
銷燬:服務器關閉前先關閉表明每個web應用的ServletContext
(1)編寫監聽器
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class MyServletContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("ServletContext對象建立"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("ServletContext對象銷燬"); }
(2)web.xml文件中註冊監聽器
咱們在上面的中講到,要想監聽事件源,那麼必須將監聽器註冊到事件源上纔可以實現對事件源的行爲動做進行監聽,在JavaWeb中,監聽的註冊是在web.xml文件中進行配置的。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 註冊針對ServletContext對象進行監聽的監聽器 --> <listener> <description>ServletContextListener監聽器</description> <!--實現了ServletContextListener接口的監聽器類 --> <listener-class>me.gacl.web.listener.MyServletContextListener</listener-class> </listener> </web-app>
HttpSessionListener 接口用於監聽HttpSession對象的建立和銷燬
建立一個Session時,激發sessionCreated (HttpSessionEvent se) 方法
銷燬一個Session時,激發sessionDestroyed (HttpSessionEvent se) 方法。
(1)編寫監聽器
import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class MyHttpSessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println( se.getSession() + "建立了!!"); } /* HttpSession的銷燬時機須要在web.xml中進行配置,以下: * <session-config> <session-timeout>1</session-timeout> </session-config> 這樣配置就表示session在1分鐘以後就被銷燬 */ @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session銷燬了!!"); } }
(2)web.xml文件中註冊監聽器
<!--註冊針對HttpSession對象進行監聽的監聽器--> <listener> <description>HttpSessionListener監聽器</description> <listener-class>me.gacl.web.listener.MyHttpSessionListener</listener-class> </listener> <!-- 配置HttpSession對象的銷燬時機 --> <session-config> <!--配置HttpSession對象的1分鐘以後銷燬 --> <session-timeout>1</session-timeout> </session-config>
ServletRequestListener接口用於監聽ServletRequest 對象的建立和銷燬 :
Request對象被建立時,監聽器的requestInitialized(ServletRequestEvent sre)方法將會被調用
Request對象被銷燬時,監聽器的requestDestroyed(ServletRequestEvent sre)方法將會被調用
ServletRequest域對象建立和銷燬時機:
建立:用戶每一次訪問都會建立request對象
銷燬:當前訪問結束,request對象就會銷燬
(1)編寫監聽器
import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; public class MyServletRequestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent sre) { System.out.println(sre.getServletRequest() + "銷燬了!!"); } @Override public void requestInitialized(ServletRequestEvent sre) { System.out.println(sre.getServletRequest() + "建立了!!"); } }
(2)web.xml文件中註冊監聽器
<!--註冊針對ServletRequest對象進行監聽的監聽器--> <listener> <description>ServletRequestListener監聽器</description> <listener-class>me.gacl.web.listener.MyServletRequestListener</listener-class> </listener>
域對象中屬性的變動的事件監聽器就是用來監聽 ServletContext, HttpSession, HttpServletRequest 這三個對象中的屬性變動信息事件的監聽器。
這三個監聽器接口分別是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,這三個接口中都定義了三個方法來處理被監聽對象中的屬性的增長,刪除和替換的事件,同一個事件在這三個接口中對應的方法名稱徹底相同,只是接受的參數類型不一樣。
本身編寫監聽器後須要在web.xml中進行註冊:
<listener> <description>MyServletContextAttributeListener監聽器</description> <listener-class>me.gacl.web.listener.MyServletContextAttributeListener</listener-class> </listener>
當向被監聽對象中增長一個屬性時,web容器就調用事件監聽器的attributeAdded方法進行響應,這個方法接收一個事件類型的參數,監聽器能夠經過這個參數來得到正在增長屬性的域對象和被保存到域中的屬性對象 。
各個域屬性監聽器中的完整語法定義爲:
public void attributeAdded(ServletContextAttributeEvent scae) public void attributeAdded(HttpSessionBindingEvent hsbe) public void attributeAdded(ServletRequestAttributeEvent srae)
當刪除被監聽對象中的一個屬性時,web容器調用事件監聽器的attributeRemoved方法進行響應
各個域屬性監聽器中的完整語法定義爲:
public void attributeRemoved(ServletContextAttributeEvent scae) public void attributeRemoved (HttpSessionBindingEvent hsbe) public void attributeRemoved (ServletRequestAttributeEvent srae)
當監聽器的域對象中的某個屬性被替換時,web容器調用事件監聽器的attributeReplaced方法進行響應
各個域屬性監聽器中的完整語法定義爲:
public void attributeReplaced(ServletContextAttributeEvent scae) public void attributeReplaced (HttpSessionBindingEvent hsbe) public void attributeReplaced (ServletRequestAttributeEvent srae)
保存在Session域中的對象能夠有多種狀態:綁定(session.setAttribute(「bean」,Object))到Session中;從 Session域中解除(session.removeAttribute(「bean」))綁定;隨Session對象持久化到一個存儲設備中;隨Session對象從一個存儲設備中恢復 。
Servlet 規範中定義了兩個特殊的監聽器接口「HttpSessionBindingListener和HttpSessionActivationListener」來幫助JavaBean 對象瞭解本身在Session域中的這些狀態,實現這兩個接口的類不須要 web.xml 文件中進行註冊。
實現了HttpSessionBindingListener接口的JavaBean對象能夠感知本身被綁定到Session中和 Session中刪除的事件:
當對象被綁定到HttpSession對象中時,web服務器調用該對象的void valueBound(HttpSessionBindingEvent event)方法
當對象從HttpSession對象中解除綁定時,web服務器調用該對象的void valueUnbound(HttpSessionBindingEvent event)方法
實現了HttpSessionActivationListener接口的JavaBean對象能夠感知本身被活化(反序列化)和鈍化(序列化)的事件 :
當綁定到HttpSession對象中的javabean對象將要隨HttpSession對象被鈍化(序列化)以前,web服務器調用該javabean對象的void sessionWillPassivate(HttpSessionEvent event) 方法。這樣javabean對象就能夠知道本身將要和HttpSession對象一塊兒被序列化(鈍化)到硬盤中.
當綁定到HttpSession對象中的javabean對象將要隨HttpSession對象被活化(反序列化)以後,web服務器調用該javabean對象的void sessionDidActive(HttpSessionEvent event)方法。這樣javabean對象就能夠知道本身將要和 HttpSession對象一塊兒被反序列化(活化)回到內存中