Listener監聽器
1.Listener監聽器介紹
- Listener監聽器是JavaWeb三大組件之一,JavaWeb三大組件分別是:Servlet程式,Listener監聽器,Filter過濾器,
- Listener是JavaEE的規范,即介面,
- 監聽器的作用是,監聽某種變化(一般就是物件的創建/銷毀,屬性變化),觸發物件方法完成相應的任務,
- JavaWeb中的監聽器共八個,目前最常用的是ServletContextListener,ServletContextAttributeListener,HttpSessionListener和ServletRequestListener,
2.JavaWeb的監聽器
2.1ServletContextListener監聽器
- 作用:監聽ServletContext創建或者銷毀(當我們web應用啟動時,Tomcat就會創建ServletContext物件),即生命周期監聽
- 應用場景:
- 加載初始化的組態檔;比如spring的組態檔
- 任務調度(配合定時器Timer/TimerTask)
- 相關方法:
- void contextInitialized(ServletContextEvent sce):創建ServletContext物件時觸發
- void contextDestroyed(ServletContextEven sce):銷毀ServletContext物件時觸發
應用實體
-
首先創建一個專案,添加web支持,因為listener監聽器是Servlet規范,要使用就要引入Servlet.jar包
-
創建一個普通類,如果該類實作了某個監聽介面,那么此類就是一個監聽器,該類可以監聽的事件由該類實作的監聽介面決定:
package com.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * 1.當一個類實作了 ServletContextListener 介面時 * 2.該類就是一個監聽器 * 3.該類可以監聽的事件由該類實作的監聽介面決定 ,比如實作ServletContextListener介面, * 那么該類就可以監聽ServletContext物件的創建和銷毀,以此類推 * 4.下面的MyServletContextListener就是一個監聽者 * 5.當web應用啟動時,就會產生ServletContextEvent事件,會呼叫監聽器的對應事件處理方法 * 如:contextInitialized(),同時會傳遞 事件物件 * 6.程式員可以通過 ServletContextEvent 事件物件,來獲取需要的資訊,然后再進行業務處理 * 7.Tomcat怎么知道這個監聽器存在呢? 因為我們需要在web.xml檔案中進行配置, * 一旦配置后,tomcat啟動后就會反射實體化該監聽器,放到容器里面去管理 */ public class MyServletContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { ServletContext servletContext = servletContextEvent.getServletContext(); System.out.println("MyServletContextListener監聽到=" + servletContext + "被創建..."); //如果我們獲取到ServletContext物件..可以進行業務處理 } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { ServletContext servletContext = servletContextEvent.getServletContext(); System.out.println("MyServletContextListener監聽到=" + servletContext + "被銷毀..."); //比如可以對ServletContext 資料進行處理,或者日志的管理... System.out.println("進行處理作業..."); } } -
配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--配置監聽器--> <listener> <listener-class>com.listener.MyServletContextListener</listener-class> </listener> </web-app> -
配置Tomcat
-
點擊啟動tomcat時,我們可以看到監聽器被觸發了:
-
點擊停止tomcat時,可以看到監聽器再一次被觸發:
2.2ServletContextAttributeListener監聽器
- 作用:監聽ServletContext屬性的變化
- 相關方法:
- void attributeAdded(ServletContextAttributeEvent event):添加屬性時呼叫
- void attributeReplaced(ServletContextAttributeEvent event):替換屬性時呼叫
- void attributeRemoved(ServletContextAttributeEvent event):移除屬性時呼叫
應用實體
- 創建監聽器:MyServletContextAttributeListener
package com.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("MyServletContextAttributeListener 監聽到添加屬性.." +
servletContextAttributeEvent.getName() + "=" +
servletContextAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("MyServletContextAttributeListener 監聽到洗掉屬性.." +
servletContextAttributeEvent.getName() + "=" +
servletContextAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("MyServletContextAttributeListener 監聽到修改屬性.." +
servletContextAttributeEvent.getName() + "=" +
servletContextAttributeEvent.getValue());
}
}
- 創建servlet:HiServlet
package com.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class HiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//給ServletContext物件操作屬性
ServletContext servletContext = getServletContext();
//添加屬性
servletContext.setAttribute("name", "杰克");
//修改屬性
servletContext.setAttribute("name", "托馬斯");
//洗掉屬性
servletContext.removeAttribute("name");
System.out.println("HiServlet 處理完畢...");
}
}
- web.xml:配置監聽器和servlet
<!--配置監聽器-->
<listener>
<listener-class>com.listener.MyServletContextAttributeListener</listener-class>
</listener>
<!--配置HiServlet-->
<servlet>
<servlet-name>HiServlet</servlet-name>
<servlet-class>com.HiServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HiServlet</servlet-name>
<url-pattern>/hiServlet</url-pattern>
</servlet-mapping>
-
重新發布tomcat,在瀏覽器中訪問servlet,后臺輸出如下:
2.3HttpSessionListener監聽器
- 作用:監聽Session創建或銷毀,即生命周期監聽
- 相關方法:
- void sessionCreated(HttpSessionEvent se):創建session時呼叫
- void sessionDestroyed(HttpSessionEvent se):銷毀session時呼叫
- 使用方法和前面一樣,可以用于監聽用戶上線,離線
應用實體
- 創建監聽器:MyHttpSessionListener
package com.listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
//當session被創建時,設定一個生命周期10s
session.setMaxInactiveInterval(10);
System.out.println("MyHttpSessionListener 監聽到session創建= " + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
System.out.println("MyHttpSessionListener 監聽到session銷毀= " + session.getId());
}
}
- 修改HiServlet代碼:
package com.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class HiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取session物件
request.getSession();
System.out.println("HiServlet 處理完畢...");
}
}
- 配置監聽器:
<listener>
<listener-class>com.listener.MyHttpSessionListener</listener-class>
</listener>
-
現在我們重啟Tomcat,可以看到還沒有訪問HiServlet,就已經創建了兩個session,這是因為啟動Tomcat時,會默認訪問專案首頁面,tomcat會自動創建兩個session,這里忽略即可,
-
在瀏覽器訪問HiServlet,可以看到后臺首先創建了一個session,在設定的生命周期內不訪問該session,顯示該session被銷毀,
HttpSessionListener監聽器可以用于監聽用戶上線離線
注意:這里的session不是瀏覽器一關閉就銷毀,session的銷毀是服務器端去輪詢決定的,因此如果想要用戶瀏覽器一關閉就銷毀session,可以通過前端在用戶瀏覽器關閉之前,向服務器發送一個通知,服務器收到通知后銷毀該session即可,
2.4HttpSessionAttributeListener監聽器
- 作用:監聽Session屬性的變化
- 相關方法:
- void attributeAdded(ServletRequestAttributeEvent event):添加屬性時呼叫
- void attributeReplaced(ServletRequestAttributeEvent event):替換屬性時呼叫
- void attributeRemoved(ServletRequestAttributeEvent event):移除屬性時呼叫
- 使用少,使用方法和前面一樣,
應用實體
- 創建監聽器:MyHttpSessionAttributeListener
package com.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("MyHttpSessionAttributeListener 監聽到 session添加屬性= "
+ httpSessionBindingEvent.getName() + "=" + httpSessionBindingEvent.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("MyHttpSessionAttributeListener 監聽到 session洗掉屬性= "
+ httpSessionBindingEvent.getName() + "=" + httpSessionBindingEvent.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("MyHttpSessionAttributeListener 監聽到 session修改屬性= "
+ httpSessionBindingEvent.getName() + "=" + httpSessionBindingEvent.getValue());
}
}
- 修改HiServlet
package com.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class HiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取session物件
HttpSession session = request.getSession();
//添加屬性
session.setAttribute("age", 888);
//修改屬性
session.setAttribute("age", 999);
//洗掉屬性
session.removeAttribute("age");
System.out.println("HiServlet 處理完畢...");
}
}
- 配置監聽器
<listener>
<listener-class>com.listener.MyHttpSessionAttributeListener</listener-class>
</listener>
-
redeployTomcat,在瀏覽器訪問hiServlet,后臺輸出如下:
2.5ServletRequestListener監聽器
- 作用:監聽Request創建或者銷毀,即Request物件的生命周期監聽
- 相關方法:
- void requestInitialized(ServletRequestEvent sre):創建request物件時觸發
- void requestDestroyed(ServletRequestEvent sre):銷毀request物件時觸發
- 可以用來監控某個IP訪問我們網站的頻率,做日志記錄,或者訪問資源的情況等,
應用實體
- 創建監聽器:MyServletRequestListener
package com.listener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("MyServletRequestListener 監聽到request物件被創建 ");
ServletRequest servletRequest = servletRequestEvent.getServletRequest();
System.out.println("記錄訪問日志...");
System.out.println("訪問IP= " + servletRequest.getRemoteAddr());
System.out.println("訪問的資源= " + ((HttpServletRequest) servletRequest).getRequestURL());
}
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("MyServletRequestListener 監聽到request物件被銷毀...");
}
}
-
hiServlet不做修改
-
配置監聽器:
<listener>
<listener-class>com.listener.MyServletRequestListener</listener-class>
</listener>
-
redeployTomcat,在瀏覽器訪問hiServlet,后臺輸出如下:
(中間的session監聽可忽略)
-
訪問專案首頁面,后臺輸出如下:
2.6ServletRequestAttributeListener監聽器
- 作用:監聽Request屬性變化
- 相關方法
- void attributeAdded(ServletRequestAttributeEvent srae):添加屬性時呼叫
- void attributeReplaced(ServletRequestAttributeEvent srae):替換屬性時呼叫
- void attributeRemoved(ServletRequestAttributeEvent srae):移除屬性時呼叫
- 使用方法和前面類似
2.7HttpSessionBindingListener感知監聽器
該監聽器是用來系結資料的,如果一個物件實作了HttpSessionBindingListener介面,當這個物件被系結到Session中或者從session中被洗掉時,Servlet容器會通知這個物件,而這個物件在接收到通知后,可以做一些初始化或清除狀態的操作,
2.8HttpSessionActivationListener感知監聽器
HttpSessionActivationListener用于監控實作類本身,當實作類物件被添加到session屬性中后,session物件序列化(鈍化)前和反序列化(活化)后都會被執行
相應的方法:
- sessionWillPassivate(HttpSessionEvent se): session鈍化前執行(session從記憶體到硬碟)
- sessionDidActivate(HttpSessionEvent se):session活化后執行(session從硬碟到記憶體)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/538530.html
標籤:其他
上一篇:java中時間表達
