博客
关于我
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/

    你可能感兴趣的文章
    Post表单提交TextArea的值出现转译乱码问题 - Spring MVC处理表单提交
    查看>>
    Power BI 中的 Python 可视化需要什么设置?任何特定的 matplotlib 包版本或系统设置?
    查看>>
    Power BI:如何在 Power Query 编辑器中将 Python 与多个表一起使用?
    查看>>
    power english (3) main text -emotion mastery - focus
    查看>>
    POWER ENGLISH (6) - MODEL
    查看>>
    power english (1) —— passion
    查看>>
    Power English (1) 原文
    查看>>
    power English (3)原文
    查看>>
    POWER ENGLISH(7)- repetition
    查看>>
    SpringBoot中集成SpringBatch详细解析与实战示例(CSV文件读取十万条数据进行业务处理后写入Mysql数据库)
    查看>>
    powerbi 一张表在另外一张表中出现的数量_PowerBi之初步学习笔记
    查看>>
    QGIS怎样设置简体中文以及新建可编辑的多边形的图层
    查看>>
    PowerBuilder 使用自定义事件触发键盘Enter事件
    查看>>
    PowerCreatorCMS UploadResourcePic 任意文件上传漏洞复现
    查看>>
    PowerDesigner 使用的一些技巧(转)
    查看>>
    QGIS在Windows上下载安装与建立空间数据库连接
    查看>>
    PowerDesigner165安装婆姐汉花教程
    查看>>
    PowerDesigner使用教程:设置注释、默认值属性
    查看>>
    PowerDesigner使用教程:不显示背景网格
    查看>>
    PowerDesigner使用教程:创建数据模型以及导出
    查看>>