日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Servlet 监听器

發布時間:2024/9/30 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 监听器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。