【Java Web】监听器类型及其使用

文章目录

    • 监听器使用
    • 监听器类型
      • ServletContextListener
      • HttpSessionListener
      • ServletRequestListener
      • ServletContextAttributeListener
      • HttpSessionAttributeListener
      • ServletRequestAttributeListener
      • HttpSessionBindingListener

监听器(Listener)组件用于监听特定事件的发生,并在事件触发时执行相应的处理逻辑。监听器主要基于Java的观察者模式实现,可以用来监控应用程序的生命周期事件,如请求、会话和属性的变化等。

监听器使用

监听器通常在 web.xml 配置文件中进行注册,也可以使用注解的方式。

<listener>
    <listener-class>com.example.MyContextListener</listener-class>
</listener>

使用注解配置(需要Servlet 3.0及以上)

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class MyContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 应用启动时执行的代码
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 应用关闭时执行的代码
    }
}

监听器类型

监听三个域对象的创建和销毁事件的监听器:ServletContextListenerHttpSessionListenerServletRequestListener

监听域对象中属性的增加、删除、替换事件的监听器:ServletContextAttributeListenerHttpSessionAttributeListenerServletRequestAttributeListener

监听绑定到 HttpSession 域中的某个对象的状态的监听器,又称为感知型监听器:HttpSessionBindingListener

ServletContextListener

用于监听ServletContext的创建和销毁事件。当Web应用启动或关闭时,可以执行初始化和清理工作。

public interface ServletContextListener extends EventListener {
    // 当Web应用启动时调用
    void contextInitialized(ServletContextEvent sce);
    // 当Web应用关闭时调用
    void contextDestroyed(ServletContextEvent sce);
}

HttpSessionListener

用于监听HTTP会话的创建和销毁事件。可以在用户登录或注销时进行相应的处理,比如记录在线用户数量。

public interface HttpSessionListener extends EventListener {
    // 当一个新的HttpSession被创建时调用
    void sessionCreated(HttpSessionEvent se);
    // 当一个HttpSession被销毁时调用
    void sessionDestroyed(HttpSessionEvent se);
}

ServletRequestListener

用于监听Servlet请求的创建和销毁事件。可以在请求处理的开始和结束时执行一些操作,比如记录日志。

public interface ServletRequestListener extends EventListener {
	// 当一个请求被初始化时调用
    void requestInitialized(ServletRequestEvent sre);
	// 当一个请求结束时调用
    void requestDestroyed(ServletRequestEvent sre);
}

ServletContextAttributeListener

用于监听ServletContext属性的添加、移除和替换。

public interface ServletContextAttributeListener extends EventListener {
	// 当一个属性被添加到ServletContext时调用
	void attributeAdded(ServletContextAttributeEvent scae);
	// 当一个属性从ServletContext中移除时调用
	void attributeRemoved(ServletContextAttributeEvent scae);
	//当一个属性在ServletContext中被替换时调用
	void attributeReplaced(ServletContextAttributeEvent scae);
}

HttpSessionAttributeListener

用于监听会话属性的添加、修改和移除事件。适合在会话中添加或删除属性时进行处理。

public interface HttpSessionAttributeListener extends EventListener {
	// 当一个属性被添加到HttpSession时调用
	void attributeAdded(HttpSessionBindingEvent se);
	// 当一个属性从HttpSession中移除时调用
	void attributeRemoved(HttpSessionBindingEvent se);
	// 当一个属性在HttpSession中被替换时调用
	void attributeReplaced(HttpSessionBindingEvent se)
}

ServletRequestAttributeListener

用于监听请求属性的变化,适合监控请求数据的添加或修改。

public interface ServletRequestAttributeListener extends EventListener {
	// 当一个属性被添加到ServletRequest时调用
	void attributeAdded(ServletRequestAttributeEvent srae);
	// 当一个属性从ServletRequest中移除时调用
	void attributeRemoved(ServletRequestAttributeEvent srae);
	// 当一个属性在ServletRequest中被替换时调用
	void attributeReplaced(ServletRequestAttributeEvent srae);
}

使用监听器统计在线人数

HttpSessionBindingListener

接口定义

public interface HttpSessionBindingListener extends EventListener {
    void valueBound(HttpSessionBindingEvent event);
    void valueUnbound(HttpSessionBindingEvent event);
}

创建一个类实现 HttpSessionBindingListener 接口。valueBoundvalueUnbound 方法分别在对象绑定到会话和从会话中解除绑定时调用

public class OnlineUserCounter implements HttpSessionBindingListener {
    private static int onlineCount = 0;

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        // 用户登录时增加在线用户数
        synchronized (OnlineUserCounter.class) {
            onlineCount++;
        }
        System.out.println("用户登录,当前在线人数: " + onlineCount);
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        // 用户登出或会话过期时减少在线用户数
        synchronized (OnlineUserCounter.class) {
            if (onlineCount > 0) {
                onlineCount--;
            }
        }
        System.out.println("用户登出,当前在线人数: " + onlineCount);
    }

    public static int getOnlineCount() {
        return onlineCount;
    }
}

创建一个Servlet类来处理登录请求,并在登录成功时将 OnlineUserCounter 实例添加到会话中

public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 假设验证逻辑
        if ("admin".equals(username) && "123456".equals(password)) {
            HttpSession session = request.getSession();
            OnlineUserCounter counter = new OnlineUserCounter();
            session.setAttribute("user", username); // 设置用户名
            session.setAttribute("counter", counter); // 绑定计数器

            // 重定向到欢迎页面
            response.sendRedirect("welcome.jsp");
        } else {
            // 重定向到登录页面,并携带错误信息
            response.sendRedirect("login.jsp?error=true");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

创建一个Servlet类来处理登出请求,并使会话失效

public class LogoutServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate(); // 使会话失效
        }
        response.sendRedirect("login.jsp");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
    
}

web.xml 文件中配置 LoginServletLogoutServlet 以及在线用户统计监听器

<!-- 配置LoginServlet -->
<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.hz.LoginServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>

<!-- 配置LogoutServlet -->
<servlet>
    <servlet-name>LogoutServlet</servlet-name>
    <servlet-class>com.hz.LogoutServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>LogoutServlet</servlet-name>
    <url-pattern>/logout</url-pattern>
</servlet-mapping>

创建登录页面

<div align="center">
    <form action="login" method="post">
        <table>
            <tr>
                <td>账号 : </td>
                <td><input type="text" name="username" required></td>
            </tr>
            <tr>
                <td>密码 : </td>
                <td><input type="password" name="password" required></td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <input type="submit" value="登录">
                </td>
            </tr>
        </table>
    </form>
</div>

创建欢迎页面,显示当前在线用户数

<h1>欢迎您, <%= session.getAttribute("user") %>!</h1>
<p>当前在线人数: <%= com.hz.OnlineUserCounter.getOnlineCount() %></p>
<form action="logout" method="post">
    <input type="submit" value="退出">
</form>

在这里插入图片描述

HttpSessionListener

<!-- 配置在线用户统计监听器 -->
<listener>
    <listener-class>com.hz.OnlineUserCounter</listener-class>
</listener>

两者对比

HttpSessionListener 用于会话生命周期管理(用于监听会话的创建和销毁事件)和全局监听(设置一次即可监听整个应用中的所有会话)。

当一个新的会话被创建时,sessionCreated 方法会被调用;当一个会话被销毁时(例如,调用 session.invalidate() 或会话超时),sessionDestroyed 方法会被调用。

  • HttpSessionListener 用于监听会话的创建和销毁事件,适用于全局的会话管理。
  • HttpSessionListener 只需要设置到web.xml就可以监听整个应用中的所有session

HttpSessionBindingListener 用于对象绑定和解绑事件(监听对象被绑定到会话或从会话中解绑的事件)和局部监听(必须实例化后放入某一个会话中,才能监听该会话中的对象绑定和解绑事件)。

当一个实现了 HttpSessionBindingListener 接口的对象被绑定到会话时,valueBound 方法会被调用;当一个实现了 HttpSessionBindingListener 接口的对象从会话中解绑时(例如,调用 session.removeAttribute() 或会话销毁),valueUnbound 方法会被调用。

  • HttpSessionBindingListener 用于监听特定对象被绑定到会话或从会话中解绑的事件,适用于对象级别的生命周期管理。
  • HttpSessionBindingListener 必须实例化后放入某一个session中,才能监听

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/915561.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

conda创建 、查看、 激活、删除 python 虚拟环境

1、创建 python 虚拟环境 ,假设该环境命名为 “name”。 conda create -n name python3.11 2、查看 python 虚拟环境。 conda info -e 3、激活使用 python 虚拟环境。 conda activate name 4、删除 python 虚拟环境 conda remove -n name --all ​​ 助力快速掌握数据集…

LaTeX之四:如何兼容中文(上手中文简历和中文论文)、在win/mac上安装新字体。

改成中文版 如果你已经修改了.cls文件和主文档&#xff0c;但编译后的PDF仍然显示英文版本&#xff0c;可能有以下几个原因&#xff1a; 编译器问题&#xff1a;确保你使用的是XeLaTeX或LuaLaTeX进行编译&#xff0c;因为它们对Unicode和中文支持更好。你可以在你的LaTeX编辑器…

视频遥控打药履带机器人技术详解

视频遥控打药履带机器人技术是一种集成了遥控操作、视频监控和履带行走系统的现代化农业植保技术。以下是对该技术的详细解析&#xff1a; 一、技术概述 视频遥控打药履带机器人主要由履带行走系统、药箱、喷雾系统、遥控系统以及视频监控系统等部分组成。通过遥控操作&#…

BB1-NHS ester被用于将各种生物活性分子与蛋白质或其他生物大分子进行共轭连接,2082771-52-4

CAS号&#xff1a;2082771-52-4 中文名&#xff1a;BB1-琥珀酰亚胺酯&#xff0c;BB1-活性酯 英文名&#xff1a;BB1-NHS ester&#xff0c;或BB1-Succinimidyl Ester 分子式&#xff1a;C32H32N6O4 分子量&#xff1a;564.63 纯度&#xff1a;≥95% 供应商&#xff1a;陕…

MongoDB在现代Web开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 引言 MongoDB 概述 定义与原理 发展…

激光雷达不够用,怎么办?Ubuntu如何用一个激光雷达实现两个激光雷达的扫描点云效果?点云配准ICP,点云拼接、话题转换、ROS重录制bag包。

1.首先至少得有一个激光雷达&#xff0c;如果没有的话&#xff0c;可以考虑花呗买一个&#xff0c;毕竟研究这东西&#xff0c;有个实物还是比较稳妥&#xff0c;这里我选择的是Livox Mid-360,哈哈哈&#xff0c;公司的&#xff0c;大概长这样&#xff1a; 2. 比如我们想要用激…

STM32H743ZIT6+LWIP+MPU+CUBEMX,通过stm32cubemx完成初始化,ping包亲测没问题,带解释!!

文章耗时两个月&#xff0c;原来写了一半&#xff0c;后来遇到其他项目&#xff0c;中间自己重新画了一块电路板。终于把初始化功能实现了&#xff0c;网上的教程能用的确实凤毛麟角&#xff01; 一、MPU配置详解 个人对stm32H7的MPU属于新接触&#xff0c;为了弄懂&#xff0…

python制作一个简单的端口扫描器,用于检测目标主机上指定端口的开放状态

import argparse # 用于解析命令行参数 from socket import * # 导入 socket 库的所有内容&#xff0c;用于网络通信 from threading import * # 导入 threading 库的所有内容&#xff0c;用于多线程操作 # 创建一个信号量&#xff0c;初始值为 1&#xff0c;用于线程同步&…

网络基础Linux(整理)

计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 广域网WAN: 将远隔千里的计算机都连在一起; 所谓 "局域网" 和 "广域网" 只是一个…

我的第一个PyQt5程序

PyQt5的开发环境配置完成之后&#xff0c;开始编写第一个PyQt5的程序。 方法一&#xff1a;使用将.ui转换成.py文件的方法 import sys from FirstPyQt import Ui_MainWindow from PyQt5.QtWidgets import *#QtCore,QtGui,QtWidgets # from QtTest import Ui_MainWindow#导入Q…

面试:TCP、UDP如何解决丢包问题

文章目录 一、TCP丢包原因、解决办法1.1 TCP为什么会丢包1.2 TCP传输协议如何解决丢包问题1.3 其他丢包情况&#xff08;拓展&#xff09;1.4 补充1.4.1 TCP端口号1.4.2 多个TCP请求的逻辑1.4.3 处理大量TCP连接请求的方法1.4.4 总结 二、UDP丢包2.1 UDP协议2.1.1 UDP简介2.1.2…

Vue全栈开发旅游网项目(11)-用户管理前端接口联调

联调基本步骤 1.阅读接口文档 2.配置接口地址 3.使用axios获取数据 4.将数据设置到模型层 1.发送验证码联调 1.1 配置接口地址 文件地址&#xff1a;src\utils\apis.js //系统相关的接口 const SystemApis {sliderListUrl:apiHost"/system/slider/list/",//发送…

【相关分析方法】MATLAB计算滑动时滞相关系数

【相关分析方法】MATLAB计算滑动时滞相关系数 1 滑动时滞相关系数2 MATLAB代码2.1 函数代码2.2 案例参考滑动时滞相关系数(Moving Time-Lagged Cross-Correlation, TLCC) 是一种常用于分析两个时间序列之间的滞后关系的工具。它可以帮助我们确定一个时间序列相对于另一个时间…

llama-cpp模型轻量化部署与量化

一、定义 定义配置环境遇到的问题&#xff0c;交互模式下模型一直输出&#xff0c;不会停止模型量化Qwen1.5-7B 案例demo 二、实现 定义 主要应用与cpu 上的部署框架。由c完成。配置环境 https://github.com/ggerganov/llama.cpp https://github.com/echonoshy/cgft-llm/blo…

MySQl基础----Linux下数据库的密码和数据库的存储引擎(内附 实操图和手绘图 简单易懂)

绪论​ 涓滴之水可磨损大石&#xff0c;不是由于他力量强大&#xff0c;而是由于昼夜不舍地滴坠。 只有勤奋不懈地努力&#xff0c;才能够获得那些技巧。 ——贝多芬。新开MySQL篇章&#xff0c;本章非常基础&#xff0c;但同时需要一定的Linux基础&#xff0c;所以假若你没学习…

Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述 随着人工智能技术的迅猛发展&#xff0c;多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型&#xff0c;融合了视觉与语言处理能力&#xff0c;旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域…

科技资讯|Matter 1.4 标准正式发布,低功耗蓝牙助力其发展

连接标准联盟&#xff08;CSA&#xff09;宣布推出最新的 Matter 1.4 版本&#xff0c;引入了一系列新的设备类型和功能增强&#xff0c;有望提高包括 HomeKit 在内的智能家居生态系统之间的互操作性。 设备供应商和平台能够依靠增强的多管理员功能改善多生态系统下的用户体验&…

群控系统服务端开发模式-应用开发-前端登录页面开发

一、清理不必要的文件 1、删除auth-redirect.vue a、在根目录src文件夹下views文件夹下找到登录文件夹login&#xff0c;在login文件夹中删除auth-redirect.vue文件。 b、在根目录mock文件夹下role文件夹中的routes.js文件中&#xff0c;删除下面的代码 {path: /auth-redirect…

深入理解接口测试:实用指南与最佳实践5.0(三)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

mongoDB的安装及使用

mongodb的安装参考&#xff1a; Centos系统中mongodb的安装详解_centos安装mongodb-CSDN博客 不要下载最新的版本&#xff0c;新的版本中mongo命令无法使用&#xff0c;也就是安装后不能通过mongo命令登录&#xff0c;我这里使用5.0.30版本&#xff1b; mongodb客户端demo: …