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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaWeb监听器

發布時間:2025/4/16 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaWeb监听器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

三大組件

  • Servlet
  • Listener
  • Filter

Listener:監聽器

  • 初次相見:AWT
  • 二次相見:SAX
  • 監聽器:

    • 它是一個接口,內容由我們來實現;
    • 它需要注冊,例如注冊在按鈕上!
    • 監聽器中的方法,會在特殊事件發生時被調用!

    觀察者:

    • 事件源:小偷
    • 事件:偷東西
    • 監聽器;
      • 警察
      • 監聽器中的方法:抓捕

    JavaWeb中的監聽器

    事件源:三大域

    1、ServletContext

    ServletContextListener

    生命周期監聽,它有兩個方法,一個在出生時調用,一個在死亡時調用

    • void contextInitialized(ServletContextEvent sce):創建SErvletcontext時
    • void contextDestroyed(ServletContextEvent sce):銷毀Servletcontext時

    ServletContextAttributeListener

    屬性監聽,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最后一個是在移除屬性時調用

    • void attributeAdded(ServletContextAttributeEvent event):添加屬性時
    • void attributeReplaced(ServletContextAttributeEvent event):替換屬性時
    • void attributeRemoved(ServletContextAttributeEvent event):移除屬性時

    2、HttpSession

    HttpSessionListener

    生命周期監聽,它有兩個方法,一個在出生時調用,一個在死亡時調用

    • void sessionCreated(HttpSessionEvent se):創建session時
    • void sessionDestroyed(HttpSessionEvent se):銷毀session時

    HttpSessioniAttributeListener

    屬性監聽,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最后一個是在移除屬性時調用

    • void attributeAdded(HttpSessionBindingEvent event):添加屬性時
    • void attributeReplaced(HttpSessionBindingEvent event):替換屬性時
    • void attributeRemoved(HttpSessionBindingEvent event):移除屬性時

    3、ServletRequest

    ServletRequestListener

    生命周期監聽,它有兩個方法,一個在出生時調用,一個在死亡時調用

    • void requestInitialized(ServletRequestEvent sre):創建request時
    • void requestDestroyed(ServletRequestEvent sre):銷毀request時

    ServletRequestAttributeListener

    屬性監聽,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最后一個是在移除屬性時調用

    • void attributeAdded(ServletRequestAttributeEvent srae):添加屬性時
    • void attributeReplaced(ServletRequestAttributeEvent srae):替換屬性時
    • void attributeRemoved(ServletRequestAttributeEvent srae):移除屬性時

    javaWeb中完成編寫監聽器

    • 寫一個監聽器類:要求必須去實現某個監聽器接口
    • 注冊,是在web.xml中配置來完成注冊

    事件對象

    1、ServletContextEvent

    ServletContext getServletContext()

    2、HttpSessionEvent

    HttpSession getSession()

    3、ServletRequestEvent

    • ServletContext getServletContext();
    • ServletReques getServletRequest();

    4、ServletContextAttributeEvent

    • ServletContext getServletContext()
    • String getName():獲取屬性名
    • Object getValue():獲取屬性值

    5、HttpSessionBindingEvent

    6、ServletRequestAttributeEvent

    感知監聽

    • 都與HttpSession相關
    • 它用來添加到JavaBean上,而不是添加到三大域上
    • 這兩個監聽器都不需要在web.xml中注冊

    HttpSessionBindingListener:添加到javabean上,javabean就知道自己是否添加到session中了。

    JavaWeb監聽器概述

    在JavaWeb被監聽的事件源為:ServletContext、HttpSession、ServletRequest,即三大域對象

    • 監聽域對象“創建”與“銷毀”的監聽器
    • 監聽域對象“操作域屬性”的監聽器
    • 監聽HttpSession的監聽器

    創建與銷毀監聽器

    創建與銷毀監聽器一共有三個

    1、ServletContextListener

    Tomcat啟動和關閉時調用下面兩個方法

    • public void contextInitialized(ServletContextEvent evt):ServletContext對象被創建后調用
    • public void contextDestroyed(ServletContextEvent evt):ServletContext對象被銷毀前調用

    2、HttpSessionListener

    開始會話和結束會話時調用下面兩個方法

    • public void sessionCreated(HttpSessionEvent evt):HttpSession對象被創建后調用
    • public void sessionDestroyed(HttpSessionEvent evt):HttpSession對象被銷毀前調用

    3、ServletRequestListener

    開始請求和結束請求時調用下面兩個方法

    • public void requestInitiallized(ServletRequestEvent evt):ServletRequest對象被創建后調用
    • public void requestDestroyed(ServletRequestEvent evt):ServletRequest對象被銷毀前調用

    事件對象

    • ServletContextEvent:ServletContext getServletContext()
    • HttpSeessionEvent:HttpSession getSession()
    • ServletRequestEvent:
      • ServletRequest getServletRequest()
      • ServletContext getServletContext()

    編寫測試例子

    • 編寫MyServletContextListener類,實現ServletContextListener接口
    • 在web.xml文件中部署監聽器
    • 為了看到session銷毀的效果,在web.xml文件中設置session失效時間為1分鐘
    /** ServletContextListener實現類* contextDestroyed() -- 在ServletContext對象被銷毀前調用* contextInitialized() -- -- 在ServletContext對象被創建后調用* ServletContextEvent -- 事件類對象* 該類有getServletContext(),用來獲取ServletContext對象,即獲取事件源對象*/ public class MyServletContextListener implements ServletContextListener {public void contextDestroyed(ServletContextEvent evt) {System.out.println("銷毀ServletContext對象");}public void contextInitialized(ServletContextEvent evt) {System.out.println("創建ServletContext對象");} } /** HttpSessionListener實現類* sessionCreated() -- 在HttpSession對象被創建后被調用* sessionDestroyed() -- -- 在HttpSession對象被銷毀前調用* HttpSessionEvent -- 事件類對象* 該類有getSession(),用來獲取當前HttpSession對象,即獲取事件源對象*/ public class MyHttpSessionListener implements HttpSessionListener {public void sessionCreated(HttpSessionEvent evt) {System.out.println("創建session對象");}public void sessionDestroyed(HttpSessionEvent evt) {System.out.println("銷毀session對象");} } /** ServletRequestListener實現類* requestDestroyed() -- 在ServletRequest對象被銷毀前調用* requestInitialized() -- 在ServletRequest對象被創建后調用* ServletRequestEvent -- 事件類對象* 該類有getServletContext(),用來獲取ServletContext對象* 該類有getServletRequest(),用來獲取當前ServletRequest對象,即事件源對象*/ public class MyServletRequestListener implements ServletRequestListener {public void requestDestroyed(ServletRequestEvent evt) {System.out.println("銷毀request對象");}public void requestInitialized(ServletRequestEvent evt) {System.out.println("創建request對象");} } <listener><listener-class>cn.itcast.listener.MyServletContextListener</listener-class> </listener><listener><listener-class>cn.itcast.listener.MyHttpSessionListener</listener-class> </listener><listener><listener-class>cn.itcast.listener.MyServletRequestListener</listener-class> </listener><session-config><session-timeout>1</session-timeout> </session-config>

    操作域屬性的監聽器

    當對域屬性進行增、刪、改時,執行的監聽器一共有三個:

    1、ServletContextAttributeListener

    在ServletContext域進行增、刪、改屬性時調用下面方法

    • public void attributeAdded(ServletContextAttributeEvent evt)
    • public void attributeRemoved(ServletContextAttributeEvent evt)
    • public void attributeReplaced(ServletContextAttributeEvent evt)

    2、HttpSessionAttributeListener

    在HttpSession域進行增、刪、改屬性時調用下面方法

    • public void attributeAdded(HttpSessionBindingEvent evt)
    • public void attributeRemoved (HttpSessionBindingEvent evt)
    • public void attributeReplaced (HttpSessionBindingEvent evt)

    3、ServletRequestAttributeListener

    在ServletRequest域進行增、刪、改屬性時調用下面方法

    • public void attributeAdded(ServletRequestAttributeEvent evt)
    • public void attributeRemoved (ServletRequestAttributeEvent evt)
    • public void attributeReplaced (ServletRequestAttributeEvent evt)

    下面對這三個監聽器的事件對象功能進行介紹:

    4、ServletContextAttributeEvent

    • String getName():獲取當前操作的屬性名
    • Object getValue():獲取當前操作的屬性值
    • ServletContext getServletContext():獲取ServletContext對象

    5、HttpSessionBindingEvent

    • String getName():獲取當前操作的屬性名
    • Object getValue():獲取當前操作的屬性值
    • HttpSession getSession():獲取當前操作的session對象

    6、ServletRequestAttributeEvent

    • String getName():獲取當前操作的屬性名
    • Object getValue():獲取當前操作的屬性值
    • ServletContext getServletContext():獲取ServletContext對象
    • ServletRequest getServletRequest():獲取當前操作的ServletRequest對象
    public class MyListener implements ServletContextAttributeListener,ServletRequestAttributeListener, HttpSessionAttributeListener {public void attributeAdded(HttpSessionBindingEvent evt) {System.out.println("向session中添加屬性:" + evt.getName() + "=" + evt.getValue());}public void attributeRemoved(HttpSessionBindingEvent evt) {System.out.println("從session中移除屬性:" + evt.getName() + "=" + evt.getValue());}public void attributeReplaced(HttpSessionBindingEvent evt) {System.out.println("修改session中的屬性:" + evt.getName() + "=" + evt.getValue());}public void attributeAdded(ServletRequestAttributeEvent evt) {System.out.println("向request中添加屬性:" + evt.getName() + "=" + evt.getValue());}public void attributeRemoved(ServletRequestAttributeEvent evt) {System.out.println("從request中移除屬性:" + evt.getName() + "=" + evt.getValue());}public void attributeReplaced(ServletRequestAttributeEvent evt) {System.out.println("修改request中的屬性:" + evt.getName() + "=" + evt.getValue());}public void attributeAdded(ServletContextAttributeEvent evt) {System.out.println("向context中添加屬性:" + evt.getName() + "=" + evt.getValue());}public void attributeRemoved(ServletContextAttributeEvent evt) {System.out.println("從context中移除屬性:" + evt.getName() + "=" + evt.getValue());}public void attributeReplaced(ServletContextAttributeEvent evt) {System.out.println("修改context中的屬性:" + evt.getName() + "=" + evt.getValue());} } public class ListenerServlet extends BaseServlet {public String contextOperation(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {ServletContext context = this.getServletContext();context.setAttribute("a", "a");context.setAttribute("a", "A");context.removeAttribute("a");return "/index.jsp";}///public String sessionOperation(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {HttpSession session = request.getSession();session.setAttribute("a", "a");session.setAttribute("a", "A");session.removeAttribute("a");return "/index.jsp";}///public String requestOperation(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setAttribute("a", "a");request.setAttribute("a", "A");request.removeAttribute("a");return "/index.jsp";} } <body><a href="<c:url value='/ListenerServlet?method=contextOperation'/>">SevletContext操作屬性</a><br/><a href="<c:url value='/ListenerServlet?method=sessionOperation'/>">HttpSession操作屬性</a><br/><a href="<c:url value='/ListenerServlet?method=requestOperation'/>">ServletRequest操作屬性</a> | </body>

    Session的序列化

    服務器關閉的時候,會把session序列化到SESSION.ser文件中

    不需要序列化的時候,如下設置

    HttpSession的監聽器

    還有兩個與HttpSession相關的特殊的監聽器,這兩個監聽器的特點如下:

    • 不用在web.xml文件中部署
    • 這兩個監聽器不是給session添加,而是給Bean添加。即讓Bean類實現監聽器接口,然后再把Bean對象添加到session域中

    下面對這兩個監聽器介紹一下:

    1、HttpSessionBindingListener

    當某個類實現了該接口后,可以感知本類對象添加到session中,以及感知從session中移除。例如讓Person類實現HttpSessionBindingListener接口,那么當把Person對象添加到session中,或者把Person對象從session中移除時會調用下面兩個方法:

    • public void valueBound(HttpSessionBindingEvent event)
      當把監聽器對象添加到session中會調用監聽器對象的本方法

    • public void valueUnbound(HttpSessionBindingEvent event)
      當把監聽器對象從session中移除時會調用監聽器對象的本方法

    這里要注意,HttpSessionBindingListener監聽器的使用與前面介紹的都不相同,當該監聽器對象添加到session中,或把該監聽器對象從session移除時會調用監聽器中的方法。并且無需在web.xml文件中部署這個監聽器

    示例步驟:

    • 編寫Person類,讓其實現HttpSessionBindingListener監聽器接口
    • 編寫Servlet類,一個方法向session中添加Person對象,另一個從session中移除Person對象
    • 在index.jsp中給出兩個超鏈接,分別訪問Servlet中的兩個方法

    Pseron.java

    public class Person implements HttpSessionBindingListener {private String name;private int age;private String sex;public Person(String name, int age, String sex) {super();this.name = name;this.age = age;this.sex = sex;}public Person() {super();}public String toString() {return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public void valueBound(HttpSessionBindingEvent evt) {System.out.println("把Person對象存放到session中:" + evt.getValue());}public void valueUnbound(HttpSessionBindingEvent evt) {System.out.println("從session中移除Pseron對象:" + evt.getValue());} }

    ListenerServlet.java

    public class ListenerServlet extends BaseServlet {public String addPerson(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Person p = new Person("zhangSan", 23, "male");request.getSession().setAttribute("person", p);return "/index.jsp";}public String removePerson(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.getSession().removeAttribute("person");return "/index.jsp";}

    index.jsp

    <body><a href="<c:url value='/ListenerServlet?method=addPerson'/>">addPerson</a><br/><a href="<c:url value='/ListenerServlet?method=removePerson'/>">removePerson</a><br/></body>

    2、HttpSessionActivationListener

    Tomcat會在session長時間不被使用時鈍化session對象,所謂鈍化session,就是把session通過序列化的方式保存到硬盤文件中。當用戶再使用session時,Tomcat還會把鈍化的對象再活化session,所謂活化就是把硬盤文件中的session在反序列化回內存。當session被Tomcat鈍化時,session中存儲的對象也被純化,當session被活化時,也會把session中存儲的對象活化。如果某個類實現了HttpSessionActiveationListener接口后,當對象隨著session被鈍化和活化時,下面兩個方法就會被調用:

    • public void sessionWillPassivate(HttpSessionEvent se):當對象感知被活化時調用本方法
    • public void sessionDidActivate(HttpSessionEvent se):當對象感知被鈍化時調用本方法

    HttpSessionActivationListener監聽器與HttpSessionBindingListener監聽器相似,都是感知型的監聽器,例如讓Person類實現了HttpSessionActivationListener監聽器接口,并把Person對象添加到了session中后,當Tomcat鈍化session時,同時也會鈍化session中的Person對象,這時Person對象就會感知到自己被鈍化了,其實就是調用Person對象的sessionWillPassivate()方法。當用戶再次使用session時,Tomcat會活化session,這時Person會感知到自己被活化,其實就是調用Person對象的sessionDidActivate()方法。

    注意,因為鈍化和活化session,其實就是使用序列化和反序列化技術把session從內存保存到硬盤,和把session從硬盤加載到內存。這說明如果Person類沒有實現Serializable接口,那么當session鈍化時就不會鈍化Person,而是把Person從session中移除再鈍化!這也說明session活化后,session中就不在有Person對象了。

    示例步驟:

    先不管HttpSessionActivationListener監聽器接口,先來配置Tomcat鈍化session的參數,把下面配置文件放到tomcat\conf\catalina\localhost目錄下!文件名稱為項目名稱。

    <Context><Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"><Store className="org.apache.catalina.session.FileStore" directory="mysession"/></Manager> </Context>

    訪問項目的index.jsp頁面,這會使Tomcat創建Session對象,然后等待一分鐘后,查看Tomcat\work\Catalina\localhost\listener\mysession目錄下是否會產生文件,如果產生了,說明鈍化session的配置成功了,可以開始下一步了。

    創建Person類,讓Person類實現HttpSessionActivationListener和Serializable接口

    Person.java

    public class Person implements HttpSessionActivationListener, Serializable {private String name;private int age;private String sex;public Person(String name, int age, String sex) {super();this.name = name;this.age = age;this.sex = sex;}public Person() {super();}public String toString() {return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public void sessionDidActivate(HttpSessionEvent evt) {System.out.println("session已經活化");}public void sessionWillPassivate(HttpSessionEvent evt) {System.out.println("session被鈍化了!");} }

    與上例一樣,編寫Servlet,提供兩個方法:一個向session中添加Person對象,另一個從session中移除Person對象:

    Person.java

    public class ListenerServlet extends BaseServlet {public String addPerson(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Person p = new Person("zhangSan", 23, "male");request.getSession().setAttribute("person", p);return "/index.jsp";}public String removePerson(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.getSession().removeAttribute("person");return "/index.jsp";} }

    在index.jsp頁面中給出訪問addPerson()和removePerson()的方法:

    <body><a href="<c:url value='/ListenerServlet?method=addPerson'/>">addPerson</a><br/><a href="<c:url value='/ListenerServlet?method=removePerson'/>">removePerson</a><br/></body>
    • 打開index.jsp頁面,這時Tomcat會創建session,必須在1分鐘之前點擊addPerson鏈接,這能保證在session被鈍化之前把Person對象添加到session中
    • 等待一分鐘,這時session會被鈍化,也就會調用Person的sessionWillPassivate()
    • 刷新一下index.jsp頁面,這會使session活化,會調用Person的sessionDidActivate()方法

    總結

    以上是生活随笔為你收集整理的JavaWeb监听器的全部內容,希望文章能夠幫你解決所遇到的問題。

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