目錄
監聽器Listener
1.功能
2.監聽器分類
3.監聽器的配置
4.ServletContext監聽
5.HttpSession監聽
6.ServletRequest監聽
監聽器Listener
1.功能
- 用于監聽域對象ServletContext、HttpSession和ServletRequest的創建,與銷毀事件
- 監聽一個對象的事件,如果發生了某事件則可以執行相應的代碼
默認的優先級別:Listener>Filter>Servlet
2.監聽器分類
由于事件的復雜性,監聽器也有許多對應的監聽器。總體上按照作用域可以分為以下三類
- Servlet上下文相關監聽接口,包括ServletContextListener、ServletAttributeListener
- HTTP會話監聽接口,包括HttpSessionListener、HttpActivationListener等
- Servlet請求監聽接口,包括ServletRequestListener、ServletRequestAttributeListener
3.監聽器的配置
1.通過xml配置
<listener>
<!-- 在listener-class中輸入具體的類的位置--><listener-class>com.company.Listener.ListenerDemo1</listener-class></listener>
2.通過注解類配置
@WebListener
只需要填寫@WebListener即可?
4.ServletContext監聽
通過實現ServletContext接口實現監聽器功能
1.生命周期監聽
ServletContext的生命周期監聽,監聽ServletContext對象的創建與銷毀方法如下
方法名 | 描述 |
---|---|
contextInitialized() | 當ServletContext對象被創建時,容器會自動調用該方法。在這個方法中,你可以執行一些初始化操作,比如加載配置文件、建立數據庫連接等。 |
contextDestroyed() | 當ServletContext對象被銷毀時,容器會自動調用該方法。在這個方法中,你可以執行一些清理操作,比如釋放資源、關閉數據庫連接等。 |
package com.company.Listener;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
//使用注解類配置
@WebListener
public class ListenerDemo1 implements ServletContextListener {// 在創建出ServletContext對象時候自動調用函數@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("監聽到有ServletContext對象創建");}
// 檢測到ServletContext對象被銷毀@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("監聽到有ServletContext對象被銷毀");}
}
?具體案例代碼:
創建ServletContext對象代碼:
package com.company;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/ServletContextDemo1")
public class ServletContextDemo1 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 創建ServletContext對象ServletContext context = req.getServletContext();System.out.println("ServletContextDemo1被調用");}
// 實現方法統一@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}
2.屬性監聽
通過實現ServletContextAttributeListener接口實現監聽屬性的添加、替換、修改的功能,方法如下
方法名 | 描述 |
---|---|
attributeAdded() | 當向ServletContext 、HttpSession 或ServletRequest 添加屬性時,容器會自動調用該方法。在這個方法中,你可以對添加的屬性進行處理。 |
attributeReplaced() | 當ServletContext 、HttpSession 或ServletRequest 中的屬性被替換時,容器會自動調用該方法。在這個方法中,你可以對替換后的屬性進行處理。 |
attributeRemoved() | 當ServletContext 、HttpSession 或ServletRequest 中的屬性被移除時,容器會自動調用該方法。在這個方法中,你可以對移除的屬性進行處理 |
?案例代碼:
監聽器類代碼
package com.company.Listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;@WebListener
public class ListenerDemo2 implements ServletContextAttributeListener {
// 當新創建一個ServletContext對象時候調用@Overridepublic void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
// 獲取域對象ServletContext context = servletContextAttributeEvent.getServletContext();
// 獲取新增的域 名和值String name = servletContextAttributeEvent.getName();Object value = servletContextAttributeEvent.getValue();
// 輸出修改對象System.out.println("域對象"+context+"范圍內增加了"+name+"值為"+value);}
// 當ServletContext對象被移除的時候執行@Overridepublic void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {ServletContext context = servletContextAttributeEvent.getServletContext();String name = servletContextAttributeEvent.getName();Object value = servletContextAttributeEvent.getValue();System.out.println("域對象"+context+"范圍內刪除了"+name+"值為"+value);}@Overridepublic void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {ServletContext context = servletContextAttributeEvent.getServletContext();String name = servletContextAttributeEvent.getName();Object value = servletContextAttributeEvent.getValue();System.out.println("域對象"+context+"范圍內替換了"+name+"值為"+value);}
}
?Servlet屬性類代碼
package com.company;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/ServletContextDemo3")
public class ServletContextDemo3 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ServletContext context = req.getServletContext();
// 創建context域對象值context.setAttribute("msg","Hello");
// 替換對象內容context.setAttribute("msg","你好");
// 銷毀對象context.removeAttribute("msg");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}
5.HttpSession監聽
通過實現接口HttpSessionListener實現HttpSession。HttpSession對象監聽有三種方式,1.生命周期監聽、2.屬性監聽、3.session監聽
?1.生命周期監聽
方法名 | 描述 |
---|---|
sessionCreated() | 當一個新的HttpSession 對象被創建時,容器會自動調用該方法。在這個方法中,你可以對新創建的HttpSession 對象進行處理。 |
sessionDestroyed() | 當一個HttpSession 對象被銷毀時,容器會自動調用該方法。在這個方法中,你可以對銷毀的HttpSession 對象進行處理。 |
監聽類代碼
package com.company.Listener;import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class ListenerDemo3 implements HttpSessionListener {
// 當session被創建時候調用@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {System.out.println("監聽到有session的創建");}
// 當session被銷毀時候調用@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {System.out.println("session已被銷毀");}
}
Servlet實現代碼
package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/SessionListenerDemo1")
public class SessionListenerDemo1 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 創建sessionHttpSession session = req.getSession();session.setAttribute("name","AlphaMilk");
// 銷毀sessionsession.invalidate();}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}
2.屬性監聽
方法名 | 描述 |
---|---|
attributeAdded() | 當一個屬性被添加到HttpSession 對象中時,容器會自動調用該方法。在這個方法中,你可以對新添加的屬性進行處理。 |
attributeReplaced() | 當一個屬性在HttpSession 對象中被替換時,容器會自動調用該方法。在這個方法中,你可以對替換的屬性進行處理。 |
attributeRemoved() | 當一個屬性從HttpSession 對象中被移除時,容器會自動調用該方法。在這個方法中,你可以對被移除的屬性進行處理 |
案例代碼:
?監聽類
package com.company.Listener;import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;@WebListener
public class ListenerDemo4 implements HttpSessionAttributeListener {
// 當session屬性增加時候調用@Overridepublic void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {System.out.println("Session添加了一個新的屬性");}
// 當session屬性銷毀時候調用@Overridepublic void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {System.out.println("Session銷毀了一個屬性");}
// 當session屬性替換時候調用@Overridepublic void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {System.out.println("Session替換了一個屬性");}
}
?Servlet實現類
package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/SessionDemo5")
public class SessionDemo5 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();
// 增加屬性session.setAttribute("userName","AlphaMilk");
// 屬性覆蓋session.setAttribute("userName","alpha");
// 屬性刪除session.removeAttribute("userName");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}
6.ServletRequest監聽
與上述幾個接口類似,分別由生命周期監聽與屬性監聽
1.生命周期監聽
方法名 | 描述 |
---|---|
requestInitialized() | 當一個ServletRequest 對象被創建并初始化時,容器會自動調用該方法。在這個方法中,你可以對新創建的ServletRequest 對象進行處理。 |
requestDestroyed() | 當一個ServletRequest 對象被銷毀時,容器會自動調用該方法。在這個方法中,你可以對銷毀的ServletRequest 對象進行處理。 |
2.屬性監聽
方法名 | 描述 |
---|---|
attributeAdded() | 當一個屬性被添加到ServletRequest 對象中時,容器會自動調用該方法。在這個方法中,你可以對新添加的屬性進行處理。 |
attributeReplaced() | 當一個屬性在ServletRequest 對象中被替換時,容器會自動調用該方法。在這個方法中,你可以對替換的屬性進行處理。 |
attributeRemoved() | 當一個屬性從ServletRequest 對象中被移除時,容器會自動調用該方法。在這個方法中,你可以對被移除的屬性進行處理 |