认识监听器(Listener)

news2024/11/24 4:59:33

监听器是什么?

监听器(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

 

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL-数值类型

数值类型是最常用的几种数据类型之一&#xff0c;主要分为&#xff1a; 整型浮点型精确小数 数值类型介绍 数值类型列表 类型名称存储空间描述范围smallint2字节小范围的整数。Oracle中没有此数值类型&#xff0c;使用number代替-2^15 ~ 2^15-1int 或 integer4字节常用的整数…

日常开发为什么需要做Code Review

日常开发为什么需要做Code Review 一、背景 最近在开始一个新的项目&#xff0c;在查看项目中代码及具体细节时&#xff0c;发现这个项目真实一堆乱麻&#xff0c;没有规律可循&#xff0c;可总结下这个项目的缺陷 没有规律可循&#xff0c;没有结构性设计不做公共封装&#…

08_Uboot顶层Makefile分析_make过程

目录 make 过程 make 过程 配置好 uboot 以后就可以直接make 编译了,因为没有指明目标,所以会使用默认目标,主 Makefile 中的默认目标如下: 目标_all 又依赖于all,如下所示: 如果KBUILD_EXTMOD为空的话_all 依 赖 于all 。这 里 不 编 译 模 块,所 以KBUILD_EXTMOD肯定为空,_…

二分分类.

2.1 二分分类 在神经网络的计算中&#xff0c;通常先有一个叫做前向暂停(forward pause)或叫做前向传 播(foward propagation)的步骤&#xff0c;接着有一个叫做反向暂停(backward pause) 或叫做反向传播 (backward propagation)的步骤。 一张图片在计算机中是如何表示的&…

4。计算机组成原理(1)数据表示和运算

嵌入式软件开发&#xff0c;非科班专业必须掌握的基本计算机知识 核心知识点&#xff1a;数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 一 进位计数法和不同进制数的相互转换 其他进制(b)&#xff0c;转十进制的计算公式 十进制数&#xff0c;转…

Linux系统编程——多线程[上]:线程概念和线程控制

目录 1.再谈页表 2.Linux线程概念 2.1pthread原生库的基本使用 2.2PID和LWP 2.3Linux线程的资源以及优缺点 2.4Linux线程健壮性问题 2.5可重入函数和线程独立栈 3.Linux线程控制 3.1Linux线程终止 3.2Linux线程等待 3.3线程取消 3.4线程分离 使用线程库的注意事项…

【Python入门】Python基础语法

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

净利润同比增长48.9%,中国平安“一览众山小”

中国平安价值迸发的速度&#xff0c;或许超过了所有人的想象。 4月26日晚&#xff0c;中国平安发布2023年一季度业绩报告&#xff0c;许多自媒体用“炸裂”来形容其亮眼的财务数据。财报显示&#xff0c;第一季度&#xff0c;集团实现营收2537.78亿元&#xff0c;同比增长30.8…

农机电招平台~java

摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单&#xff0c;变…

LeetCode:383. 赎金信

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 题解目录 一、&#x1f331;[383. 赎金信](https://leetcode.cn/problems/ransom-note/)…

DOM概述

DOM概述 什么是DOM对象树化的DOM模型DOM 节点 如何获取DOM元素如何更改我们的DOM模型常用属性修改控制样式属性 事件事件监听 事件类型鼠标事件键盘事件焦点事件文本框输入事件 事件对象回调函数DOM 节点插入节点插入节点删除节点查找节点父子关系兄弟关系 什么是DOM 当网页被…

SPSS如何进行因子分析和主成分分析之案例实训?

文章目录 0.引言1.因子分析2.主成分分析 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对因子分析和主成分分析进行阐述。 1.因子分…

Android:LeakCanary原理的简单理解和使用

LeakCanary原理的简单理解和使用 1、背景2、LeakCanary2.1、LeakCanary 工作原理2.1.1、检测未被 GC 回收的对象2.1.2、转储堆2.1.3、分析堆2.1.4、对泄漏进行分类 2.2、LeakCanary 使用2.2.1、引入依赖2.2.1.1、原理 2.2.2、配置 LeakCanary2.2.3、检测内存泄漏 3、Fragment 和…

Hystrix断路器 (豪猪)-保险丝

一、概述 重点&#xff1a;能让服务的调用方&#xff0c;够快的知道被调方挂了&#xff01;不至于说让用户在等待。 Hystix 是 Netflix 开源的一个延迟和容错库&#xff0c;用于隔离访问远程服务、第三方库&#xff0c;防止出现级联失败&#xff08;雪崩&#xff09;。 雪崩&am…

自动驾驶行业观察之2023上海车展-----车企发展趋势(2)

自主品牌发展 比亚迪&#xff1a;展示3款新车&#xff0c;均于2023年年内上市 比亚迪在本次展会上推出了3款新车&#xff1a;宋L概念车&#xff08;王朝系列&#xff09;、驱逐舰07&#xff08;海洋系列&#xff09;、海鸥&#xff08;海洋系列&#xff09;。 • 宋L&#x…

FreeRTOS:任务的创建和删除

目录 一、函数xTaskCreate二、函数xTaskCreateStatic三、函数xTaskCreateRestricted四、函数vTaskDelete五、任务创建和删除&#xff08;动态&#xff09;代码5.1实验要求5.2程序代码 一、函数xTaskCreate 此函数用来创建一个任务&#xff0c;任务需要RAM来保存与任务有关的状…

Mysql数据库基本操作(增删改查)

目录 一、数据库的基本操作1.1 登录数据库1.2 创建数据库并进入数据库 二、查看数据库结构2.1 查看数据库信息2.2 查看数据库中包含的表及表结构2.3、常用的数据库类型 三、Mysql数据文件3.1 MYD文件3.2 MYI文件3.3 MyISAM存储引擎 四、SQL 语句1、 DDL数据定义语言1.1 删除指定…

〖Python网络爬虫实战㉒〗- 数据存储之数据库详解

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

Eureka、Zookeeper、Consul服务注册与发现

一、Eureka服务注册与发现 1.1 概念 Eureka 是 Netflix 公司开源的一个服务注册与发现的组件 。 Eureka 和其他 Netflix 公司的服务组件&#xff08;例如负载均衡、熔断器、网关等&#xff09; 一起&#xff0c;被 Spring Cloud 社区整合为Spring-Cloud-Netflix 模块。 Eure…

校招失败后,在小公司熬了 2 年终于进了百度,竭尽全力....

其实两年前校招的时候就往百度投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…