Web组件之 Listener (监听器)

文章目录

    • 1.1 Listener概述
    • 1.2 Listener快速入门
        • ① xml版本
        • ② 注解版本
    • 1.3 案例:模拟spring框架

在这里插入图片描述


1.1 Listener概述

​ JavaWeb 中的监听器是监听 ServletContext HttpSession HttpServletRequest 三个数据域对象创建和销毁以及监听数据域对象中数据的变化,就是监听数据域对象中属性的变化setAttribute removeAttribute

1.ServletContext 是在tomcat启动创建,关闭tomcat销毁

2.HttpSession 是在浏览器第一次访问执行request.getSession()创建,销毁时间:1)30min 2)执行invalidate()

3.HttpServletRequest 是浏览器第一次访问创建,浏览器接收到服务器的响应就销毁

# 监听
1. 设置监听器的人
2. 监听器 
2. 监听器目标: 被监听的对象 
3. 监听器工作: 被监听的对象执行某种行为,监听器就开始工作# web里面
1. 雇佣人 : web程序开发者
2. 监听器例子A1). 监听器A: ServletContextListener ****2). 目标 :  监听ServletContext对象3). 执行 : 监听ServletContext对象创建和销毁
3. 监听器例子B1). 监听器A: HttpSessionListener2). 目标 : HttpSession对象3). 执行 : 监听HttpSession对象创建和销毁
4. 监听器例子C1). 监听器A: HttpRequestListener2). 目标 : HttpRequest对象3). 执行 : 监听HttpRequest对象创建和销毁	
5.  监听器例子D1). 监听器A: ServletContextAttributeListener ****2). 目标 : ServletContext对象3). 执行 : 监听ServletContext对象增删改数据 (add,remove) 当我们向ServletContext对象中添加数据(setAttribute())和删除数据(removeAttribute())就会被ServletContextAttributeListener监听器监听ServletContextAttributeListenerHttpSessionAttributeListenerHttpRequestAttributeListener

生活中的监听器

我们很多商场有摄像头,监视着客户的一举一动。如果客户有违法行为,商场可以采取相应的措施。

JavaWeb 中的监听器

在我们的 java 程序中,有时也需要监视某些事情,一旦被监视的对象发生相应的变化,我们应该采取相应的操作。

监听 web 三大域对象:HttpServletRequestHttpSessionServletContext (创建和销毁)

场景

历史访问次数、统计在线人数、系统启动时初始化配置信息

监听器的接口分类

事件源监听器接口时机
ServletContextServletContextListener上下文域创建和销毁
ServletContextServletContextAttributeListener上下文域属性增删改的操作
HttpSessionHttpSessionListener会话域创建和销毁
HttpSessionHttpSessionAttributeListener会话域属性增删改的操作
HttpServletRequestServletRequestListener请求域创建和销毁
HttpServletRequestServletRequestAttributeListener请求域属性增删改的操作

1.2 Listener快速入门

监听器在 web 开发中使用的比较少,见的机会就更少了,今天我们使用 ServletContextListenner 来领略下监听器的风采, 因为这个监听器是监听器中使用率最高的一个, 且监听器的使用方式都差不多。

使用这个监听器可以在项目启动和销毁的时候做一些事情, 例如:在项目启动的时候加载配置文件。

步骤分析

1. 创建一个普通类,实现ServletContextListenner2. 重写方法监听ServletContext创建监听ServletContext销毁3. 配置可以 web.xml也可以 注解
① xml版本
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;/*设置监听器的人: 开发者监听器 : MyListener监听器目标 : ServletContext 对象监听器的工作:1). 当ServletContext 对象创建的时候就会执行contextInitialized方法ServletContext是tomcat启动时就会创建 (早于Filter和Servlet)2). 当ServletContext 对象销毁的时候就会执行contextDestroyed方法ServletContext是tomcat关闭时销毁 (晚于Filter和Servlet)这两个方法是事件驱动*/
public class MyListener implements ServletContextListener {//tomcat一启动,此方法就会运行//运用场景: spring底层封装了一个ServletContextListener加载配置文件@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("contextInitialized");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("contextDestroyed");}
}
<listener><listener-class>com.test.MyServletContextListener</listener-class>
</listener>
② 注解版本
@WebListener
public class MyListener implements ServletContextListener {//tomcat一启动,此方法就会运行//运用场景: spring底层封装了一个ServletContextListener加载配置文件@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("contextInitialized");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("contextDestroyed");}
}

1.3 案例:模拟spring框架

需求:可以在项目启动时读取配置文件。获取配置文件的名字。

步骤:

1.在web.xml进行配置文件的配置

2.创建自定义监听器类监听ServletContext的创建和销毁

3.在自定义监听器类中实现监听器的方法

4.实现的方法体中读取web.xml文件中关于当前项目配置文件的信息

5.输出结果

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;//2.创建自定义监听器类监听ServletContext的创建和销毁
//别忘记注册监听器
@WebListener
public class SpringContextListener implements ServletContextListener{//3.在自定义监听器类中实现监听器的抽象方法@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {//4.实现的方法体中读取web.xml文件中关于当前项目配置文件的信息//4.1根据事件类对象servletContextEvent调用方法获取ServletContext上下文对象ServletContext servletContext = servletContextEvent.getServletContext();//4.2使用上下文对象调用方法获取web.xml配置文件中的数据/*<context-param><param-name>jdbc</param-name><param-value>jdbc.properties</param-value></context-param>*/String str = servletContext.getInitParameter("jdbc");System.out.println("str = " + str);}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("释放资源....销毁。。。。");}
}
<!--配置当前项目的配置文件信息-->
<!--1.在web.xml进行配置文件的配置-->
<context-param><param-name>jdbc</param-name><param-value>jdbc.properties</param-value>
</context-param>

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

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

相关文章

【论文翻译】IJCAI 2019 | Graph WaveNet:用于深度时空图建模的Graph WaveNet

论文题目Graph WaveNet for Deep Spatial-Temporal Graph Modeling作者团队Zonghan Wu, Shirui Pan, Guodong Long, Jing Jiang, Chengqi Zhang机构澳大利亚悉尼科技大学人工智能中心 (UTS) 和 澳大利亚莫纳什大学发表会议IJCAI 2019论文链接https://www.ijcai.org/proceedings…

Java数组的定义与使用

今天来学习Java数组的定义与使用 目录 1 数组的基本概念1.1 数组的意义1.2 数组的定义1.3 数组的创建及初始化1.3.1 数组的创建1.3.2 数组的初始化 1.4 数组的使用1.4.1 数组中的元素访问1.4.2 遍历数组运行结果运行结果 2 数组是引用类型2.1 初始 JVM 的内存分布2.2 基本类型变…

https://tieba.baidu.com/p/9247698007

微深节能的库区智能化无人天车管理系统结合了格雷母线技术&#xff0c;提供了一种高精度的定位解决方案。格雷母线系统能够实现连续或断续的位置检测&#xff0c;精度高达≤5mm&#xff0c;适用于需要高精度作业的场景&#xff0c;如货物搬运和堆放。这种系统通过实时交互&…

创作里程碑:纪念日回顾与展望

目录 机缘&#xff1a;创作者初心 1. 实战项目 2. 日常学习 3. 技术交流 4. 总结 收获&#xff1a;创作者动力 创作与工作、学习的关系 憧憬&#xff1a;职业规划与创作规划 职业规划&#xff1a; 创作规划&#xff1a; 机缘&#xff1a;创作者初心 回望自己踏上…

软考(中级-软件设计师)数据库篇(1101)

第6章 数据库系统基础知识 一、基本概念 1、数据库 数据库&#xff08;Database &#xff0c;DB&#xff09;是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储&#xff0c;具有较小的冗余度、较高的数据独立性和扩展…

go-zero 的使用

目录 1. 生成 user api 服务 2. 生成 user rpc 服务 3. 生成 user model 模型 4. 编写 user rpc 服务 1 修改配置文件 user.yaml 2 添加 user model 依赖 3 添加用户登录逻辑 Login 5. 编写 user api 服务 1 修改配置文件user.yaml 2 添加 user rpc 依赖 3 添加用户…

基金委:目前资助率过低,危害大,应提升至30~35%,增大青年、面上项目经费

国家基金委 近日&#xff0c;国家基金委发表题为《近十年 NSF资助率和资助强度上升 对我国科学基金资助工作的启示》文章&#xff0c;文章基于近十年 NSF总体资助变化,提出对我国科学基金资助工作启示&#xff0c;阐述了国家自然基金项目资助率下降情况、危害&#xff0c;并提…

NPM 包开发与优化全面指南

前言 Hey, 我是 Immerse系列文章首发于【Immerse】&#xff0c;更多内容请关注该网站转载说明&#xff1a;转载请注明原文出处及版权声明&#xff01; 1. 理解 NPM 包的结构 1.1 package.json 文件&#xff1a;包的核心 package.json文件是 NPM 包的中央配置&#xff0c;定…

学Linux的第六天

目录 账户和组管理 工作组管理 创建工作组groupadd 修改工作组groupmod 添加/删除组成员gpasswd 删除工作组groupdel 查看用户登录系统的情况 users查看当前登录系统的用户 last命令 lastlog命令 w命令 显示登录到系统的用户信息 who命令 Linux文件系统权限 文件…

来康生命科技有限公司心率监测解决方案在健身房与康养机构的应用探索

引言 随着科技的日新月异&#xff0c;智能健康服务正逐步成为现代健康管理不可或缺的一环。来康生命科技有限公司&#xff0c;凭借其在智能物联集成交互领域的自主创新能力&#xff0c;推出了一款集蓝牙物联网、蓝牙手环、数据云与管理终端于一体的心率监测解决方案。此方案专…

在 .NET 8 Web API 中实现 Entity Framework 的 Code First 方法

本次介绍分为3篇文章&#xff1a; 1&#xff1a;.Net 8 Web API CRUD 操作.Net 8 Web API CRUD 操作-CSDN博客 2&#xff1a;在 .Net 8 API 中实现 Entity Framework 的 Code First 方法https://blog.csdn.net/hefeng_aspnet/article/details/143229912 3&#xff1a;.NET …

C++类和对象上

1. 类的定义 1.1 类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。…

NineData云原生智能数据管理平台新功能发布|2024年10月版

10 月发布内容 本月发布 7 项更新&#xff0c;其中重点发布 2 项、功能优化 3 项、性能优化 1 项、其他发布 1 项。 重点发布​ 数据库 Devops - 数据生成​ NineData 支持在数据库中自动生成符合特定业务场景的随机数据&#xff0c;用于模拟实际生产环境中的数据情况&…

BGP路径属性与路由反射器

前言 IBGP水平分割规则用于防止AS内部产生环路&#xff0c;在很大程度上杜绝了IBGP路由产生环路的可能性&#xff0c;但是同时也带来了新的问题&#xff1a;BGP路由在AS内部只能传递一跳&#xff0c;如果建立IBGP对等体全互联模型又会加重设备的负担。 BGP 路径属性 AS_Path …

医学和生信web APP 平台- Appmatrix

医学&#xff08;和生信&#xff09;web APP 平台- Appmatrix 最近使用shinyproxy将平时所构建的shiny和streamlit医学类应用汇集在一起&#xff0c;实现一站式访问&#xff0c;另外&#xff0c;使用了自己电脑内网穿透&#xff0c;一定程度上缓解了数据分析类APP消耗计算资源…

Rust 力扣 - 1456. 定长子串中元音的最大数目

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;我们只需要记录窗口内的元音字母数量即可&#xff0c;遍历过程中刷新最大数目 题解代码 impl Solution {pub fn max_vowels(s: String, k: i32) -> i32 {let s s.as_byt…

Centos系统新增网卡后获取不到网卡的IP地址解决方法

一、问题描述 当我们给Centos系统添加了新的网卡后,使用查看IP地址命令【ip addr】时,发现新网卡没有获取到对应的IP地址信息,如下图所示: 二、解决方法 有两种解决方法:一种是自动获取IP地址;另外一种是手动配置IP地址; 2.1、自动获取IP地址 #自动获取网卡的IP地址命…

跨境卖家必备!好用的独立站建站工具推荐 !

对于跨境卖家来说&#xff0c;拥有一个独立站是拓展海外市场、提升品牌影响力的重要途径。而选择一款好用的独立站建站工具&#xff0c;则是成功搭建独立站的关键。 一、为什么跨境卖家需要独立站&#xff1f; 在跨境电商领域&#xff0c;独立站具有诸多优势。首先&#xff0c…

Windows Qt 6安装Oracle QOCI SQL Driver插件

本文参考 QOCI for the Oracle Call Interface (OCI)。 Windows 打开 Qt 6.8.0 (MSVC 2022 64-bit)。 Setting up environment for Qt usage… Remember to call vcvarsall.bat to complete environment setup! 执行 "D:\Program Files\Microsoft Visual Studio\2022\E…

书生实战营第四期-第二关python

一、任务1&#xff1a;完成Leetcode 383 1.代码 class Solution:def canConstruct(self,ransomNote: str, magazine: str) -> bool: # 创建一个字典来存储 magazine 中每个字符的出现次数 char_count {} # 遍历 magazine&#xff0c;统计每个字符的出现次数 for char…