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

    你可能感兴趣的文章
    Objective-C实现atoi函数功能(附完整源码)
    查看>>
    Objective-C实现average absolute deviation平均绝对偏差算法(附完整源码)
    查看>>
    Objective-C实现average mean平均数算法(附完整源码)
    查看>>
    Objective-C实现average median平均中位数算法(附完整源码)
    查看>>
    Objective-C实现average mode平均模式算法(附完整源码)
    查看>>
    Objective-C实现avl 树算法(附完整源码)
    查看>>
    Objective-C实现AvlTree树算法(附完整源码)
    查看>>
    Objective-C实现backtracking Jump Game回溯跳跃游戏算法(附完整源码)
    查看>>
    Objective-C实现BACKTRACKING 方法查找集合的幂集算法(附完整源码)
    查看>>
    Objective-C实现bailey borwein plouffe算法(附完整源码)
    查看>>
    Objective-C实现balanced parentheses平衡括号表达式算法(附完整源码)
    查看>>
    Objective-C实现base64加密和base64解密算法(附完整源码)
    查看>>
    Objective-C实现base64加解密(附完整源码)
    查看>>
    Objective-C实现base64编码 (附完整源码)
    查看>>
    Objective-C实现base85 编码算法(附完整源码)
    查看>>
    Objective-C实现basic graphs基本图算法(附完整源码)
    查看>>
    Objective-C实现BCC校验计算(附完整源码)
    查看>>
    Objective-C实现bead sort珠排序算法(附完整源码)
    查看>>
    Objective-C实现BeadSort珠排序算法(附完整源码)
    查看>>
    Objective-C实现bellman ford贝尔曼福特算法(附完整源码)
    查看>>