• JavaWeb之Listener监听器


    1.什么是监听器?

    (1)监听器是Servlet规范中的一员。就像Filter一样。Filter也是Servlet规范中的一员。
    (2)在Servlet中,所有的监听器接口都是以“Listener”结尾。
    (3)监听器中的方法不需要程序员手动调用,是发生某个特殊事件之后被服务器调用的

    2.监听器有什么用?

    (1)监听器实际上是Servlet规范留给我们javaweb程序员去执行某段代码的特殊时机。
    (2)如果在特殊的时刻想执行一段代码,你需要想到使用对应的监听器。

    3.Servlet规范中提供了哪些监听器?

    3.1 jakarta.servlet包下

    (1)ServletContextListener

    public interface ServletContextListener extends EventListener {
        public default void contextInitialized(ServletContextEvent sce) {
    	// 这个方法是在ServletContext对象被创建的时候调用
        }
        public default void contextDestroyed(ServletContextEvent sce) {
        // 这个方法是在ServletContext对象被销毁的时候调用
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (2)ServletContextAttributeListener
    (3)ServletRequestListener

    public interface ServletRequestListener extends EventListener {
        public default void requestDestroyed (ServletRequestEvent sre) {
        // request对象销毁时间点被调用
        }
        public default void requestInitialized (ServletRequestEvent sre) {
        // request对象创建时间点被调用
    } }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (4)ServletRequestAttributeListener

    2.2 jakarta.servlet.http包下

    (1)HttpSessionListener

    public interface HttpSessionListener extends EventListener {
        public default void sessionCreated(HttpSessionEvent se) {
         // session创建的时候被调用
        }
        public default void sessionDestroyed(HttpSessionEvent se) {
       // session销毁的时候被调用
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (2)HttpSessionAttributeListener
    该监听器监听的是session域中数据的变化。只要数据变化,则执行相应的方法。主要监测点在session域对象上。

    public interface HttpSessionAttributeListener extends EventListener {
        public default void attributeAdded(HttpSessionBindingEvent se) {
        // 向session域中存储数据的时候,该方法被WEB服务器调用
        }
        public default void attributeRemoved(HttpSessionBindingEvent se) {
       // 将session域中存储的数据删除的时候,该方法被WEB服务器调用
        }
        public default void attributeReplaced(HttpSessionBindingEvent se) {
       // session域中某个数据被替换的时候,该方法被WEB服务器调用
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (3)HttpSessionBindingListener
    ● 该监听器不需要使用@WebListener进行标注。
    ● 假设User类实现了该监听器,那么User对象在被放入session的时候触发“绑定”事件,User对象从session中删除的时候,触发
    ”解绑“事件。

    @Data
    public class User implements HttpSessionBindingListener {
        @Override
        public void valueBound(HttpSessionBindingEvent event) {
            // 绑定数据时调用
        }
        @Override
        public void valueUnbound(HttpSessionBindingEvent event) {
    		// 解绑数据时调用
        }
        // 构造方法, Getter/Setter方法
        private String username;
        private Integer password;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    (4)HttpSessionIdListener
    ● session的id发生改变的时候,监听器中的唯一一个方法就会被调用。
    (5)HttpSessionActivationListener
    ● 监听session对象的钝化和活化的。
    ● 钝化:session对象从内存存储到硬盘文件。
    ● 活化:从硬盘文件把session恢复到内存。

    4.实现一个监听器的步骤

    以ServletContextListener为例:
    (1)第一步:编写一个类比如MyServletContextListener实现ServletContextListener接口。并且实现里面的方法。

    void contextInitialized(ServletContextEvent event)
    void contextDestroyed(ServletContextEvent event)
    
    • 1
    • 2

    (2)第二步:在web.xml文件中对ServletContextListener进行配置,如下:

    <listener>
      <listener-class>com.bjpowernode.javaweb.listener.MyServletContextListener</listener-class>
    </listener>
    
    • 1
    • 2
    • 3

    ● 当然,第二步也可以不使用配置文件,也可以用注解,例如:@WebListener
    ● 注意:所有监听器中的方法都是不需要javaweb程序员调用的,由服务器来负责调用。当某个特殊的事件发生
    (其实就是某个时机到了)之后,被web服务器自动调用。

  • 相关阅读:
    pytest allure 生成报告过程
    【python】(十五)python内置库——正则表达式re
    vue3.0+wangEditor使用
    OpenGL(十九)——Qt OpenGL波动纹理(旗子的飘动效果)
    TreeList 的 增加、删除节点-----DevExpress
    cmake vs openmp
    10-18-hive-元数据及其他方式与hive交互
    Ajax:异步的 JavaScript 和 XML
    Jwt的基础入门,详细讲解
    【编译原理】语义分析
  • 原文地址:https://blog.csdn.net/y516369/article/details/132282108