27、監聽器學習

guanhang89發表於2016-06-11

監聽器

監聽器:
 * Java Web的三大元件:Servlet、Listener、Filter.
 * 注意:
   * listener的觸發或呼叫,是不需要我們關注的.(Tomcat伺服器)
   * Tomcat與JavaEE的版本是有對應的.
     * Tomcat 7.0版本 - Servlet 3.0
     * Tomcat 6.0版本 - Servlet 2.5
   * 開發原則:不要追新.
   * Listener對於我們來講:如何編寫.
 * 八大監聽器:
   * 第一組:用於監聽Servlet三個域物件的建立與銷燬
     * ServletRequestListner
     * HttpSessionListener
     * ServletContextListener
   * 第二組:用於監聽Servlet三個域物件的屬性變化(設定、刪除、修改)
     * ServletRequestAttributeListener
     * HttpSessionAttributeListener
     * ServletContextAttributeListener
   * 第三組:用於通知被繫結到Session物件的屬性.
     * HttpSessionBindingListener
   * 第四組:用於監聽Session的鈍化與活化
     * HttpSessionActivationListener
 * 第一組:
   * 作用:用於監聽Servlet三個域物件的建立與銷燬.
   * 三個域物件的建立與銷燬:
     * Request物件:
       * 建立:發生請求時.
       * 銷燬:請求完成時.
     * Session物件:
       * 建立:發生請求時,並且執行getSession()語句.
       * 銷燬:執行Session的銷燬方法invalidate().
     * ServletContext物件:
       * 建立:Tomcat啟動時.
       * 銷燬:Tomcat關閉時.
 * 如何自定義監聽器:
   * 第一步:
     * 建立Java類,實現上述八個監聽器介面之一.
     * 重寫該介面提供的所有方法.
   * 第二步:
     * 在web.xml檔案中配置Listener.
       <listener>
         <listener-class>自定義Listener的完整路徑</listener-class>
       </listener>
 * 第三組:HttpSessionBindingListener
   * 注意:
     * 該監聽器應該由JavaBean類實現.(可以將JavaBean繫結到Session上)
     * 誰被繫結到Session上,誰就實現該監聽器.
     * 該監聽器的作用:通知被繫結到Session的JavaBean物件.
     * 使用該監聽器時,不需要在web.xml檔案中進行配置的. 
 * 第四組:HttpSessionActivationListener
   * Session的序列化
     * 當Tomcat伺服器正常關閉後,Session會自動被儲存到本地硬碟中.
       * 在Tomcat伺服器的安裝目錄:%Catalina_HOME%\work\Catalina\localhost\Web工程名目錄中.
     * 當Tomcat伺服器正常啟動後,Session會自動從本地硬碟中讀取到記憶體中.
       * 儲存在本地硬碟中的序列化檔案,自動銷燬.
     * 問題:
       * Tomcat伺服器為什麼提供這麼一個機制?
   * Session的鈍化與活化
     * 實現步驟:
       * 編寫Servlet設定Session.
       * 在Tomcat安裝目錄%Catalina_HOME%\conf\Catalina\localhost目錄中,建立一個名為Web工程名的xml檔案.
        <?xml version="1.0" encoding="UTF-8"?>
    <Context>
        <!-- maxIdleSwap:指定多長時間後Session會被鈍化.(單位為分鐘) -->
        <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1" >
            <!-- 
                directory:指定鈍化檔案的儲存目錄.
                鈍化檔案儲存路徑:${CATALINA_HOME}\work\Catalina\localhost\Web工程名\${sessionid}.session
            -->
            <Store className="org.apache.catalina.session.FileStore" directory="mysession" />
        </Manager>
    </Context>
       * 建立JavaBean,用於繫結到Session中.
         * 該JavaBean實現了HttpSessionActivationListener介面,並且重寫該介面提供的所有方法.
     * 該JavaBean實現了Serializable(序列化)介面(Session的鈍化與活化是基於Session的序列化實現的)
     * Session鈍化與活化和序列化的區別:
       * Session序列化:
         * Tomcat提供的自動機制.
     * Session的序列化檔案在重新被使用時,消失.
       * Session鈍化與活化:
         * 手動實現.
     * Session的鈍化檔案並不消失.
 * 擴充套件:
   * Servlet的三大域物件:
     * Request物件 - 一次請求
     * Session物件 - 一次會話
     * ServletContext物件 - Tomcat從啟動到關閉
   * JSP的四大域物件:
     * page物件 - 當前頁面
     * Request物件
     * Session物件
     * ServletContext物件

使用案例:

配置:

<!-- session的最大活躍時間 -->
    <session-config>
        <session-timeout>60</session-timeout>
    </session-config>

    <!-- 監聽request物件建立、銷燬 -->
    <listener>
        <listener-class>cn.itcast.a_life.MyRequestListener</listener-class>
    </listener>
    <!-- 監聽session物件建立、銷燬 -->
    <listener>
        <listener-class>cn.itcast.a_life.MySessionListener</listener-class>
    </listener>

    <!-- 監聽servletContext物件建立、銷燬 -->
    <listener>
        <listener-class>cn.itcast.a_life.MyServletContextListener</listener-class>
    </listener>

    <!-- 屬性監聽器 -->
    <listener>
        <listener-class>cn.itcast.b_attr.MySessionAttrListener</listener-class>
    </listener>
/**
 *  監聽request物件的建立或銷燬
 * @author Jie.Yuan
 *
 */
public class MyRequestListener implements ServletRequestListener{

    // 物件銷燬
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        // 獲取request中存放的資料
        Object obj = sre.getServletRequest().getAttribute("cn");
        System.out.println(obj);
        System.out.println("MyRequestListener.requestDestroyed()");
    }

    // 物件建立
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("MyRequestListener.requestInitialized()");
    }
}
/**
 * 監聽ServletContext物件建立或銷燬
 * @author Jie.Yuan
 *
 */
public class MyServletContextListener implements ServletContextListener{

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("MyServletContextListener.contextDestroyed()");
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("1..........MyServletContextListener.contextInitialized()");
    }
}
/**
 * 監聽Session物件建立、銷燬
 * @author Jie.Yuan
 *
 */
public class MySessionListener implements HttpSessionListener{

    // 建立
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("MySessionListener.sessionCreated()");
    }

    // 銷燬
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("MySessionListener.sessionDestroyed()");
    }
}
/**
 * 監聽session物件屬性的變化
 * @author Jie.Yuan
 *
 */
public class MySessionAttrListener implements HttpSessionAttributeListener {

    // 屬性新增
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        // 先獲取session物件
        HttpSession session = se.getSession();
        // 獲取新增的屬性
        Object obj = session.getAttribute("userName");
        // 測試
        System.out.println("新增的屬性:" + obj);
    }

    // 屬性移除
    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        System.out.println("屬性移除");
    }

    // 屬性被替換
    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        // 獲取sesison物件
        HttpSession session = se.getSession();

        // 獲取替換前的值
        Object old = se.getValue();
        System.out.println("原來的值:" + old);

        // 獲取新值
        Object obj_new = session.getAttribute("userName");
        System.out.println("新值:" + obj_new);

    }
}

相關文章