JavaWeb三大組件之監(jiān)聽器Listener詳解
監(jiān)聽器Listener
概念分析 :
在JavaWeb應(yīng)用程序中,Listener(監(jiān)聽器)是一種機制,用于監(jiān)聽和響應(yīng)特定的事件。它可以感知并響應(yīng)與應(yīng)用程序相關(guān)的事件,從而執(zhí)行相應(yīng)的邏輯處理。
事件是在應(yīng)用程序運行過程中發(fā)生的特定動作或狀態(tài)改變。例如,Web應(yīng)用程序的啟動和關(guān)閉、請求的到達和完成、會話的創(chuàng)建和銷毀等都被認為是事件。監(jiān)聽器會注冊對這些事件的感興趣,并在事件發(fā)生時調(diào)用相應(yīng)的回調(diào)方法來執(zhí)行預(yù)定的業(yè)務(wù)邏輯。
監(jiān)聽器的概念可以類比于現(xiàn)實生活中的觀察者模式。在觀察者模式中,一個對象(觀察者)注冊對另一個對象(被觀察者)的事件感興趣,并在被觀察者觸發(fā)相應(yīng)事件時得到通知并執(zhí)行相應(yīng)操作。類似地,在JavaWeb應(yīng)用程序中,監(jiān)聽器充當觀察者的角色,可以監(jiān)聽和響應(yīng)特定的事件。
通過使用監(jiān)聽器,開發(fā)者可以將應(yīng)用程序的關(guān)鍵行為和狀態(tài)抽象成事件,并在需要的時候采取相應(yīng)的措施。比如,在Web應(yīng)用程序啟動時,可以使用ServletContextListener來進行初始化操作;在每次請求到達時,可以使用ServletRequestListener來獲取請求信息等。
監(jiān)聽器的設(shè)計使得應(yīng)用程序更加靈活和可擴展。它提供了一種松耦合的方式來解耦應(yīng)用程序的不同模塊,并實現(xiàn)事件驅(qū)動的編程模型。監(jiān)聽器是實現(xiàn)Web應(yīng)用程序的事件處理和擴展性的重要組成部分。
價值所在 :
監(jiān)聽器(Listener)在JavaWeb應(yīng)用程序中具有重要的意義和價值,主要體現(xiàn)在以下幾個方面:
- 實現(xiàn)事件驅(qū)動編程:監(jiān)聽器的核心概念是基于事件的觸發(fā)和響應(yīng),它使得開發(fā)者可以將應(yīng)用程序的關(guān)鍵行為和狀態(tài)抽象成事件,并在事件發(fā)生時執(zhí)行相應(yīng)的邏輯處理。通過監(jiān)聽器,開發(fā)者可以實現(xiàn)事件驅(qū)動編程的思想,更加靈活地響應(yīng)應(yīng)用程序中的各種事件。
- 解耦和模塊化:監(jiān)聽器解耦了應(yīng)用程序中不同模塊之間的依賴關(guān)系。它提供了一種松耦合的方式來將事件和事件處理的邏輯相互分離,使得不同的模塊可以獨立地進行開發(fā)和維護。通過監(jiān)聽器,開發(fā)者可以將特定事件的處理邏輯集中到監(jiān)聽器中,從而提高代碼的可讀性和可維護性。
- 增強可擴展性:使用監(jiān)聽器可以有效地增強應(yīng)用程序的可擴展性。當應(yīng)用程序需要添加新的功能或處理新的事件時,可以通過編寫自定義的監(jiān)聽器來實現(xiàn)。通過監(jiān)聽器,可以在不修改已有代碼的情況下,將新的功能集成到應(yīng)用程序中,從而實現(xiàn)應(yīng)用程序的動態(tài)擴展。
- 提供通用的解決方案:一些監(jiān)聽器是Web容器預(yù)先定義的,如ServletContextListener、ServletRequestListener和HttpSessionListener等。這些監(jiān)聽器提供了一些通用的解決方案,可用于應(yīng)用程序中常見的場景,如應(yīng)用程序的初始化、請求的處理、會話管理等。通過使用這些通用的監(jiān)聽器,開發(fā)者可以以更加快速和方便的方式完成常見功能的實現(xiàn)。
所以它提供了一種事件驅(qū)動的編程模型,幫助開發(fā)者實現(xiàn)模塊間的解耦和功能的擴展,以及提供通用的解決方案。監(jiān)聽器在開發(fā)Web應(yīng)用程序時是一種強大的工具,可以提升代碼的可維護性、可擴展性和可讀性。
一. Listener監(jiān)聽器的介紹

1. Listener 監(jiān)聽器它是 JavaWeb 的三大組件之一。 JavaWeb 的三大組件分別是: Servlet 程 序、 Listener 監(jiān)聽器、 Filter 過濾器
2. Listener 是 JavaEE 的規(guī)范,就是接口
3. 監(jiān)聽 器的作用是,監(jiān)聽某種變化 ( 一般就是對象創(chuàng)建 / 銷毀 , 屬性變化 ), 觸發(fā)對應(yīng)方法完成 相應(yīng)的任務(wù)
4. JavaWeb 中的監(jiān)聽器(共八個) , 目前最常用的是 ServletContextListener

二. Listener的生命周期
監(jiān)聽器(Listener)在JavaWeb應(yīng)用程序中起到監(jiān)聽和處理事件的作用。監(jiān)聽器的生命周期與Web應(yīng)用程序的生命周期密切相關(guān)。
- ServletContextListener:ServletContextListener會在Web應(yīng)用程序啟動時起作用,并在Web應(yīng)用程序關(guān)閉時銷毀。具體來說,當Web容器啟動時會觸發(fā)contextInitialized()方法,開發(fā)者可以在這個方法中進行一些初始化操作;當Web容器關(guān)閉時會觸發(fā)contextDestroyed()方法,開發(fā)者可以在這個方法中進行一些資源釋放、清理操作。
- ServletRequestListener:ServletRequestListener會在每次客戶端請求到達服務(wù)器時起作用,并在服務(wù)器響應(yīng)完成后銷毀。具體來說,當客戶端發(fā)送請求到達服務(wù)器時會觸發(fā)requestInitialized()方法,開發(fā)者可以在這個方法中獲取和處理請求相關(guān)的信息;當服務(wù)器響應(yīng)完成后會觸發(fā)requestDestroyed()方法,開發(fā)者可以在這個方法中進行一些善后操作。
- HttpSessionListener:HttpSessionListener會在每次HttpSession創(chuàng)建和銷毀時起作用。具體來說,當用戶訪問Web應(yīng)用程序時,如果尚未創(chuàng)建HttpSession,會觸發(fā)sessionCreated()方法,在這個方法中可以進行一些會話管理的操作;當HttpSession被銷毀時,會觸發(fā)sessionDestroyed()方法,在這個方法中可以進行一些會話清理的操作。
注意,監(jiān)聽器是通過在web.xml配置文件中聲明來啟用的。開發(fā)者需要在web.xml文件中添加相應(yīng)的監(jiān)聽器聲明,告訴Web容器要監(jiān)聽哪些事件,并指定相應(yīng)的監(jiān)聽器類。
總之,監(jiān)聽器的起作用和銷毀是在Web應(yīng)用程序的生命周期中發(fā)生的,監(jiān)聽器會在特定的事件發(fā)生時被觸發(fā),并執(zhí)行相應(yīng)的回調(diào)方法來處理事件。
三. 常見的監(jiān)聽器
Listener(監(jiān)聽器)可以監(jiān)聽不同的事件,具體監(jiān)聽的事件類型取決于監(jiān)聽器的種類。
在JavaWeb中,常見的監(jiān)聽器都是用于監(jiān)聽Servlet、JSP和Web應(yīng)用程序中的事件。
下面是一些常見的監(jiān)聽器及其監(jiān)聽的事件類型:
- ServletContextListener:監(jiān)聽ServletContext對象的創(chuàng)建和銷毀事件,當Web應(yīng)用程序啟動和關(guān)閉時觸發(fā)。
- ServletRequestListener:監(jiān)聽ServletRequest對象的創(chuàng)建和銷毀事件,在每次客戶端請求到達服務(wù)器時觸發(fā)。
- HttpSessionListener:監(jiān)聽HttpSession對象的創(chuàng)建和銷毀事件,當用戶與Web應(yīng)用程序建立和關(guān)閉會話時觸發(fā)。
- ServletContextAttributeListener:監(jiān)聽ServletContext中屬性的添加、修改和刪除事件。
- ServletRequestAttributeListener:監(jiān)聽ServletRequest中屬性的添加、修改和刪除事件。
- HttpSessionAttributeListener:監(jiān)聽HttpSession中屬性的添加、修改和刪除事件。
- HttpSessionActivationListener:監(jiān)聽HttpSession對象的鈍化(passivation)和活化(activation)事件,與分布式會話(Distributed Session)有關(guān)。
- ServletRequestListener:監(jiān)聽ServletContext對象的創(chuàng)建和銷毀事件,以及請求的開始和完成。
- ServletContextListener:監(jiān)聽ServletContext對象的創(chuàng)建和銷毀事件,與Web應(yīng)用程序的啟動和關(guān)閉有關(guān)。
這只是一部分常見的監(jiān)聽器和事件類型,根據(jù)具體需求,你也可以自定義監(jiān)聽器來監(jiān)聽其他類型的事件。
監(jiān)聽器提供了一種機制,讓開發(fā)者可以在事件發(fā)生時執(zhí)行自定義的邏輯操作,以實現(xiàn)對特定事件的監(jiān)控和響應(yīng)。
四. 舉例
ServletContextListener
簡單的ServletContextListener示例,演示在應(yīng)用程序啟動和關(guān)閉時執(zhí)行初始化和清理操作:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// 應(yīng)用程序啟動時執(zhí)行的初始化操作
System.out.println("應(yīng)用程序已啟動");
// 加載配置文件、初始化數(shù)據(jù)庫連接池等
// ...
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 應(yīng)用程序關(guān)閉時執(zhí)行的清理操作
System.out.println("應(yīng)用程序即將關(guān)閉");
// 關(guān)閉數(shù)據(jù)庫連接池、釋放資源等
// ...
}
}在上面的例子中,MyServletContextListener實現(xiàn)了ServletContextListener接口,并重寫了contextInitialized和contextDestroyed方法。
在contextInitialized方法中,你可以執(zhí)行應(yīng)用程序啟動時的初始化操作,比如加載配置文件、初始化數(shù)據(jù)庫連接池等。
而在contextDestroyed方法中,你可以執(zhí)行應(yīng)用程序關(guān)閉時的清理操作,比如關(guān)閉數(shù)據(jù)庫連接池、釋放資源等。
當應(yīng)用程序啟動時,容器將自動調(diào)用contextInitialized方法來初始化你的應(yīng)用程序。當應(yīng)用程序關(guān)閉時,容器將自動調(diào)用contextDestroyed方法來執(zhí)行清理操作。
為了讓監(jiān)聽器生效,你還需要在web.xml或使用注解的方式配置監(jiān)聽器的部署描述符,具體的配置方式取決于你使用的Servlet容器。例如,在web.xml中添加以下配置:
<listener>
<listener-class>com.example.MyServletContextListener</listener-class>
</listener>這樣,當應(yīng)用程序啟動或關(guān)閉時,MyServletContextListener中的邏輯將被觸發(fā)執(zhí)行。
ServletContextAttributeListener
一個簡單的ServletContextAttributeListener示例,展示了當ServletContext屬性發(fā)生變化時執(zhí)行的操作:
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
// 當ServletContext屬性被添加時執(zhí)行的操作
String attributeName = event.getName();
Object attributeValue = event.getValue();
System.out.println("ServletContext屬性 " + attributeName + " 添加,值為: " + attributeValue);
// 其他處理邏輯
// ...
}
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
// 當ServletContext屬性被移除時執(zhí)行的操作
String attributeName = event.getName();
Object attributeValue = event.getValue();
System.out.println("ServletContext屬性 " + attributeName + " 被移除,值為: " + attributeValue);
// 其他處理邏輯
// ...
}
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
// 當ServletContext屬性被替換時執(zhí)行的操作
String attributeName = event.getName();
Object oldAttributeValue = event.getValue();
Object newAttributeValue = event.getServletContext().getAttribute(attributeName);
System.out.println("ServletContext屬性 " + attributeName + " 被替換,舊值為: " + oldAttributeValue + ",新值為: " + newAttributeValue);
// 其他處理邏輯
// ...
}
}在上面的例子中,MyServletContextAttributeListener實現(xiàn)了ServletContextAttributeListener接口,并使用@WebListener注解標記為一個監(jiān)聽器。它重寫了attributeAdded、attributeRemoved和attributeReplaced方法,在這些方法中可以添加對ServletContext屬性變化的處理邏輯。
在attributeAdded方法中,當ServletContext屬性被添加時,你可以獲取屬性的名稱和值,并執(zhí)行相應(yīng)的操作,如記錄日志、更新緩存等。
在attributeRemoved方法中,當ServletContext屬性被移除時,你可以獲取屬性的名稱和值,并執(zhí)行相應(yīng)的操作,如清理資源、撤銷緩存等。
在attributeReplaced方法中,當ServletContext屬性被替換時,你可以同時獲取屬性的舊值和新值,并執(zhí)行相應(yīng)的操作,如更新緩存、重新加載配置等。
要使監(jiān)聽器生效,你可以使用注解方式將監(jiān)聽器標記為一個@WebListener,這樣容器會自動識別和注冊監(jiān)聽器。
或
如果你使用的是web.xml配置文件進行部署描述符的配置,則需要在web.xml中添加以下片段:
<listener>
<listener-class>com.example.MyServletContextAttributeListener</listener-class>
</listener>這樣,當ServletContext屬性發(fā)生變化時,MyServletContextAttributeListener中的相應(yīng)方法就會被觸發(fā)執(zhí)行。
HttpSessionListener
一個簡單的HttpSessionListener示例,展示了當HttpSession事件發(fā)生時執(zhí)行的操作:
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
// 當HttpSession被創(chuàng)建時執(zhí)行的操作
System.out.println("HttpSession被創(chuàng)建,ID: " + se.getSession().getId());
// 其他處理邏輯
// ...
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 當HttpSession被銷毀時執(zhí)行的操作
System.out.println("HttpSession被銷毀,ID: " + se.getSession().getId());
// 其他處理邏輯
// ...
}
}在上述示例中,MyHttpSessionListener實現(xiàn)了HttpSessionListener接口,并使用@WebListener注解標記為一個監(jiān)聽器。它重寫了sessionCreated和sessionDestroyed方法,在這些方法中可以添加對HttpSession事件的處理邏輯。
在sessionCreated方法中,當HttpSession被創(chuàng)建時,你可以獲取HttpSession的ID,并執(zhí)行相應(yīng)的操作,如記錄日志、初始化用戶會話數(shù)據(jù)等。
在sessionDestroyed方法中,當HttpSession被銷毀時,你可以獲取HttpSession的ID,并執(zhí)行相應(yīng)的操作,如清理資源、保存用戶會話狀態(tài)等。
要使監(jiān)聽器生效,你可以使用注解方式將監(jiān)聽器標記為一個@WebListener,這樣容器會自動識別和注冊監(jiān)聽器。如果你使用的是web.xml配置文件進行部署描述符的配置,則需要在web.xml中添加以下片段:
<listener>
<listener-class>com.example.MyHttpSessionListener</listener-class>
</listener>這樣,當HttpSession事件發(fā)生時,MyHttpSessionListener中的相應(yīng)方法就會被觸發(fā)執(zhí)行。
HttpSessionAttributeListener
一個簡單的HttpSessionAttributeListener示例,展示了當HttpSession屬性發(fā)生變化時執(zhí)行的操作:
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
// 當向HttpSession中添加屬性時執(zhí)行的操作
System.out.println("屬性已添加:名稱:" + event.getName() + ",值:" + event.getValue());
// 其他處理邏輯
// ...
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
// 當從HttpSession中移除屬性時執(zhí)行的操作
System.out.println("屬性已移除:名稱:" + event.getName() + ",值:" + event.getValue());
// 其他處理邏輯
// ...
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
// 當替換HttpSession中的屬性時執(zhí)行的操作
System.out.println("屬性已替換:名稱:" + event.getName() + ",舊值:" + event.getValue() + ",新值:" + event.getSession().getAttribute(event.getName()));
// 其他處理邏輯
// ...
}
}在上述示例中,MyHttpSessionAttributeListener實現(xiàn)了HttpSessionAttributeListener接口,并使用@WebListener注解標記為一個監(jiān)聽器。它重寫了attributeAdded、attributeRemoved和attributeReplaced方法,在這些方法中可以添加對HttpSession屬性變化的處理邏輯。
在attributeAdded方法中,當向HttpSession中添加屬性時,你可以獲取屬性的名稱和值,并執(zhí)行相應(yīng)的操作,如記錄日志、更新相關(guān)數(shù)據(jù)等。
在attributeRemoved方法中,當從HttpSession中移除屬性時,你可以獲取屬性的名稱和值,并執(zhí)行相應(yīng)的操作,如記錄日志、清除相關(guān)數(shù)據(jù)等。
在attributeReplaced方法中,當替換HttpSession中的屬性時,你可以獲取屬性的名稱、舊值和新值,并執(zhí)行相應(yīng)的操作,如記錄日志、更新相關(guān)數(shù)據(jù)等。
要使監(jiān)聽器生效,你可以使用注解方式將監(jiān)聽器標記為一個@WebListener。
或
如果你使用的是web.xml配置文件進行部署描述符的配置,則需要在web.xml中添加以下片段:
<listener>
<listener-class>com.example.MyHttpSessionAttributeListener</listener-class>
</listener>這樣,當HttpSession屬性發(fā)生變化時,MyHttpSessionAttributeListener中的相應(yīng)方法就會被觸發(fā)執(zhí)行。
ServletRequestListener
一個簡單的ServletRequestListener示例,展示了在每個頁面請求到達和處理完成時執(zhí)行的操作:
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
// 頁面請求到達時執(zhí)行的操作
System.out.println("收到新請求");
// 記錄請求信息,如URL、參數(shù)等
// ...
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// 頁面請求處理完成后執(zhí)行的操作
System.out.println("請求處理完成");
// 清理操作,如釋放資源
// ...
}
}在上面的例子中,MyServletRequestListener實現(xiàn)了ServletRequestListener接口,并使用@WebListener注解標記為一個監(jiān)聽器。它重寫了requestInitialized和requestDestroyed方法,在這兩個方法中可以添加自定義的邏輯處理。
在requestInitialized方法中,你可以記錄請求信息,如URL、參數(shù)等。
在requestDestroyed方法中,你可以執(zhí)行清理操作,如釋放資源。
要讓監(jiān)聽器生效,你可以使用注解方式將監(jiān)聽器標記為一個@WebListener,這樣容器會自動識別和注冊監(jiān)聽器。
或
如果你使用的是web.xml配置文件進行部署描述符的配置,則需要在web.xml中添加以下片段:
<listener>
<listener-class>com.example.MyServletRequestListener</listener-class>
</listener>這樣,在每次頁面請求到達時,MyServletRequestListener中的邏輯將被觸發(fā)執(zhí)行。同樣,在每個頁面請求完成后,requestDestroyed方法也會被調(diào)用執(zhí)行清理操作。
ServletRequestAttributeListener
一個簡單的ServletRequestAttributeListener示例,展示了當ServletRequest屬性發(fā)生變化時執(zhí)行的操作:
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
@WebListener
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent event) {
// 當向ServletRequest中添加屬性時執(zhí)行的操作
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
System.out.println("屬性已添加:名稱:" + event.getName() + ",值:" + event.getValue() + ",請求URL:" + request.getRequestURL());
// 其他處理邏輯
// ...
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent event) {
// 當從ServletRequest中移除屬性時執(zhí)行的操作
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
System.out.println("屬性已移除:名稱:" + event.getName() + ",值:" + event.getValue() + ",請求URL:" + request.getRequestURL());
// 其他處理邏輯
// ...
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent event) {
// 當替換ServletRequest中的屬性時執(zhí)行的操作
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
System.out.println("屬性已替換:名稱:" + event.getName() + ",舊值:" + event.getValue() + ",新值:" + request.getAttribute(event.getName()) + ",請求URL:" + request.getRequestURL());
// 其他處理邏輯
// ...
}
}在上述示例中,MyServletRequestAttributeListener實現(xiàn)了ServletRequestAttributeListener接口,并使用@WebListener注解標記為一個監(jiān)聽器。它重寫了attributeAdded、attributeRemoved和attributeReplaced方法,在這些方法中可以添加對ServletRequest屬性變化的處理邏輯。
在attributeAdded方法中,當向ServletRequest中添加屬性時,你可以獲取屬性的名稱和值,并執(zhí)行相應(yīng)的操作,如記錄日志、更新相關(guān)數(shù)據(jù)等。通過event.getServletRequest()可以獲取到HttpServletRequest對象,進而可以獲取請求的URL等信息。
在attributeRemoved方法中,當從ServletRequest中移除屬性時,你可以獲取屬性的名稱和值,并執(zhí)行相應(yīng)的操作,如記錄日志、清除相關(guān)數(shù)據(jù)等。同樣,可以通過event.getServletRequest()獲取到HttpServletRequest對象。
在attributeReplaced方法中,當替換ServletRequest中的屬性時,你可以獲取屬性的名稱、舊值和新值,并執(zhí)行相應(yīng)的操作,如記錄日志、更新相關(guān)數(shù)據(jù)等。同樣,通過event.getServletRequest()可以獲取到HttpServletRequest對象。
要使監(jiān)聽器生效,你可以使用注解方式將監(jiān)聽器標記為一個@WebListener。
或
如果你使用的是web.xml配置文件進行部署描述符的配置,則需要在web.xml中添加以下片段:
<listener>
<listener-class>com.example.MyServletRequestAttributeListener</listener-class>
</listener>這樣,當ServletRequest屬性發(fā)生變化時,MyServletRequestAttributeListener中的相應(yīng)方法就會被觸發(fā)執(zhí)行。
五. 打開一個Tomcat應(yīng)用
在啟動Tomcat并自動打開index.jsp頁面的過程中,以下監(jiān)聽器將執(zhí)行相應(yīng)的操作:
- ServletContextListener:
- contextInitialized 方法將在Tomcat啟動時執(zhí)行,你可以在此方法中執(zhí)行應(yīng)用程序啟動時的初始化操作,例如加載配置文件、初始化數(shù)據(jù)庫連接池等。
- contextDestroyed 方法將在Tomcat關(guān)閉時執(zhí)行,你可以在此方法中執(zhí)行應(yīng)用程序關(guān)閉時的清理操作,例如關(guān)閉數(shù)據(jù)庫連接池、釋放資源等。
- ServletRequestListener:
- requestInitialized 方法將在每個頁面請求到達Tomcat時執(zhí)行,你可以在此方法中記錄請求信息,如URL、參數(shù)等。
- requestDestroyed 方法將在每個頁面請求處理完成后執(zhí)行,你可以在此方法中執(zhí)行清理操作,如釋放資源等。
- HttpSessionListener:
- sessionCreated 方法將在每個新的會話被創(chuàng)建時執(zhí)行,你可以在此方法中記錄用戶登錄信息、初始化權(quán)限等。
- sessionDestroyed 方法將在每個會話被銷毀時執(zhí)行,你可以在此方法中執(zhí)行清理會話相關(guān)資源、處理用戶退出等操作。
當你在瀏覽器訪問Tomcat的根目錄(如 //localhost:8080/)時,以下是一種可能的監(jiān)聽器執(zhí)行順序:
- ServletContextListener 的 contextInitialized 方法將被調(diào)用。
- 在這個方法中,你可以執(zhí)行應(yīng)用程序啟動時的初始化操作,如加載配置文件、初始化數(shù)據(jù)庫連接池等。
- ServletRequestListener 的 requestInitialized 方法將被調(diào)用。
- 在這個方法中,你可以記錄請求信息,如URL、參數(shù)等。
- Tomcat 將查找并處理index.jsp頁面。
- ServletRequestListener 的 requestDestroyed 方法將被調(diào)用。
- 在這個方法中,你可以執(zhí)行清理操作,如釋放資源等。
- HttpSessionListener 的 sessionCreated 方法將被調(diào)用(如果啟用了會話)。
- 在這個方法中,你可以記錄用戶登錄信息、初始化權(quán)限等。
- 頁面加載完成并在瀏覽器中呈現(xiàn)。
注意,具體的監(jiān)聽器執(zhí)行順序可能會根據(jù)Tomcat版本、配置和其他因素而有所不同。此外,如果你在應(yīng)用程序中有自定義的監(jiān)聽器,那么它們也會參與監(jiān)聽器的執(zhí)行順序。
到此這篇關(guān)于JavaWeb三大組件之監(jiān)聽器Listener詳解的文章就介紹到這了,更多相關(guān)監(jiān)聽器Listener詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中使用同步回調(diào)和異步回調(diào)的示例詳解
這篇文章主要介紹了Java中使用同步回調(diào)和異步回調(diào)的相關(guān)資料,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04
并行Stream與Spring事務(wù)相遇會發(fā)生什么?
這篇文章主要介紹了并行Stream與Spring事務(wù)相遇會發(fā)生什么?文章主要解決實戰(zhàn)中的Bug及解決方案和技術(shù)延伸,具有一定的參考價值,需要的小伙伴可以參考一下2022-05-05
mybatis查詢到了數(shù)據(jù),但是實體類個別字段為null問題
這篇文章主要介紹了mybatis查詢到了數(shù)據(jù),但是實體類個別字段為null問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
spring cloud feign實現(xiàn)遠程調(diào)用服務(wù)傳輸文件的方法
這篇文章主要介紹了spring cloud feign實現(xiàn)遠程調(diào)用服務(wù)傳輸文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
Spring Security基于數(shù)據(jù)庫的ABAC屬性權(quán)限模型實戰(zhàn)開發(fā)教程
這篇文章主要介紹了Spring Security基于數(shù)據(jù)庫的ABAC屬性權(quán)限模型實戰(zhàn)開發(fā)教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2025-04-04
Netty分布式Server啟動流程服務(wù)端初始化源碼分析
本章主要講解server啟動的關(guān)鍵步驟,?讀者只需要了解server啟動的大概邏輯,?知道關(guān)鍵的步驟在哪個類執(zhí)行即可,?并不需要了解每一步的運作機制,?之后會對每個模塊進行深度分析2022-03-03

