22.【Servlet事件監聽器】
Servlet事件監聽器概述
在Java開發中,對於事件的處理非常重要,比如響應鍵盤的輸入、滑鼠的點選、視窗的移動等等都要涉及到Java事件的應用。
事件監聽器用於對程式中發生的事件進行監聽,在監聽 的過程中會涉及到以下幾個重要部分。
事件(Event):使用者的一個操作,如單擊一個按鈕、呼叫一個方法、建立一個物件等
事件源:產生事件的物件
事件監聽器(Listener):負責監聽發生在事件源上的事件
事件處理器:監聽器的成員方法,當事件發生的時候觸發對應的處理器(成員方法)。當用戶進行一個操作觸發事件源上的事件時,就會被事件監聽器監聽到,當監聽器聽到事件發生時,相應的事件處理器就會對發生的事件進行處理。
事件監聽器工作時,可分為幾個步驟,具體如下:
將監聽器繫結到事件源,也就是註冊監聽器。
事件發生時會觸發監聽器的成員方法,即事件處理器,傳遞事件物件
事件處理器通過事件物件獲得事件源,並對事件源進行處理。
在開發Web應用程式時,也經常會使用事件監聽器,這個事件監聽器被稱為Servlet事件監聽器,Servlet事件監聽器就是一個實現特定介面的Java程式,專門用於監聽Web應用程式中ServletContext(application)、HttpSession(session)和ServletRequest(request)等域物件的建立和銷燬過程,監聽這些域物件屬性的修改以及感知繫結到HttpSession域中某個物件的狀態。
根據監聽事件的不同可以將其分為三類。
用於監聽域物件建立和銷燬的事件監聽器(ServletContextListener介面、HttpSessionListener介面、ServletRequestListener介面)
用於監聽域物件屬性增加和刪除的事件監聽器(ServletContextAttribteListener介面、HttpSessionAttributeListener介面,ServletRequestAttributeListener介面)
用於監聽繫結到HttpSession域中某個物件狀態的事件監聽器(HttpSessionBindingListener介面、HttpSessionActivationListener介面)
在Servlet規範中,這三類事件監聽器都定義了相應的介面,在編寫事件監聽器程式時只需實現對應的介面就可以。Web伺服器會根據監聽器所實現的介面,把它註冊到被監聽的物件上,當觸發了某個物件的監聽事件時,Web容器將會呼叫Servlet監聽器與之相關的方法對事件進行處理。
任務一 --監聽域物件的生命週期
1.任務目標:
要想對Servlet域物件的生命週期進行監聽,首先需要實現域對應的ServletContextListener、HttpSessionListener和ServletRequestListener介面,這些介面中的方法和執行過程非常類似。可以為每一個監聽器編寫一個單獨的類,也可以用一個類來實現這3個介面,從而讓這個類具有3個事件監聽器的功能。
2.實現步驟
2.1 編寫監聽器類
編寫監聽器類,這個類實現了ServletContextListener、HttpSessionListener和ServletRequestListener三個監聽器介面,並實現了這些介面中的所有方法.
public class MyListener implements ServletContextListener,
HttpSessionListener,ServletRequestListener {
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 物件被建立了....");
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext 物件被銷燬了....");
}
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session 物件被建立了....");
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session 物件被銷燬了....");
}
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("Request 物件被銷燬了....");
}
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("Request 物件被建立了....");
}
在web.xml中註冊監聽器類
<listener>
<listener-class>MyListener</listener-class>
</listener>
執行http://localhost:8080/indexjsp檢視執行結果
任務二–監聽域物件的屬性變更
1.任務目標
ServletContext、HttpSession和ServletRequest這三個物件,都可以建立、刪除和修改它們各自的屬性,為了監聽這三個物件的屬性變更,Servlet API專門提供了一些介面:ServletContextAttributeListener、HttpSessionAttributeListener和ServletRequestAttributeListener介面,分別用於監聽ServletContext物件中的屬性變更,監聽HttpSession物件中的屬性變更、監聽ServletRequest物件中的屬性變更。 通過所學監聽器知識,學生學會使用監聽器監聽域物件的屬性變更
2.實現步驟
2.1 建立監聽器MyAttributeListener.java(使用註解方式建立)
@WebListener()
public class MyAttribteListener implements ServletContextAttributeListener,
HttpSessionAttributeListener,ServletRequestAttributeListener {
//attributeAdded是增加一個屬性時呼叫。監聽器可以通過裡面的引數來獲取正在增加屬性的域物件和被儲存到域中的屬性物件
//ServletRequestAttributeEvent 可以獲取ServletRequest這個域物件。
public void attributeAdded(ServletContextAttributeEvent sae) {
String name = sae.getName();
System.out.println("ServletContext新增屬性:" + name + "=" +sae.getServletContext().getAttribute(name));
}
public void attributeRemoved(ServletContextAttributeEvent sae)
{
String name = sae.getName();
System.out.println("ServletContext移除屬性: " + name);
}
public void attributeReplaced(ServletContextAttributeEvent sae)
{
String name = sae.getName();
System.out.println("ServletContext替換屬性:" + name + "=" +sae.getServletContext().getAttribute(name));
}
public void attributeAdded(HttpSessionBindingEvent hbe) {
String name = hbe.getName();
System.out.println("HttpSession新增屬性:" + name + "=" +hbe.getSession().getAttribute(name));
}
public void attributeRemoved(HttpSessionBindingEvent hbe) {
String name = hbe.getName();
System.out.println("HttpSession移除屬性: " + name);
}
public void attributeReplaced(HttpSessionBindingEvent hbe) {
String name = hbe.getName();
System.out.println("HttpSession替換屬性:" + name + "=" +hbe.getSession().getAttribute(name));
}
public void attributeAdded(ServletRequestAttributeEvent sra) {
String name = sra.getName();
System.out.println("ServletRequest新增屬性:" + name + "=" +sra.getServletRequest().getAttribute(name));
}
public void attributeRemoved(ServletRequestAttributeEvent sra)
{
String name = sra.getName();
System.out.println("ServletRequest移除屬性: " + name);
}
public void attributeReplaced(ServletRequestAttributeEvent sra)
{
String name = sra.getName();
System.out.println("ServletRequest替換屬性:" + name + "=" +sra.getServletRequest().getAttribute(name));
}
}
2.2 製作測試程式testattribute.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>這是一個測試物件屬性資訊監聽器的頁面</h3>
<%
pageContext.getServletContext().setAttribute("username","itcast");
pageContext.getServletContext().setAttribute("username","itheima");
pageContext.getServletContext().removeAttribute("username");
session.setAttribute("username","itcast");
session.setAttribute("username","itheima");
session.removeAttribute("username");
request.setAttribute("username","itcast");
request.setAttribute("username","itheima");
request.removeAttribute("username");
%>
</body>
</html>
執行http://localhost:8080/testattribute.jsp 可以看到執行結果。