Listener监听器,实现一个显示在线用户人数

打印 上一主题 下一主题

主题 943|帖子 943|积分 2829

Listener监听器,实现一个显示在线用户人数


每博一文案
  1. 关于后半身,脾气越温,福报越深。
  2. 师傅说:惜命最好的方式不是养生,而是管好自己的情绪。
  3. 坏毛病都是惯出来的,但好脾气都是磨出来的,与人生气,伤的是和气,与自己生气,伤的是身体。
  4. 佛说:人有五毒心,贪嗔痴慢疑,其中一时的嗔念起,百万叶障深,火烧功德林,脾气来了,福气就走了。
  5. 破得了偏执,才修得了善行。世上最亏本的事,就是用一时的冲动消耗了积累的福报。
  6. 既然你是对的,那你没必要发脾气。但如果你是错的,那你就没资格发脾气。
  7. 在感情的世界里,愤怒时的态度也是丈量幸福的尺度。
  8. 一个人生气是怎么对你,他平时就怎么爱你,在一起久了,性格会互补,爱得多的脾气,
  9. 会越来越好,被爱的会越来越霸道,总得有一个人原意低头迁就,所有的包容都来自深爱,
  10. 所有的好脾气都是不想失去,因为彼此心灵都明白,争执不是唯一的目的,磨合得更紧密,才是
  11. 最重要的主题。
  12. 爱,就是什么都介意,最后又什么都原谅脾气,人人都有,拿出来是本能,但压下去才是本事。
  13. 一个人成熟的标志就是变得不爱生气了,因为能让你在意的事情变少了,以前能冒犯到你的,
  14. 现在都变得无所谓了,以前无法容忍的,现在想想就作罢了。就像灰尘落在身上,轻轻拂去就好了。
  15. 不用蹲下懊恼,阻碍了前行的脚步。
  16. 你只有这一生,不能慷慨赠与没有意义的人,也不必为不值得的事,就轻易放弃开心的权利。
  17. 愿你此生尽兴,时辰善良,愿你所有的快乐都无需假装。
  18.                                     ——————《一禅心灵庙语》
复制代码
目录

1. Listener 监听器的概述


Listener  监听器是Servlet规范中的一员。就像Filter一样。Filter也是Servlet规范中的一员。
在Servlet中,所有的监听器接口都是以Listener结尾。
Listener 监听器的作用:


  • 监听器实际上是Servlet规范留给我们javaweb程序员的特殊时机。特殊的时刻如果想执行这段代码,你需要想到使用对应的监听器。
  • 简单的说就是,当你的程序执行过程中满足的了/触发了某个事件,则该Listener 监听器中的方法就会被调用,并执行。比如:我们的Java中的 静态代码块 (当我们对于的 类加载到 内存当中时,该类当中的 静态代码块,就会被执行,并且只会仅仅只会执行一次。)如下:
  1. package com.RainbowSea.listener;
  2. public class Test {
  3.     // 只要这个 Test 类(被加加载到了内存,这个事件)当中,该静态代码块就会被执行,并且只会仅仅只会执行一次。
  4.     static {
  5.         System.out.println("静态代码块被执行了");
  6.     }
  7.     public static void main(String[] args) {
  8.         Test test = new Test();  // 实例化,该对象的时候,就会将该 Test 类加载到内存当中,(该Test 加载
  9.         // 到内存当中,该事件触发,执行其中 Test 类当中定义的 静态代码块。 )
  10.     }
  11. }
复制代码


  • 类似的,如果你对 javaScript  有一个了解的话,那么你就可以,更好的理解这里所受的 事件 这个元素了。因为JavaScript就是一个基于 触发事件的执行的语言。
2. Listener 监听器在 Servlet 的体系结构


  • 概念:Listener表示监听器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
  • 监听器可以监听就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件
  • Listener分类:JavaWeb中提供了8个监听器
监听器分类监听器名称作用ServletContext监听ServletContextListener用于对ServletContext对象进行监听( 创建、销毁)ServletContextAttributeListener对ServletContext对象中属性的监听( 增删改属性)Session监听HttpSessionListener对Session对象的整体状态的监听(创建、销毁)HttpSessionBindingListener监听对象与Session的绑定和解除HttpSessionActivationListener对Session数据的钝化和活化的监听Request监听ServletRequestListener对Request对象进行监听(创建、销毁)ServletContextAttributeListener对Request对象中属性的监听(增删改属性)下面的是基于 Tomcat 10 的环境下的:Servlet规范中提供的监听器 ?

  • jakarta.servlet包下:

    • ServletContextListener
    • ServletContextAttributeListener
    • ServletRequestListener
    • ServletRequestAttributeListener

  • jakarta.servlet.http包下:

    • HttpSessionListener
    • HttpSessionAttributeListener

      • 该监听器需要使用 @WebListener注解进行标注。
      • 该监听器监听的是什么?是session域中数据的变化。只要数据变化,则执行相应的方法。主要监测点在session域对象上。

    • HttpSessionBindingListener

      • 该监听器不需要使用@WebListener进行标注。
      • 假设User类实现了该监听器,那么User对象在被放入session的时候触发bind事件,User对象从session中删除的时候,触发unbind事件。
      • 假设Customer类没有实现该监听器,那么Customer对象放入session或者从session删除的时候,不会触发bind和unbind事件。
      • 文章后面,会对其详细说明。

    • HttpSessionIdListener

      • session的id发生改变的时候,监听器中的唯一一个方法就会被调用。

    • HttpSessionActivationListener

      • 监听session对象的钝化和活化的。
      • 钝化:session对象从内存存储到硬盘文件。
      • 活化:从硬盘文件把session恢复到内存。


3. 编写一个 Listener 监听器的过程

3.1 ServletContextListener

除了Servlet和Filter外,JavaEE的Servlet规范还提供了第三种组件:Listener。
Listener顾名思义就是监听器,有好几种Listener,其中最常用的是ServletContextListener,我们编写一个实现了ServletContextListener接口。在编写之前我们先回顾一下: ServletContext 的作用:一个Web服务器可以运行一个或多个WebApp,对于每个WebApp,Web服务器都会为其创建一个全局唯一的ServletContext实例(因为一个 webApp 就只有一个 名为 web.xml 的配置文件),我们在AppListener里面编写的两个回调方法实际上对应的就是ServletContext实例的创建和销毁:ServletContext是一个WebApp运行期的全局唯一实例,可用于设置和共享配置信息。
ServletContextListener 监听器作用是:要监听的是 ServletContext的对象的状态 其中的两个方法 contextInitialized() 监听 ServletContext 的创建,contextDestroyed()监听 ServletContext 的销毁的 ,这个创建和销毁的状态事情。


其中两个方法是作用:
注意一点:就是:监听器中的方法不需要程序员手动调用,是发生某个特殊事件(触发)之后,被服务器调用。
  1. /**
  2.      ** Notification that the web application initialization process is starting.
  3.      * All ServletContextListeners are notified of context initialization before
  4.      * any filter or servlet in the web application is initialized.
  5.      * The default implementation is a NO-OP.
  6.      * @param sce Information about the ServletContext that was initialized
  7.      */
  8.     public default void contextInitialized(ServletContextEvent sce) {
  9.         // 该方法的作用是:这个方法是在ServletContext 对象被创建的时候调用
  10.         
  11.     }
复制代码
  1. /**
  2.      ** Notification that the servlet context is about to be shut down. All
  3.      * servlets and filters have been destroyed before any
  4.      * ServletContextListeners are notified of context destruction.
  5.      * The default implementation is a NO-OP.
  6.      * @param sce Information about the ServletContext that was destroyed
  7.      */
  8.     public default void contextDestroyed(ServletContextEvent sce) {
  9.         // 这个方法是ServletContext 对象被销毁的时候执行
  10.     }
复制代码
上述两个方法是举例说明:
编写一个 Servlet 创建 ServletContext 应用域对象,触发创建 ServletContext 事件
  1. package com.RainbowSea.listener;
  2. import jakarta.servlet.ServletContext;
  3. import jakarta.servlet.ServletException;
  4. import jakarta.servlet.annotation.WebServlet;
  5. import jakarta.servlet.http.HttpServlet;
  6. import jakarta.servlet.http.HttpServletRequest;
  7. import jakarta.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. @WebServlet("/test")
  10. public class MyServlet extends HttpServlet {
  11.     @Override
  12.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
  13.             IOException {
  14.         // 创建 ServetContext 应用域对象
  15.         ServletContext servletContext = request.getServletContext();
  16.     }
  17. }
复制代码
创建 TestServletContextListener 类 实现  ServletContextListener 接口,用于事件的触发,服务器调用其中的方法()
  1. package com.RainbowSea.listener;
  2. import jakarta.servlet.ServletContextEvent;
  3. import jakarta.servlet.ServletContextListener;
  4. /**
  5. * ServletContextListener 是用来监视 ServletContext 应用域的状态的监听器
  6. */
  7. public class TestServletContextListener implements ServletContextListener {
  8.     @Override
  9.     public void contextInitialized(ServletContextEvent sce) {
  10.         // 现在这个特殊的时刻写代码,你写就是了,他会被服务器自动调用了
  11.         // 这个方法是在ServletContext 对象被创建的时候调用
  12.         System.out.println("ServletContext  应用域对象创建了");
  13.     }
  14.     @Override
  15.     public void contextDestroyed(ServletContextEvent sce) {
  16.         //这个方法是 在 ServletContext 对象被销毁的时候调用的
  17.         System.out.println("ServletContext 应用域对被销毁了");
  18.     }
  19. }
复制代码
编写该 ServletContextListener 的配置信息,在 web.xml 当中,如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
  5.          version="5.0">
  6.    
  7.     <listener>
  8.         <listener-class>com.RainbowSea.listener.TestServletContextListener</listener-class>
  9.     </listener>
  10.    
  11. </web-app>
复制代码
也可以使用该注解@WebListener() 注解的方式,需要注意的是:该注解不需要赋值属性,使用默认的就可以了。


运行结果:


4. 其他Listener 监听器的使用:

介绍一些其他常用的:Listener 监听器的使用:
4.1 ServletRequestListener

ServletRequestListener 监听器的作用:监听的是 Request 请求域的状态,主要为:监听 ServletRequestListener() 销毁,requestInitialized() 创建。


ServletRequestListener 中的两个  default 默认方法的说明:
  1. /**
  2.      * The request is about to go out of scope of the web application.
  3.      * The default implementation is a NO-OP.
  4.      * @param sre Information about the request
  5.      */
  6.     public default void requestDestroyed (ServletRequestEvent sre) {
  7.         // 该方法表示:当 request 请求对象销毁的时候执行。
  8.     }
复制代码
  1. /**
  2.      * The request is about to come into scope of the web application.
  3.      * The default implementation is a NO-OP.
  4.      * @param sre Information about the request
  5.      */
  6.     public default void requestInitialized (ServletRequestEvent sre) {
  7.         // 表方法表示:当 request 请求对象创建的时候,执行
  8.     }
复制代码
举例:
  1. package com.RainbowSea.listener;
  2. import jakarta.servlet.ServletException;
  3. import jakarta.servlet.annotation.WebServlet;
  4. import jakarta.servlet.http.HttpServlet;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import jakarta.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/test")
  9. public class MyServlet extends HttpServlet {
  10.     @Override
  11.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
  12.             IOException {
  13.     }
  14. }
复制代码
  1. package com.RainbowSea.listener;
  2. import jakarta.servlet.ServletRequestEvent;
  3. import jakarta.servlet.ServletRequestListener;
  4. import jakarta.servlet.annotation.WebListener;
  5. /**
  6. * ServletRequestLister 是用来监听 Request 请求域对象的销毁和创建两种状态的。
  7. */
  8. @WebListener // 使用注解的方式,不要赋值,使用 默认值
  9. public class TestServletRequestListener implements ServletRequestListener {
  10.     // 该方法当 request 请求域对象要被销毁的时候,tomcat 服务器调用该方法
  11.     @Override
  12.     public void requestDestroyed(ServletRequestEvent sre) {
  13.         System.out.println("request 请求对象被销毁了");
  14.     }
  15.     // 该方法当 request 请求域对象创建的时候,Tomcat 服务器调用该方法
  16.     @Override
  17.     public void requestInitialized(ServletRequestEvent sre) {
  18.         System.out.println("request 请求对象创建了");
  19.     }
  20. }
复制代码
运行测试结果:

ng)
4.2 HttpSessionListener

**HttpSessionListener 监听的作用:是监听 session 会话域对象的创建和销毁的状态:sessionCreated()监视 Session 的创建,sessionDestroyed() 监视销毁。 **


其中两个方法的详细说明:
  1. /**
  2.      * Notification that a session was created.
  3.      * The default implementation is a NO-OP.
  4.      *
  5.      * @param se
  6.      *            the notification event
  7.      */
  8.     public default void sessionCreated(HttpSessionEvent se) {
  9.         // 该方法当 session 会话域对象创建的时候,被 Tomcat 服务器调用并执行
  10.     }
复制代码
  1. /**
  2.      * Notification that a session is about to be invalidated.
  3.      * The default implementation is a NO-OP.
  4.      *
  5.      * @param se
  6.      *            the notification event
  7.      */
  8.     public default void sessionDestroyed(HttpSessionEvent se) {
  9.         // 该方法当 session 会话域对象销毁的时候,被 Tomcat 服务器调用并执行
  10.     }
复制代码
举例1验证:
创建一个 MyServlet 类,该类当中创建 Session 会话域对象,触发 HttpSessionListener 中 session 销毁事件,让服务器调用其中的方法,同时编写调用 session 中的销毁的方法,触发销毁是事件。
  1. package com.RainbowSea.listener;
  2. import jakarta.servlet.ServletException;
  3. import jakarta.servlet.annotation.WebServlet;
  4. import jakarta.servlet.http.HttpServlet;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import jakarta.servlet.http.HttpServletResponse;
  7. import jakarta.servlet.http.HttpSession;
  8. import java.io.IOException;
  9. @WebServlet("/test")
  10. public class MyServlet extends HttpServlet {
  11.     @Override
  12.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
  13.             IOException {
  14.         // session 会话域对象是来自服务器的,所有是通过 request 请求获取到的
  15.         // 该方法如果服务器中没有 session 会话域对象,则自动创建
  16.         HttpSession session = request.getSession();
  17.         if (session != null) {
  18.             // session 销毁
  19.             session.invalidate();
  20.         }
  21.     }
  22. }
复制代码
  1. package com.RainbowSea.listener;
  2. import jakarta.servlet.annotation.WebListener;
  3. import jakarta.servlet.http.HttpSessionEvent;
  4. import jakarta.servlet.http.HttpSessionListener;
  5. /**
  6. * HttpSessionListener 是用来监视 session 会话域对象的创建和销毁的状态的。
  7. */
  8. @WebListener // 使用注解配置,不需要赋值使用默认的值
  9. public class TestHttpSessionListener implements HttpSessionListener {
  10.     @Override
  11.     public void sessionCreated(HttpSessionEvent se) {
  12.        // 该方法 session 创建的时候,被Tomcat 服务器调用并执行
  13.         System.out.println("session 会话域对象创建了");
  14.     }
  15.     @Override
  16.     public void sessionDestroyed(HttpSessionEvent se) {
  17.         System.out.println("session 会话域对象被销毁了");
  18.     }
  19. }
复制代码
测试效果:

举例2 我们启用 JSP中九大内置对象中的之一的 session 对象
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4.     <title>Title</title>
  5. </head>
  6. <body>
  7. <a target="_blank" href="https://www.cnblogs.com/<%=request.getContextPath()%>/test"> session 会话销毁</a>
  8. </body>
  9. </html>
复制代码
  1. package com.RainbowSea.listener;
  2. import jakarta.servlet.ServletException;
  3. import jakarta.servlet.annotation.WebServlet;
  4. import jakarta.servlet.http.HttpServlet;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import jakarta.servlet.http.HttpServletResponse;
  7. import jakarta.servlet.http.HttpSession;
  8. import java.io.IOException;
  9. @WebServlet("/test")
  10. public class MyServlet extends HttpServlet {
  11.     @Override
  12.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
  13.             IOException {
  14.         // session 会话域对象是来自服务器的,所有是通过 request 请求获取到的
  15.         // 该方法如果服务器中没有 session 会话域对象,不会自动创建
  16.         HttpSession session = request.getSession(false);
  17.         if (session != null) {  // 防止 null 引用
  18.             // session 销毁
  19.             session.invalidate();
  20.         }
  21.     }
  22. }
复制代码
  1. package com.RainbowSea.listener;
  2. import jakarta.servlet.ServletRequestEvent;
  3. import jakarta.servlet.ServletRequestListener;
  4. import jakarta.servlet.annotation.WebListener;
  5. /**
  6. * ServletRequestLister 是用来监听 Request 请求域对象的销毁和创建两种状态的。
  7. */
  8. //@WebListener // 使用注解的方式,不要赋值,使用 默认值
  9. public class TestServletRequestListener implements ServletRequestListener {
  10.     // 该方法当 request 请求域对象要被销毁的时候,tomcat 服务器调用该方法
  11.     @Override
  12.     public void requestDestroyed(ServletRequestEvent sre) {
  13.         System.out.println("request 请求对象被销毁了");
  14.     }
  15.     // 该方法当 request 请求域对象创建的时候,Tomcat 服务器调用该方法
  16.     @Override
  17.     public void requestInitialized(ServletRequestEvent sre) {
  18.         System.out.println("request 请求对象创建了");
  19.     }
  20. }
复制代码
测试效果:

4.3 HttpSessionAttributeListener

HttpSessionAttributeListener 的监听器的作用是:监视 向Session 会话域当中 添加,修改,移除数据的状态的事件的监听。


同理的其中对应的这些

  • jakarta.servlet.ServletContextAttributeListener 也是一样的其作用是:向 ServletContext 应用域当中添加,修改,移除数据的状态的事件的监听。



  • jakarta.servlet.ServletRequestAttributeListener也是一样的其作用是:向  Request 请求域当中添加,修改,移除数据的状态的事件的监听。


这三者的接口的结构是一样的,其方法的作用也是一样的,使用的方法也是一样的,这里就不多赘述了,这里就仅仅对其中的 jakarta.servlet.http.HttpSessionAttributeListener 作演示,另外两个的使用大致都是和它是一样的。
这里下面是对jakarta.servlet.http.HttpSessionAttributeListener接口中的 方法的说明:
  1. /**
  2.      * Notification that an attribute has been added to a session. Called after
  3.      * the attribute is added.
  4.      * The default implementation is a NO-OP.
  5.      *
  6.      * @param se Information about the added attribute
  7.      */
  8.     public default void attributeAdded(HttpSessionBindingEvent se) {
  9.       // 向Session 会话域当中添加存储数据的时候,以下方法被服务器调用执行
  10.     }
复制代码
  1. /**
  2.      * Notification that an attribute has been removed from a session. Called
  3.      * after the attribute is removed.
  4.      * The default implementation is a NO-OP.
  5.      *
  6.      * @param se Information about the removed attribute
  7.      */
  8.     public default void attributeRemoved(HttpSessionBindingEvent se) {
  9.         // 将Session 会话域当中的数据删除的时候,以下方法被服务器调用执行了
  10.     }
复制代码
  1. /**
  2.      * Notification that an attribute has been replaced in a session. Called
  3.      * after the attribute is replaced.
  4.      * The default implementation is a NO-OP.
  5.      *
  6.      * @param se Information about the replaced attribute
  7.      */
  8.     public default void attributeReplaced(HttpSessionBindingEvent se) {
  9.          // 将Session 会话当中某个数据被替换修改了,以下方法被服务器调用执行
  10.     }
复制代码
举例验证:
  1. package com.RainbowSea.listener;
  2. import jakarta.servlet.ServletException;
  3. import jakarta.servlet.annotation.WebServlet;
  4. import jakarta.servlet.http.HttpServlet;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import jakarta.servlet.http.HttpServletResponse;
  7. import jakarta.servlet.http.HttpSession;
  8. import java.io.IOException;
  9. @WebServlet("/test")
  10. public class MyServlet extends HttpServlet {
  11.     @Override
  12.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
  13.             IOException {
  14.         // session 会话域对象是来自服务器的,所有是通过 request 请求获取到的
  15.         // 该方法如果服务器中没有 session 会话域对象,则会自动创建
  16.         HttpSession session = request.getSession();
  17.         // 向 session 会话域当中添加数据
  18.         session.setAttribute("test",001);
  19.         // 向 session 会话域当中替换数据
  20.         session.setAttribute("test",100);
  21.         // session 会话域当中移除数据
  22.         session.removeAttribute("test");
  23.     }
  24. }
复制代码
  1. package com.RainbowSea.listener;
  2. import jakarta.servlet.annotation.WebListener;
  3. import jakarta.servlet.http.HttpSessionAttributeListener;
  4. import jakarta.servlet.http.HttpSessionBindingEvent;
  5. /**
  6. * HttpSessionAttributeListener 监视 session 会话域当中的数据的添加,移除,修改(替换) 事件的监听
  7. */
  8. @WebListener // 使用注解:使用注解当中的默认值,不需要赋值
  9. public class TestHttpSessionAttributeListener implements HttpSessionAttributeListener {
  10.     @Override
  11.     public void attributeAdded(HttpSessionBindingEvent se) {
  12.         // 向 session 会话域当中添加数据时,该方法被服务器调用,并执行了
  13.         System.out.println("session add 添加数据了");
  14.     }
  15.     @Override
  16.     public void attributeRemoved(HttpSessionBindingEvent se) {
  17.         // 向 session 会话域当中移除数据时,该方法被服务器调用,并执行了
  18.         System.out.println("session removed 移除数据了");
  19.     }
  20.     @Override
  21.     public void attributeReplaced(HttpSessionBindingEvent se) {
  22.         // 向 session 会话域当中的数据 被 替换时,该方法被服务器调用,并执行了
  23.         System.out.println("session replaced 替换数据了");
  24.     }
  25. }
复制代码
Debugger 断点测试验证:



4.4 HttpSessionBindingListener

HttpSessionBindingListener 监视器的作用:是 对应一个 Javabeen 对象的实现了implements  HttpSessioniBingingListener 接口的添加到  Session 会话域当中的。

  • 该监听器不需要使用@WebListener进行标注。
  • 假设User类实现了该监听器,那么User对象在被放入session的时候触发绑定 bind事件,User对象从session中删除的时候,触发解绑 unbind事件。
  • 假设Customer类没有实现该监听器,那么Customer对象放入session或者从session删除的时候,不会触发bind和unbind事件



如下是关于:HttpSessionBingingListener 两个方法的详细说明:
  1. /**
  2.      * Notifies the object that it is being bound to a session and identifies
  3.      * the session.
  4.      * The default implementation is a NO-OP.
  5.      *
  6.      * @param event
  7.      *            the event that identifies the session
  8.      * @see #valueUnbound
  9.      */
  10.     public default void valueBound(HttpSessionBindingEvent event) {
  11.         // 向 session 会话域当中添加 : 对象(该对象实现了 HttpSessionBingingListener) 的 javabeen 绑定数据 。
  12.     }
复制代码
  1. /**
  2.      * Notifies the object that it is being unbound from a session and
  3.      * identifies the session.
  4.      * The default implementation is a NO-OP.
  5.      *
  6.      * @param event
  7.      *            the event that identifies the session
  8.      * @see #valueBound
  9.      */
  10.     public default void valueUnbound(HttpSessionBindingEvent event) {
  11.         // 将 session 会话域当中的移除: (该对象实现了 HttpSessionBingingListener) 的 javabeen ) 解绑数据
  12.     }
复制代码
**JavaBeen 类实现 HttpSessionBindingListener **
  1. package com.RainbowSea.been;
  2. import jakarta.servlet.http.HttpSessionBindingEvent;
  3. import jakarta.servlet.http.HttpSessionBindingListener;
  4. import java.util.Objects;
  5. public class User implements HttpSessionBindingListener {
  6.     private String name ;
  7.     private String password;
  8.     @Override
  9.     public void valueBound(HttpSessionBindingEvent event) {
  10.         // 将该 User 实现了 HttpSessionBindingListener 接口的 javabeen 添加到 session 会话域调用;
  11.         System.out.println("Session  绑定 JavaBeen 数据");
  12.     }
  13.     @Override
  14.     public void valueUnbound(HttpSessionBindingEvent event) {
  15.         // 将该 User 实现了 HttpSessionBindingListener 接口的 javabeen的从 session 会话域当中移除被调用
  16.         System.out.println("Session 解绑 JaveBeen 数据");
  17.     }
  18.     public User() {
  19.     }
  20.     public User(String name, String password) {
  21.         this.name = name;
  22.         this.password = password;
  23.     }
  24.     public String getName() {
  25.         return name;
  26.     }
  27.     public void setName(String name) {
  28.         this.name = name;
  29.     }
  30.     public String getPassword() {
  31.         return password;
  32.     }
  33.     public void setPassword(String password) {
  34.         this.password = password;
  35.     }
  36.     @Override
  37.     public boolean equals(Object o) {
  38.         if (this == o) return true;
  39.         if (!(o instanceof User)) return false;
  40.         User user = (User) o;
  41.         return Objects.equals(getName(), user.getName()) && Objects.equals(getPassword(), user.getPassword());
  42.     }
  43.     @Override
  44.     public int hashCode() {
  45.         return Objects.hash(getName(), getPassword());
  46.     }
  47.     @Override
  48.     public String toString() {
  49.         return "User{" +
  50.                 "name='" + name + '\'' +
  51.                 ", password='" + password + '\'' +
  52.                 '}';
  53.     }
  54. }
复制代码
  1. package com.RainbowSea.listener;
  2. import com.RainbowSea.been.User;
  3. import jakarta.servlet.ServletException;
  4. import jakarta.servlet.annotation.WebServlet;
  5. import jakarta.servlet.http.HttpServlet;
  6. import jakarta.servlet.http.HttpServletRequest;
  7. import jakarta.servlet.http.HttpServletResponse;
  8. import jakarta.servlet.http.HttpSession;
  9. import java.io.IOException;
  10. @WebServlet("/user")
  11. public class TestHttpSessionBingingListener extends HttpServlet {
  12.     @Override
  13.     protected void doGet(HttpServletRequest request, HttpServletResponse response)
  14.             throws ServletException, IOException {
  15.         // 获取到 session 应用域对象
  16.         HttpSession session = request.getSession();
  17.         User  user = new User("Jack","123");
  18.         // 向 session 应用域当中添加  实现了 HttpSessionBindingListener 的 JavaBeen
  19.         session.setAttribute("user",user);
  20.         //  将 session 应用域当中数据移除, session 当中的 javabeen
  21.         session.removeAttribute("user");
  22.     }
  23. }
复制代码
Debugger 测试:


举例测试:如果我们向  Session 添加的数据JavaBeen 并没有实现 HttpSessionBindingListener 这个接口,就算我们添加了 session是不会调用其中 HttpSessionBindingListener 接口中的 valueBound ()绑定 和 valueUnBound() 解绑的
  1. package com.RainbowSea.been;
  2. import jakarta.servlet.http.HttpSessionBindingEvent;
  3. import jakarta.servlet.http.HttpSessionBindingListener;
  4. import java.util.Objects;
  5. public class User {
  6.     private String name ;
  7.     private String password;
  8.     public User() {
  9.     }
  10.     public User(String name, String password) {
  11.         this.name = name;
  12.         this.password = password;
  13.     }
  14.     public String getName() {
  15.         return name;
  16.     }
  17.     public void setName(String name) {
  18.         this.name = name;
  19.     }
  20.     public String getPassword() {
  21.         return password;
  22.     }
  23.     public void setPassword(String password) {
  24.         this.password = password;
  25.     }
  26.     @Override
  27.     public boolean equals(Object o) {
  28.         if (this == o) return true;
  29.         if (!(o instanceof User)) return false;
  30.         User user = (User) o;
  31.         return Objects.equals(getName(), user.getName()) && Objects.equals(getPassword(), user.getPassword());
  32.     }
  33.     @Override
  34.     public int hashCode() {
  35.         return Objects.hash(getName(), getPassword());
  36.     }
  37.     @Override
  38.     public String toString() {
  39.         return "User{" +
  40.                 "name='" + name + '\'' +
  41.                 ", password='" + password + '\'' +
  42.                 '}';
  43.     }
  44. }
复制代码
  1. package com.RainbowSea.listener;
  2. import com.RainbowSea.been.User;
  3. import jakarta.servlet.ServletException;
  4. import jakarta.servlet.annotation.WebServlet;
  5. import jakarta.servlet.http.HttpServlet;
  6. import jakarta.servlet.http.HttpServletRequest;
  7. import jakarta.servlet.http.HttpServletResponse;
  8. import jakarta.servlet.http.HttpSession;
  9. import java.io.IOException;
  10. @WebServlet("/user")
  11. public class TestHttpSessionBingingListener extends HttpServlet {
  12.     @Override
  13.     protected void doGet(HttpServletRequest request, HttpServletResponse response)
  14.             throws ServletException, IOException {
  15.         // 获取到 session 应用域对象
  16.         HttpSession session = request.getSession();
  17.         User  user = new User("Jack","123");
  18.         // 向 session 应用域当中添加  实现了 HttpSessionBindingListener 的 JavaBeen
  19.         session.setAttribute("user",user);
  20.         //  将 session 应用域当中数据移除, session 当中的 javabeen
  21.         session.removeAttribute("user");
  22.     }
  23. }
复制代码

HttpSessionBindingListener 与 HttpSessionAttrlbuteListener 的区别:

  • HttpSessionBindingListener  是不需要注解的 也是不需要配置 web.xml 的
  • HttpSessionAttrlbuteListener  是需要注解/ 配置 web.xml 文件的
  • 两者都是对应 Session 会话域的监听的。
  • HttpSessionBindingListener  中的 如果我们向  Session 添加的数据JavaBeen 并没有实现 HttpSessionBindingListener 这个接口,就算我们添加了 session是不会调用其中 HttpSessionBindingListener 接口中的 valueBound ()绑定 和 valueUnBound() 解绑的。
  • HttpSessionAttrlbuteListener  只要是向 session 添加,删除,修改(替换) 数据服务器都的调用其中的事件中的方法。
5. Listener监听器的案例:实现一个显示登录的在线人数


为了有助于 大家阅读如下内容了解该 oa ,大家可以移步至:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表