JavaWeb三大元件 —— Listener監聽器——生命週期監聽器(3個)
阿新 • • 發佈:2018-12-13
目錄 1、JavaWeb八大監聽器概述 2、生命週期監聽器(3個) 3、操作域屬性的監聽器(3個) 4、相關HttpSession的感知監聽器(2個) =================================================================================================== 1、JavaWeb八大監聽器概述 JavaWeb三大元件:Servlet、Listener、Filter,其中Servlet在之前的博文中已經做了較為詳細的講解,下面開始拆解Listener監聽器。 JavaWeb中的八大監聽器,三大域物件各有一個生命週期監聽器和屬性操作監聽器,共計6個;還有2個與HttpSession相關的感知型監聽器。 Listener:監聽器 1.它是一個介面,內容由我們來實現; 2.它需要註冊在事件源上,例如註冊在按鈕上; 3.監聽器中的方法,會在特殊事件發生時被呼叫! 在JavaWeb被監聽的事件源為JavaWeb的三大域物件:ServletContext、HttpSession、ServletRequest 功能:監聽域物件"建立"與"銷燬"的監聽器;(生命週期監聽器3個) 監聽域物件"操作域屬性"的監聽器;(屬性操作監聽器3個) 感知型監聽器。(2個) 2、生命週期監聽器(3個) 一共有三個,每個域物件各一個,需要在web.xml檔案中配置監聽器: ServletContextListener:Tomcat啟動和關閉時呼叫下面兩個方法 public void contextInitialized(ServletContextEvent evt):ServletContext物件被建立後呼叫; public void contextDestroyed(ServletContextEvent evt):ServletContext物件被銷燬前呼叫; HttpSessionListener:開始會話和結束會話時呼叫下面兩個方法 public void sessionCreated(HttpSessionEvent evt):HttpSession物件被建立後呼叫; public void sessionDestroyed(HttpSessionEvent evt):HttpSession物件被銷燬前呼叫; ServletRequestListener:開始請求和結束請求時呼叫下面兩個方法 public void requestInitiallized(ServletRequestEvent evt):ServletRequest物件被建立後呼叫; public void requestDestroyed(ServletRequestEvent evt):ServletRequest物件被銷燬前呼叫。 生命週期監聽器引數:事件物件 ServletContextEvent:方法 ServletContext getServletContext(); HttpSeessionEvent:方法 HttpSession getSession(); ServletRequestEvent:方法 ServletRequest getServletRequest() ServletContext getServletContext() 編寫測試例子: 編寫MyServletContextListener類,實現ServletContextListener介面; 在web.xml檔案中配置監聽器; 為了看到session銷燬的效果,在web.xml檔案中設定session失效時間為1分鐘; /* * ServletContextListener實現類 * contextDestroyed() -- 在ServletContext物件被銷燬前呼叫 * contextInitialized() -- -- 在ServletContext物件被建立後呼叫 * ServletContextEvent -- 事件類物件 * 該類有getServletContext(),用來獲取ServletContext物件,即獲取事件源物件 */ public class MyServletContextListener implements ServletContextListener { public void contextInitialized(ServletContextEvent evt) { System.out.println("ServletContext物件被建立後呼叫,已建立ServletContext物件"); } public void contextDestroyed(ServletContextEvent evt) { System.out.println("ServletContext物件被銷燬前呼叫,即將銷燬ServletContext物件"); } } /* * HttpSessionListener實現類 * sessionCreated() -- 在HttpSession物件被建立後被呼叫 * sessionDestroyed() -- -- 在HttpSession物件被銷燬前呼叫 * HttpSessionEvent -- 事件類物件 * 該類有getSession(),用來獲取當前HttpSession物件,即獲取事件源物件 */ public class MyHttpSessionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent evt) { System.out.println("建立session物件"); } public void sessionDestroyed(HttpSessionEvent evt) { System.out.println("銷燬session物件"); } } /* * ServletRequestListener實現類 * requestDestroyed() -- 在ServletRequest物件被銷燬前呼叫 * requestInitialized() -- 在ServletRequest物件被建立後呼叫 * ServletRequestEvent -- 事件類物件 * 該類有getServletContext(),用來獲取ServletContext物件 * 該類有getServletRequest(),用來獲取當前ServletRequest物件,即事件源物件 */ public class MyServletRequestListener implements ServletRequestListener { public void requestDestroyed(ServletRequestEvent evt) { System.out.println("銷燬request物件"); } public void requestInitialized(ServletRequestEvent evt) { System.out.println("建立request物件"); } } <listener> <listener-class>cn.zzq.listener.MyServletContextListener</listener-class> </listener> <listener> <listener-class>cn.zzq.listener.MyHttpSessionListener</listener-class> </listener> <listener> <listener-class>cn.zzq.listener.MyServletRequestListener</listener-class> </listener> <session-config> <session-timeout>1</session-timeout> //session過期時間為1分鐘,單位:分鐘 </session-config>