JavaWeb三大元件之監聽器Listener
阿新 • • 發佈:2019-02-09
JavaWeb元件
- 三大元件
- Servlet
- Listener
- Filter
JavaWeb監聽器
- 三大域
- ServletContext
- HttpSession
- ServletRequest
- 監聽器
- 生命週期監聽 (兩個方法)
- 屬性監聽 (三個方法)
- 具體監聽器介面
- ServletContext
ServletContextListener:兩個方法(分別是在建立當前域物件和當前域物件死亡時呼叫)
contextDestroyed(ServletContextEvent sce) ServletContext物件銷燬前呼叫該方法
contextInitialized(ServletContextEvent sce) ServletContext物件建立後呼叫該方法attributeAdded(ServletContextAttributeEvent event) 新增屬性時呼叫
attributeRemoved(ServletContextAttributeEvent event) 移除屬性時呼叫
attributeReplaced(ServletContextAttributeEvent event) 替換屬性時呼叫 - HttpSession
HttpSessionListener:兩個方法(分別是在建立當前域物件和當前域物件死亡時呼叫)
sessionCreated(HttpSessionEvent se) HttpSession物件建立後呼叫
sessionDestroyed(HttpSessionEvent se) HttpSession物件銷燬前呼叫attributeAdded(HttpSessionBindingEvent event) 新增屬性時呼叫
attributeRemoved(HttpSessionBindingEvent event) 替換屬性時呼叫
attributeReplaced(HttpSessionBindingEvent event) 移除屬性時呼叫 - ServletRequest
ServletRequestListener:兩個方法(分別是在建立當前域物件和當前域物件死亡時呼叫)
requestInitialized(ServletRequestEvent sre) ServletRequest物件建立後呼叫
requestDestroyed(ServletRequestEvent sre) ServletRequest物件銷燬前呼叫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("即將被鈍化");
}
}