Listener监听器

本文详细介绍了Java Web中的监听器,包括监听器的作用、实现步骤和Servlet规范中的各种监听器接口。监听器提供了在特定事件发生时执行代码的特殊时机。例如,通过实现ServletContextListener可以监听到应用上下文的创建和销毁。HttpSessionListener则用于监听session的创建、销毁及属性变化。此外,HttpSessionBindingListener可以监控对象放入和移除session时的事件。通过监听器,可以实现记录网站实时在线用户数量等功能。对于更精确的在线登录用户计数,可以利用User对象实现HttpSessionBindingListener,当User对象存入session时增加计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

监听器是Servlet规范中的一员。就像Filter一样。Filter也是Servlet规范中的一员。

在Servlet中,所有的监听器接口都是以“Listener”结尾。

public class Test {
    // 静态代码块,在类加载时执行,并且只执行一次。
    // 这个语法很简单,静态代码块什么时候用?这是困扰大家的一个问题。
    // 静态代码块用的实际上不多。但偶尔要用一下。什么时候用呢?
    // 那要看具体的需求,你是否需要在类加载时机去执行一段代码,如果有需要,就可以把这个代码写入静态代码块,到时候自然就执行了。
    
    static {
        System.out.println("类加载了。");
    }
    // 入口
    public static void main(String[] args) {

    }
}

 静态代码块就是java语言为java程序员预留的一个特殊的时机,这个时机叫做:类加载时机。  

监听器的作用:

  • 监听器实际上是Servlet规范留给我们javaweb程序员的特殊时机。

  • 特殊的时刻如果想执行这段代码,你需要想到使用对应的监听器。

实现一个监听器的步骤:以ServletContextListener为例。

  • 第一步:编写一个类实现ServletContextListener接口。并且实现里面的两个方法。

ServletContextListener监听器主要监听的是:ServletContext对象的状态。

@WebListener
public class MyServletContextListener implements ServletContextListener {

    /**
     * 监听器中的方法不需要程序员手动调用。是发生某个特殊事件之后被服务器调用。
     * @param sce
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) { // 服务器启动时间点,想在这个时候执行一段代码,写就行了。
        // 现在这个特殊的时刻写代码,你写就是了。它会被服务器自动调用。
        // 这个方法是在ServletContext对象被创建的时候调用。
        System.out.println("ServletContext对象创建了。");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) { // 服务器关闭时间点。
        // 现在这个特殊的时刻写代码,你写就是了。它会被服务器自动调用。
        // 这个方法是在ServletContext对象被销毁的时候调用。
        System.out.println("ServletContext对象被销毁了。");
    }
}
  • 第二步:在web.xml文件中对ServletContextListener进行配置,如下:

<listener>
    <listener-class>包名</listener-class>
</listener>

当然,第二步也可以不使用配置文件,也可以用注解,例如:@WebListener

注意:所有监听器中的方法都是不需要javaweb程序员调用的, 当某个特殊的事件发生(特殊的事件发生其实就是某个时机到了。)之后,被web服务器自动调用。

Servlet规范中提供的监听器jakarta.servlet包下:

ServletContextListener

ServletContextAttributeListener

ServletRequestListener

ServletRequestAttributeListener

Servlet规范中提供的监听器jakarta.servlet.http包下:

HttpSessionListener

HttpSessionAttributeListener

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

 HttpSessionBindingListener

  • 该监听器不需要使用@WebListener进行标注。

  • 假设User类实现了该监听器,那么User对象在被放入session的时候触发bind事件,User对象从session中删除的时候,触发unbind事件。

  • 假设Customer类没有实现该监听器,那么Customer对象放入session或者从session删除的时候,不会触发bind和unbind事件。

 HttpSessionIdListener

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

HttpSessionActivationListener

  • 监听session对象的钝化和活化的。

  • 钝化:session对象从内存存储到硬盘文件。

  • 活化:从硬盘文件把session恢复到内存。

  • 思考一个业务场景:

    • 请编写一个功能,记录该网站实时的在线用户的个数。

    • 我们可以通过服务器端有没有分配session对象,因为一个session代表了一个用户。有一个session就代表有一个用户。如果你采用这种逻辑去实现的话,session有多少个,在线用户就有多少个。这种方式的话:HttpSessionListener够用了。session对象只要新建,则count++,然后将count存储到ServletContext域当中,在页面展示在线人数即可。

    • 业务发生改变了,只统计登录的用户的在线数量,这个该怎么办?

      • session.setAttribute("user", userObj);

      • 用户登录的标志是什么?session中曾经存储过User类型的对象。那么这个时候可以让User类型的对象实现HttpSessionBindingListener监听器,只要User类型对象存储到session域中,则count++,然后将count++存储到ServletContext对象中。页面展示在线人数即可。

  • 实现oa项目中当前登录在线的人数。

    • 什么代表着用户登录了?

      • session.setAttribute("user", userObj); User类型的对象只要往session中存储过,表示有新用户登录。

    • 什么代表着用户退出了?

      • session.removeAttribute("user"); User类型的对象从session域中移除了。

      • 或者有可能是session销毁了。(session超时)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌路学java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值