认识监听器(Listener)

监听器是什么?

监听器(Listener)是一种运行在后台的程序,它主要用于监控某些事件在系统中的发生,并且根据这些事件做一些特定的处理。在Web应用程序中,监听器可以观察ServletContext、HttpSession以及ServletRequest等对象的变化,以便于在这些对象变化时进行相应的处理。监听器是Servlet规范中的一部分,在Java EE应用程序中广泛使用。

监听器通常定义了以下三个接口:

1. ServletContextListener:用于监听ServletContext的创建和销毁事件。
2. HttpSessionListener:用于监听HttpSession的创建和销毁事件。
3. ServletRequestListener:用于监听ServletRequest的创建和销毁事件。

除了上述三种标准的监听器接口,开发者也可以实现自己的监听器接口。监听器接口通常包含了多个方法,在对应的事件发生时会自动调用这些方法,以便监听器可以完成相应的处理逻辑。

常见的监听器应用包括:

1. 统计在线用户数
2. 初始化应用程序环境参数
3. 实现缓存管理
4. 监听Spring框架中Bean的生命周期
5. 监听消息队列中消息的到达等。

监听器是Java EE中非常重要的一部分,在Web应用程序中广泛应用,能够有效地提高应用程序性能和安全性。

监听器的用途

监听器的主要用途是监控Web应用程序中某些特定的事件的发生,并在这些事件发生时执行预定义的操作或处理逻辑。常用的监听器包括:

1. ServletContextListener:用于监控Web应用程序启动和关闭事件,例如一些应用程序启动时的初始化工作和应用程序关闭时的清理工作等。

2. HttpSessionListener:用于监控会话的创建和销毁事件,并记录在线用户数,例如对于在线商城等需要统计在线用户数的场景非常有用。

3. ServletRequestListener:用于监控Web请求的创建和销毁事件,例如对于每个请求都需要进行身份认证的场景,可以使用ServletRequestListener来实现登录拦截。

4. 监听JNDI服务的变化并更新应用程序数据源等服务。

除了上述标准的监听器,开发者也可以自定义监听器来监听特定的事件,这也是监听器的优秀之处。监听器可以增强Web应用程序的功能和安全性,提供更好的用户体验和管理。

listener在线监听用户数量

UserCounterListener代码

package com.qing;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class UserCounterListener implements HttpSessionListener {
    private ServletContext ctx = null;
    @Override
    public void sessionCreated(HttpSessionEvent se) {
         ctx=se.getSession().getServletContext();
        if (ctx.getAttribute("onlineCount")!=null){
            ctx.setAttribute("onlineCount",(Integer)ctx.getAttribute("onlineCount")+1);
        }
        else {
            ctx.setAttribute("onlineCount", 1);
        }
        System.out.println("=====有一位用户上线了=====");
        System.out.println("Id: "+se.getSession().getId()+"=====");


    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
         ctx=se.getSession().getServletContext();
        if (ctx.getAttribute("onlineCount")!=null){
            ctx.setAttribute("onlineCount", 0);
        }
        else {
            ctx.setAttribute("onlineCount",(Integer)ctx.getAttribute("onlineCount")-1);
        }
        System.out.println("=====用户下线了=====");
        System.out.println("Id: "+se.getSession().getId()+"=====");
    }


}

index.jsp代码,如下图,浏览器默认进index.jsp页面,我的默认路径是localhost:8080;当进入jsp页面,因为getAttribute取到了键,就可以拿到值

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<h1>当前网站的有<%=request.getSession().getServletContext().getAttribute("onlineCount")%>人访问</h1>

</body>
</html>

web.xml配置

  <servlet>
         <servlet-name>ListenerTest</servlet-name>
         <servlet-class>com.qing.ListenerTest</servlet-class>
     </servlet>
    <servlet-mapping>
        <servlet-name>ListenerTest</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>


    <listener>
        <listener-class>com.qing.UserCounterListener</listener-class>
    </listener>

<!--设置session过期时间,1分钟销毁-->
    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>

效果图:

默认是3个人访问

 后端打印的结果

 

一分钟后,session会过期,在web.xml中设置了session的过期时间,刷新浏览器,访问人数为1

 

用不同的浏览器访问,会增加访问人数,并且后端的控制台也会监听,并打印信息

 

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

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

相关文章

vue项目为例解决element ui 时间选择器 picker使用样式穿透不起作用问题

今天在开发中 需要修改时间选择器弹出的这个组件的样式 但这个东西比较坑爹 首先 不能影响其他组件 就是其他组件用了时间选择器 不能受到我们写的样式的影响 那么 就只好穿透了 但你会发现 这东西是作用与body下的 就很坑 穿透我试了挺久的 不起作用 但官方文档有提供给我们一…

体验 gpt4free

体验 gpt4free 什么是 gpt4free效果演示安装 ffmpeg启动 gpt4free访问 gpt4free gui其他 什么是 gpt4free GPT4Free 是一个由 xtekky 创建的基于 OpenAI GPT-4 和 GPT-3.5 的 API。它可以向用户提供类似于 OpenAI GPT-3 的功能&#xff0c;如文本生成、问答、翻译等。 GPT4Fre…

UE5.1.1 C++ 从0开始 (1.人物移动)

开个天坑&#xff0c;UE5.1.1的移动代码做了一个大更新&#xff0c;对于我这种万年蓝图然后正在转C的人来说可以说是个挑战也可以说是个更方便我去工作的一个点。同时斯坦福大学的那个教程的开头几个章节就不适用了&#xff0c;对于学习UE5.1.1的同学来说。所以我这里会尽量每天…

c# 数据保存为PDF(二) (Aspose pdf篇)

文章目录 前言关于Aspose PDF使用Aspose.Pdf常用的命名空间和类库1 创建简单的PDF文档2 美化PDF样式2.1 创建测试数据2.2 项目头部样式2.3 全部代码 小结附录参考 前言 项目中需要将数据导出存为PDF格式&#xff0c;试了一下Aspose组件&#xff0c;仅以此记录一下使用感受。 …

为什么半导体FAB生产线需要EAP系统?

在半导体制造中&#xff0c;设备自动化系统EAP&#xff08;Equipment Automation Program&#xff09;是不可或缺的重要软件&#xff0c;它是连接MES、RMS、APC、FDC等上层系统和设备层的桥梁&#xff0c;用于管控生产线上的所有机台&#xff0c;并实现设备运行的自动化。 作为…

团队密码管理器Passbolt的安装

老苏下载了吴恩达联手 OpenAI 推出的 Prompt for developer 课程&#xff0c;总长度大概在一个半小时左右&#xff0c;可以让我们学习正确的 ChatGPT Prompt 工程 虽然课程对话是英文&#xff0c;但有中文字幕&#xff0c;课程地址&#xff1a;https://www.aliyundrive.com/s/…

Redux 学习系列(一) —— 基础概念入门篇

简介 Redux 是一个可预测的 JavaScript 应用状态管理容器&#xff0c;也可以说是一个应用数据流框架。 作用 Redux 主要是用作应用状态的管理。它抽离所有组件的状态&#xff0c;构造一个中心化的单独常量状态树&#xff08;对象&#xff09;来保存这一整个应用的状态。这棵…

java 学习日记

今天先搞题目 给你一个points 数组&#xff0c;表示 2D 平面上的一些点&#xff0c;其中 points[i] [xi, yi] 。 连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 &#xff1a;|xi - xj| |yi - yj| &#xff0c;其中 |val| 表示 val 的绝对值。 请你返回将所…

TikTok选品要怎样才能选到爆品?!

对于做TikTok的商家而言&#xff0c;选品是非常重要的&#xff0c;因为一个产品爆了之后能带动其他产品的销量&#xff0c;那我们要如何有效的选品呢&#xff1f; 一、多平台选品逻辑 首先要知道一个点&#xff0c;在独立站爆的品也会在亚马逊爆&#xff0c;而TikTok已经成为一…

4D成像雷达风口,谁在快速崛起?

4D成像雷达正进入规模量产落地的关键窗口期。 高工智能汽车注意到&#xff0c;毫米波雷达的发展某种程度上可以分为两个阶段&#xff1a;第一个阶段&#xff0c;传统毫米波雷达时代&#xff0c;市场基本被博世、大陆、安波福等国际Tier1巨头把持&#xff0c;市场格局长期稳固&…

PyTorch数据加载工具:高效处理常见数据集的利器

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else

场景 设计模式-策略模式在Java中的使用示例&#xff1a; 设计模式-策略模式在Java中的使用示例_java 策略模式示例_霸道流氓气质的博客-CSDN博客 上面讲了策略模式在Java中的使用示例。 下面看一个在SpringBoot中的实际使用示例。 业务场景: 有多个煤矿&#xff0c;信号灯…

智安网络|网络安全威胁越来越多,教你如何全方面应对

随着互联网的普及和发展&#xff0c;各大网站已经成为人们获取信息和交流的主要平台。然而&#xff0c;随着网络攻击和恶意软件的威胁不断增加&#xff0c;网站经常成为攻击者的目标。因此&#xff0c;在建立和维护网站系统时&#xff0c;必须采取强大的安全措施。 一、网站系…

第四十二章 Unity 下拉框 (Dropdown) UI

本章节我们介绍下拉框 (Dropdown)&#xff0c;我们点击菜单栏“GameObject”->“UI”->“Dropdown”&#xff0c;然后调整它的位置&#xff0c;效果如下 其实它的本质就是一个下拉列表&#xff0c;然后选择列表中的一个选项而已。大家在很多网页中应该可以看到类似的UI元…

Vue框架

目录 简单介绍 MVVM 下载安装Node.js 安装Vue.js插件 新建Vue.js项目 下载vue依赖库 Vue工程目录结构 修改代码模板 vue组件中&#xff0c;添加模型数据 Vue双向绑定 动态绑定 vue组件中&#xff0c;显示图片 单选框绑定 复选框绑定 Vue的script表达式 Vue实例声…

MySQL概述 -- 数据模型SQL简介DDL数据库操作

一. 数据模型 介绍完了Mysql数据库的安装配置之后&#xff0c;接下来我们再来聊一聊Mysql当中的数据模型。学完了这一小节之后&#xff0c;我们就能够知道在Mysql数据库当中到底是如何来存储和管理数据的。 在介绍 Mysql的数据模型之前&#xff0c;需要先了解一个概念&#x…

【Linux】进程地址空间

目录 引入 进程地址空间 虚拟地址与物理地址 如何理解虚拟地址的不同区域 写时拷贝 动态开辟的细节 为什么存在进程地址空间 避免地址被随意访问 进程管理和内存管理解耦合 使进程用统一的视角看待代码和数据 引入 &#x1f383;我们写一个这样的程序&#xff0c;运…

算法记录 | Day50 动态规划

123.买卖股票的最佳时机III 思路&#xff1a; 1.确定dp数组以及下标的含义 最多可完成两笔交易意味着总共有三种情况&#xff1a;买卖一次&#xff0c;买卖两次&#xff0c;不买卖。 具体到每一天结束总共有 5 种状态&#xff1a; 未进行买卖状态&#xff1b;第一次买入状…

springboot - spring.factories

spring.factories 是什么&#xff1f; spring.factories 是 Spring Boot 自动配置的核心机制之一&#xff0c;它用于自动注册 Spring Boot 中的各种自动配置类&#xff0c;从而实现自动化配置的目的。在 Spring Boot 应用程序启动时&#xff0c;Spring Boot 会自动扫描 classp…

深度解读:《数字孪生世界白皮书(2023)》全方位剖析

2023年初&#xff0c;中国信息通信研究院发布了《数字孪生城市产业图谱研究报告&#xff08;2022&#xff09;》&#xff0c;报告中提出我国数字孪生产业四阶段体系&#xff0c;2020年到2030年是我国数字孪生产业增长期&#xff0c;当前数字孪生市场需求和技术均处于高速发展阶…