Servlet 监听器
可參考博文:Session 的鈍化與活化
(一)Servlet 中的作用域總結
??????
趁著這個知識點順便把Servlet 中的四大作用域也在這篇博文中總結一下。
application域(ServletContext)
- 作用范圍:在整個Web 應用范圍內共享數據 (所有用戶)
- 生命周期:當服務器啟動,Web 應用被加載后創建ServletContext 對象,域產生,當被移出Web 容器或者服務器關閉后隨著Web 應用的銷毀而銷毀。
session域(HttpSession)
- 作用范圍:當前會話范圍內(當前用戶)
- 生命周期:當程序第一次調用request.getSession() 方法時在服務器內存中創建客戶端需要的Session 對象。當Session 超時、調用invalidate 方法或者當Web 服務器非正常關閉的情況下被銷毀。
request域(HttpServletRequest)
- 作用范圍:整個請求轉發鏈
- 生命周期:當服務器接收到一個請求,創建代表請求的request 的對象,當請求結束時,服務器銷毀代表請求的request 對象,request 域被銷毀。
pageContext域(PageContext)
- 作用范圍:當前JSP 頁面
- 生命周期:當對JSP 頁面訪問開始時,創建代表當前JSP 的PageContext,對JSP 訪問結束時,銷毀當前JSP 的PageContext。
(二)監聽器概述
監聽器是一個實現特定接口的普通Java 程序,這個程序專門用于監聽另一個Java 對象的方法調用或屬性的改變,當被監聽對象發生上面的動作時,監聽器根據動作的發生立即執行自身的某個方法。
Servlet 中的監聽器有八個。這里根據其特定的功能把它們分為三種。
監聽器的實現步驟
①:實現對應的接口
②:在web.xml 配置文件中配置該監聽器(對于HttpSessionActivationListener 與HttpSessionBindingListener 不需要進行配置)
(三)監聽三大作用域創建和銷毀的監聽器
ServletContextListener
- 作用:用來監聽ServletContext對象創建和銷毀
- 接口方法:contextInitialized()、contextDestroyed()
- 接收事件:ervletContextEvent
- 觸發場景:在服務器加載Web 應用程序時,會調用contextInitialized(),而當容器移除Web 應用程序時,會調用contextDestroyed ()方法。
HttpSessionListener
- 作用:用來監聽HttpSession對象創建和銷毀
- 接口方法:sessionCreated()、sessionDestroyed ()
- 接收事件:HttpSessionEvent
- 觸發場景:在session (HttpSession)對象建立或被銷毀時,會分別調用這兩個方法。
ServletRequestListener
- 作用:用來監聽ServletRequest對象創建和銷毀
- 接口方法:requestInitialized()、requestDestroyed()
- 接收事件:RequestEvent
- 觸發場景:在request(HttpServletRequest)對象建立或被銷毀時,會分別調用這兩個方法。
簡單例子演示(由于這三個監聽器有很大的共性,所以這里只演示HttpSessionListener)
在Servlet 中創建一個HttpSession 對象,并立即銷毀它。在監聽器里監聽HttpSession 的創建與銷毀狀態,分別在創建與銷毀時在控制臺打印一句話。
監聽器類MyHttpSessionListener
package com.jas.listener;import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener;public class MyHttpSessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {System.out.println("HttpSession 對象被創建了!" + httpSessionEvent.getSession());}@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {System.out.println("HttpSession1 對象被銷毀了!" + httpSessionEvent.getSession());} }Servlet 類HttpSessionServlet
package com.jas.servlet;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet("/testSession") public class HttpSessionServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession(); //創建HttpSession 對象request.getSession().invalidate(); //創建之后立即銷毀}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);} }在web.xml 中配置監聽器
<listener><listener-class>com.jas.listener.MyHttpSessionListener</listener-class> </listener>訪問“testSession”時,輸出結果如下
HttpSession 對象被創建了!org.apache.catalina.session.StandardSessionFacade@36d351f0 HttpSession1 對象被銷毀了!org.apache.catalina.session.StandardSessionFacade@36d351f0(四)監聽三大作用域中屬性變化的監聽器
ServletContextAttributeListener
- 作用:用來監聽ServletContext 對象屬性的變化
- 接口方法: attributeAdded()、 attributeReplaced()、attributeRemoved()
- 接收事件: ServletContextAttributeEvent
- 觸發場景: 若有對象加入為application(ServletContext)對象的屬性,則會調用attributeAdded(),同理在置換屬性與移除屬性時,會分別調用attributeReplaced()、attributeRemoved()。
HttpSessionAttributeListener
- 作用:用來監聽HttpSession 對象屬性的變化
- 接口方法: attributeAdded()、 attributeReplaced()、attributeRemoved()
- 接收事件: HttpSessionBindingEvent
- 觸發場景: 若有對象加入為session(HttpSession)對象的屬性,則會調用attributeAdded(),同理在置換屬性與移除屬性時,會分別調用attributeReplaced()、 attributeRemoved()。
ServletRequestAttributeListener
- 作用:用來監聽ServletRequest 對象屬性的變化
- 接口方法: attributeAdded()、 attributeReplaced()、attributeRemoved()
- 接收事件: HttpSessionBindingEvent
- 觸發場景: 若有對象加入為request(HttpServletRequest)對象的屬性,則會調用attributeAdded(),同理在置換屬性與移除屬性時,會分別調用attributeReplaced()、 attributeRemoved()。
簡單例子演示(這里以ServletContextAttributeListener 為例)
在Servlet 中創建一個ServletContext 對象,并在域中添加一個“hello” 屬性,接著改變該屬性值,并移除該屬性。定義一個監聽器監聽其中的屬性變化。
監聽器類MyServletContextAttributeListener
package com.jas.listener;import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener;public class MyServletContextAttributeListener implements ServletContextAttributeListener {@Overridepublic void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("屬性被創建了!" + servletContextAttributeEvent.getName() + ":"+ servletContextAttributeEvent.getValue());}@Overridepublic void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("屬性被移除了!" );}@Overridepublic void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("屬性被替換了!");} }Servlet 類ServletContext
package com.jas.servlet;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet("/servletContext") public class ServletContext extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.getServletContext().setAttribute("hello","Hello"); //添加屬性this.getServletContext().setAttribute("hello","Hello ~"); //覆蓋原來的屬性值this.getServletContext().removeAttribute("hello"); //移除屬性}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);} }在web.xml 中配置監聽器
<listener><listener-class>com.jas.listener.MyServletContextAttributeListener</listener-class> </listener>訪問“servletContext”后,輸出如下
屬性被創建了!hello:Hello 屬性被替換了! 屬性被移除了!(五)javabean 感知自己在Session 中狀態變化的監聽器
HttpSessionBindingListener
- 作用:當javabean 自己感知自己是否被加入到session 中
- 接口方法: valueBound()、valueUnbound()
- 接收事件: HttpSessionBindingEvent
- 觸發場景: 實現HttpSessionBindingListener 接口的類別,其實例如果被加入至session(HttpSession)對象的屬性中,則會調用 valueBound(),如果被從session(HttpSession)對象的屬性中移除,則會調用valueUnbound(),實現 HttpSessionBindingListener接口的類別不需在web.xml中設定。
HttpSessionActivationListener
- 作用:感知自己在session 中的鈍化與活化
- 接口方法: sessionDidActivate()、 sessionWillPassivate()
- 接收事件: HttpSessionEvent
- 觸發場景: 當HttpSession 對象中的對象將要隨HttpSession 被鈍化之前,調用 sessionWillPassivate() 方法。當被鈍化的HttpSession 活化之后調用sessionDidActivate() 方法。
PS:這兩個監聽器類很特殊,不需要自己去寫類實現也不需要在web.xml中注冊,只要使javabean實現這個接口就能起作用。
簡單例子演示(這里以HttpSessionBindingListener 為例,關于Session 的鈍化與活化,不了解的可以點擊最上面的鏈接查看)
創建一個javabean 實現HttpSessionBindingListener 接口,并創建一個Servlet 類,創建User 類實例,將其存儲在Session 域中。
javabean 類User
package com.jas.domain;import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; import java.io.Serializable;public class User implements Serializable,HttpSessionBindingListener {private String username;private int age;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {System.out.println("當前javabean 感知到了自己被綁定到了Session 域!");}@Overridepublic void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {System.out.println("當前javabean 感知到了自己被移出了Session 域!");} }Servlet 類SessionBindServlet
package com.jas.servlet;import com.jas.domain.User;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet("/sessionBindServlet") public class SessionBindServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {User user = new User();user.setAge(18);user.setUsername("Jas");request.getSession().setAttribute("user",user); //將user 對象添加到Session 域中request.getSession().removeAttribute("user"); //將user 對象從Session 域中移除}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);} }當訪問“sessionBindServlet” 時,輸出如下
當前javabean 感知到了自己被綁定到了Session 域! 當前javabean 感知到了自己被移出了Session 域!總結
以上是生活随笔為你收集整理的Servlet 监听器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 装win10反复重启怎么办 win10系
- 下一篇: Servlet 过滤器