1. 程式人生 > >JavaWeb三大元件之監聽器Listener

JavaWeb三大元件之監聽器Listener

JavaWeb元件

三大元件
Servlet
Listener
Filter

JavaWeb監聽器

三大域
ServletContext
HttpSession
ServletRequest
監聽器
生命週期監聽 (兩個方法)
屬性監聽 (三個方法)
具體監聽器介面
ServletContext
ServletContextListener:兩個方法(分別是在建立當前域物件和當前域物件死亡時呼叫)
contextDestroyed(ServletContextEvent sce) ServletContext物件銷燬前呼叫該方法
contextInitialized(ServletContextEvent sce) ServletContext物件建立後呼叫該方法
ServletContextAttributeListener:三個方法(分別在新增屬性,替換屬性,移除屬性時呼叫)
attributeAdded(ServletContextAttributeEvent event) 新增屬性時呼叫
attributeRemoved(ServletContextAttributeEvent event) 移除屬性時呼叫
attributeReplaced(ServletContextAttributeEvent event) 替換屬性時呼叫
HttpSession
HttpSessionListener:兩個方法(分別是在建立當前域物件和當前域物件死亡時呼叫)
sessionCreated(HttpSessionEvent se) HttpSession物件建立後呼叫
sessionDestroyed(HttpSessionEvent se) HttpSession物件銷燬前呼叫
HttpSessionAttributeListener:三個方法(分別在新增屬性,替換屬性,移除屬性時呼叫)
attributeAdded(HttpSessionBindingEvent event) 新增屬性時呼叫
attributeRemoved(HttpSessionBindingEvent event) 替換屬性時呼叫
attributeReplaced(HttpSessionBindingEvent event) 移除屬性時呼叫
ServletRequest
ServletRequestListener:兩個方法(分別是在建立當前域物件和當前域物件死亡時呼叫)
requestInitialized(ServletRequestEvent sre) ServletRequest物件建立後呼叫
requestDestroyed(ServletRequestEvent sre) ServletRequest物件銷燬前呼叫
ServletRequestAttributeListener:三個方法(分別在新增屬性,替換屬性,移除屬性時呼叫)
attributeAdded(ServletRequestAttributeEvent srae) 新增屬性時呼叫
attributeRemoved(ServletRequestAttributeEvent srae) 移除屬性時呼叫
attributeReplaced(ServletRequestAttributeEvent srae) 替換屬性時呼叫
生命週期方法中的事件(Event)方法
ServletContextEvent
HttpSessionEvent
ServletRequestEvent
事件 方法
ServletContextEvent ServletContext getServletContext()獲取當前ServletContext域物件
HttpSessionEvent HttpSession getSession()獲取當前HttpSession域物件
ServletRequestEvent ServletContext getServletContext()獲取當前ServletContext物件;ServletRequest getServletRequest();獲取當前ServletRequest物件

如何新建監聽器

定義一個監聽器類,實現具體的監聽器介面(此處實現生命週期方法)

package tqb.listener.web.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
    /**
    *
    * 可以在這裡設定一些Tomcat(伺服器)開啟時需要初始化等的一些內容
    * 此處程式碼僅顯示ServletContextListener的實現
    * 其餘自行練習
    * @author tqb
    * 
    */
public class AListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("ServletContext物件銷燬");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("ServletContext物件建立");
    }

}

定義一個監聽器類,實現具體的監聽器介面(此處實現屬性方法)

package tqb.listener.web.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
    /**
    *
    * 此處程式碼僅顯示ServletContextAttributeListener的實現
    * 其餘自行練習
    * @author tqb
    * 
    */
@WebListener
public class BListener implements ServletContextAttributeListener {

    /**
     * 提前在application中設定屬性 application.setAttribute("nameDemo","valueDemo");
     */
    public void attributeAdded(ServletContextAttributeEvent event) {
        // 顯示設定的鍵和值
        System.out.println(event.getName() + "+" + event.getValue());
    }

    /**
     * application.replaceAttribute("nameDemo","valueReplaceDemo");
     */
    public void attributeRemoved(ServletContextAttributeEvent event) {
        // 顯示改之前的鍵和值以及修改過的值
        System.out.println(event.getName() + "+" + event.getValue() + "+"
                + event.getServletContext().getAttribute(event.getName()));
    }

    /**
     * application.removeAttribute("nameDemo");
     */
    public void attributeReplaced(ServletContextAttributeEvent event) {
        // 顯示移除前的鍵和值
        System.out.println(event.getName() + "+" + event.getValue());
    }
}

在web.xml中配置完成註冊

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>listener</display-name>

  <!-- 這裡對監聽器進行註冊 -->
  <listener>
    <listener-class>tqb.listener.web.listener.AListener</listener-class>
  </listener>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

感知監聽器

與HttpSession相關
新增到JavaBean中,而不是新增到三大域中
不需要在配置檔案中註冊
HttpSessionBindingListener
在JavaBean中實現HttpSessionBindingListener介面
重寫以下兩個方法
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
    System.out.println("session中添加了我");
}

@Override
public void valueUnbound(HttpSessionBindingEvent event) {
    System.out.println("session移除了我");
}
session的序列化

在設定session並使用後,若伺服器突然關閉(或出現故障),那麼原本的session則會保留下來,在伺服器重新啟動時可以繼續使用而不會死亡。注:在伺服器突然關閉之後,會在伺服器端的專案路徑下儲存當前正在操作的session檔案,我們稱之為session的序列化,如下圖。
序列化檔案

session的反序列化

在Tomcat的配置檔案cof下的context.xml檔案中新增如下內容。注:新增如下內容後,就不會出現上圖的序列化檔案,伺服器重啟後也無法使用之前的session

<!-- session的反序列化 -->
<Manager pathname="" />
session的鈍化與活化

在伺服器上的session若長時間無人使用時,伺服器會採用一種session鈍化的策略,就是先將這些長時間未使用的session儲存到硬碟中去,當用戶再次使用該session時,伺服器會再次從硬碟中取出供使用者使用,這個過程又叫做活化。注:一個session一個檔案,名稱為sessionID,拿出來使用時硬碟上儲存的session檔案不會刪除。
首先需要在如下目錄新建一個配置檔案(檔名為當前專案名稱)
這裡寫圖片描述
檔案內容為:

<?xml version='1.0' encoding='utf-8'?>
<Context>
    <Manager className="org.apache.catalina.session.PersistentManager" 
        maxIdleSwap="1"><!-- 此處的1代表1分鐘不使用的話鈍化 -->
            <Store className="org.apache.catalina.session.FileStore"
                directory="mysession"/><!-- 在如下圖片的路徑下新建一個musession資料夾(存放鈍化的檔案) -->
    </Manager>
</Context>
這裡寫圖片描述
HttpSessionActivitionListener
JavaBean中實現HttpSessionActivitionListener介面
重寫以下方法
package tqb.listener.web.listener;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

/**
 * 要想讓此JavaBean隨session一起鈍化活化,必須實現序列化介面Serializable
 * @author tqb
 *
 */
public class User implements HttpSessionActivationListener, Serializable {

    @Override
    public void sessionDidActivate(HttpSessionEvent arg0) {
        System.out.println("即將被活化");
    }

    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println("即將被鈍化");
    }
}