1. 程式人生 > >JavaWeb三大元件 —— Listener監聽器——生命週期監聽器(3個)

JavaWeb三大元件 —— Listener監聽器——生命週期監聽器(3個)

目錄
    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>