博客
关于我
Listener监听器
阅读量:355 次
发布时间:2019-03-04

本文共 3606 字,大约阅读时间需要 12 分钟。

Servlet监听器的基本概念与实现

Servlet容器在运行过程中会产生各种事件,而这些事件可以通过专门的监听器(Listener)来处理。Listener是一种用来监听事件并执行相应操作的组件,通过接口回调的方式实现底层原理。

Servlet监听器的分类

Listener的主要作用是监听事件,事件类型主要围绕三个方面:

  • 生命周期相关事件:包括请求和会话的创建、销毁。
  • 属性状态相关事件:包括请求和会话属性的添加、删除、替换。
  • 存值状态相关事件:主要是会话数据的钝化和活化。
  • 请求域(ServletRequest)的Listener
    • ServletRequestListener:监听请求对象的创建与销毁。
    • ServletRequestAttributeListener:监听请求属性的状态变化。
    • HttpSessionBindingListener:监听会话对象的绑定与解绑。
    • HttpSessionActivationListener:监听会话数据的钝化与活化。
    会话域(HttpSession)的Listener
    • HttpSessionListener:监听会话对象的创建与销毁。
    • HttpSessionAttributeListener:监听会话属性的状态变化。
    • HttpSessionBindingListener:监听会话对象的绑定与解绑。
    • HttpSessionActivationListener:监听会话数据的钝化与活化。
    全局域(ServletContext)的Listener
    • ServletContextListener:监听 ServletContext 的创建与销毁。
    • ServletContextAttributeListener:监听 ServletContext 属性的状态变化。

    Listener的实现

    为了实现自定义的监听功能,需要开发符合接口或类的监听器。以下是一个简单的实现示例:

    package com.lagou.demo03;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionBindingListener;public class Person implements HttpSessionBindingListener {    private String name;    private int age;    public Person() {    }    public Person(String name, int age) {        this.name = name;        this.age = age;    }    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;    }    @Override    public String toString() {        return "Person{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }    @Override    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {        System.out.println("对象绑定到session中了" + httpSessionBindingEvent.getName());    }    @Override    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {        System.out.println("解除绑定成功!");    }}

    监听器的配置

    web.xml 文件中配置监听器:

    com.lagou.demo03.MyRequestAttributeListener

    实战案例:记录当前在线用户数

    为了实现记录当前在线用户数,可以利用 ServletContextListenerHttpSessionListener 组合使用。具体实现如下:

    package com.lagou.demo04;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class OnlineUser implements HttpSessionListener, ServletContextListener {    private ServletContext servletContext = null;    @Override    public void contextInitialized(ServletContextEvent servletContextEvent) {        servletContext = servletContextEvent.getServletContext();        // 初始化全局属性        servletContext.setAttribute("count", 1);    }    @Override    public void contextDestroyed(ServletContextEvent servletContextEvent) {        servletContext = null;    }    @Override    public void sessionCreated(HttpSessionEvent httpSessionEvent) {        System.out.println("有新用户上线了...");        Integer count = (Integer) servletContext.getAttribute("count");        count++;        servletContext.setAttribute("count", count);    }    @Override    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {        System.out.println("有用户已下线...");        Integer count = (Integer) servletContext.getAttribute("count");        if (count > 0) {            count--;            servletContext.setAttribute("count", count);        }    }}

    web.xml 中配置:

    com.lagou.demo04.OnlineUser

    注意事项

    • 钝化与活化
      • 钝化:将会话数据存储到硬盘,防止内存泄漏。默认存储路径在 conf/context.xml 中配置,可更改存储路径。
      • 活化:在服务器启动时将存储文件重新加载到内存中。
    • IDEA重启问题:注意 work 目录下的钝化文件会被删除,导致无法恢复,建议手动备份或更改存储路径。

    通过以上方法,可以实现对 Servlet 容器事件的监听和响应,提升应用的功能和性能。

    转载地址:http://gune.baihongyu.com/

    你可能感兴趣的文章
    numpy 数组与矩阵的乘法理解
    查看>>
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>
    Numpy.ndarray对象不可调用
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    numpy数组替换其中的值(如1替换为255)
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>
    numpy转PIL 报错TypeError: Cannot handle this data type
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    NVelocity标签使用详解
    查看>>
    nvidia-htop 使用教程
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>