当前位置: 首页 > news >正文

JavaWeb-Listener监听器

目录

监听器Listener

1.功能

2.监听器分类

3.监听器的配置

4.ServletContext监听

5.HttpSession监听

6.ServletRequest监听


监听器Listener

1.功能

  1. 用于监听域对象ServletContext、HttpSession和ServletRequest的创建,与销毁事件
  2. 监听一个对象的事件,如果发生了某事件则可以执行相应的代码

默认的优先级别:Listener>Filter>Servlet


2.监听器分类

由于事件的复杂性,监听器也有许多对应的监听器。总体上按照作用域可以分为以下三类

  1. Servlet上下文相关监听接口,包括ServletContextListener、ServletAttributeListener
  2. HTTP会话监听接口,包括HttpSessionListener、HttpActivationListener等
  3. Servlet请求监听接口,包括ServletRequestListener、ServletRequestAttributeListener

3.监听器的配置

1.通过xml配置

    <listener>
<!--        在listener-class中输入具体的类的位置--><listener-class>com.company.Listener.ListenerDemo1</listener-class></listener>

2.通过注解类配置

@WebListener

只需要填写@WebListener即可 


4.ServletContext监听

通过实现ServletContext接口实现监听器功能

1.生命周期监听

ServletContext的生命周期监听,监听ServletContext对象的创建与销毁方法如下

方法名描述
contextInitialized()当ServletContext对象被创建时,容器会自动调用该方法。在这个方法中,你可以执行一些初始化操作,比如加载配置文件、建立数据库连接等。
contextDestroyed()当ServletContext对象被销毁时,容器会自动调用该方法。在这个方法中,你可以执行一些清理操作,比如释放资源、关闭数据库连接等。
package com.company.Listener;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
//使用注解类配置
@WebListener
public class ListenerDemo1 implements ServletContextListener {//    在创建出ServletContext对象时候自动调用函数@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("监听到有ServletContext对象创建");}
//    检测到ServletContext对象被销毁@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("监听到有ServletContext对象被销毁");}
}

 具体案例代码:

创建ServletContext对象代码:

package com.company;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/ServletContextDemo1")
public class ServletContextDemo1 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建ServletContext对象ServletContext context = req.getServletContext();System.out.println("ServletContextDemo1被调用");}
//        实现方法统一@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

2.属性监听

通过实现ServletContextAttributeListener接口实现监听属性的添加、替换、修改的功能,方法如下

方法名描述
attributeAdded()当向ServletContextHttpSessionServletRequest添加属性时,容器会自动调用该方法。在这个方法中,你可以对添加的属性进行处理。
attributeReplaced()ServletContextHttpSessionServletRequest中的属性被替换时,容器会自动调用该方法。在这个方法中,你可以对替换后的属性进行处理。
attributeRemoved()ServletContextHttpSessionServletRequest中的属性被移除时,容器会自动调用该方法。在这个方法中,你可以对移除的属性进行处理

 案例代码:

监听器类代码

package com.company.Listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;@WebListener
public class ListenerDemo2 implements ServletContextAttributeListener {
//    当新创建一个ServletContext对象时候调用@Overridepublic void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
//        获取域对象ServletContext context = servletContextAttributeEvent.getServletContext();
//        获取新增的域 名和值String name = servletContextAttributeEvent.getName();Object value = servletContextAttributeEvent.getValue();
//        输出修改对象System.out.println("域对象"+context+"范围内增加了"+name+"值为"+value);}
//    当ServletContext对象被移除的时候执行@Overridepublic void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {ServletContext context = servletContextAttributeEvent.getServletContext();String name = servletContextAttributeEvent.getName();Object value = servletContextAttributeEvent.getValue();System.out.println("域对象"+context+"范围内删除了"+name+"值为"+value);}@Overridepublic void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {ServletContext context = servletContextAttributeEvent.getServletContext();String name  = servletContextAttributeEvent.getName();Object value = servletContextAttributeEvent.getValue();System.out.println("域对象"+context+"范围内替换了"+name+"值为"+value);}
}

 Servlet属性类代码

package com.company;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/ServletContextDemo3")
public class ServletContextDemo3 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ServletContext context = req.getServletContext();
//        创建context域对象值context.setAttribute("msg","Hello");
//        替换对象内容context.setAttribute("msg","你好");
//        销毁对象context.removeAttribute("msg");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}


5.HttpSession监听

通过实现接口HttpSessionListener实现HttpSession。HttpSession对象监听有三种方式,1.生命周期监听、2.属性监听、3.session监听

 1.生命周期监听

方法名描述
sessionCreated()当一个新的HttpSession对象被创建时,容器会自动调用该方法。在这个方法中,你可以对新创建的HttpSession对象进行处理。
sessionDestroyed()当一个HttpSession对象被销毁时,容器会自动调用该方法。在这个方法中,你可以对销毁的HttpSession对象进行处理。

监听类代码

package com.company.Listener;import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class ListenerDemo3 implements HttpSessionListener {
//    当session被创建时候调用@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {System.out.println("监听到有session的创建");}
//    当session被销毁时候调用@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {System.out.println("session已被销毁");}
}

Servlet实现代码

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/SessionListenerDemo1")
public class SessionListenerDemo1 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建sessionHttpSession session = req.getSession();session.setAttribute("name","AlphaMilk");
//        销毁sessionsession.invalidate();}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

2.属性监听

方法名描述
attributeAdded()当一个属性被添加到HttpSession对象中时,容器会自动调用该方法。在这个方法中,你可以对新添加的属性进行处理。
attributeReplaced()当一个属性在HttpSession对象中被替换时,容器会自动调用该方法。在这个方法中,你可以对替换的属性进行处理。
attributeRemoved()当一个属性从HttpSession对象中被移除时,容器会自动调用该方法。在这个方法中,你可以对被移除的属性进行处理

案例代码:

 监听类

package com.company.Listener;import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;@WebListener
public class ListenerDemo4 implements HttpSessionAttributeListener {
//    当session属性增加时候调用@Overridepublic void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {System.out.println("Session添加了一个新的属性");}
//    当session属性销毁时候调用@Overridepublic void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {System.out.println("Session销毁了一个属性");}
//    当session属性替换时候调用@Overridepublic void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {System.out.println("Session替换了一个属性");}
}

 Servlet实现类

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/SessionDemo5")
public class SessionDemo5 extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();
//        增加属性session.setAttribute("userName","AlphaMilk");
//        属性覆盖session.setAttribute("userName","alpha");
//        属性删除session.removeAttribute("userName");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}


6.ServletRequest监听

与上述几个接口类似,分别由生命周期监听与属性监听

1.生命周期监听

方法名描述
requestInitialized()当一个ServletRequest对象被创建并初始化时,容器会自动调用该方法。在这个方法中,你可以对新创建的ServletRequest对象进行处理。
requestDestroyed()当一个ServletRequest对象被销毁时,容器会自动调用该方法。在这个方法中,你可以对销毁的ServletRequest对象进行处理。

2.属性监听

方法名描述
attributeAdded()当一个属性被添加到ServletRequest对象中时,容器会自动调用该方法。在这个方法中,你可以对新添加的属性进行处理。
attributeReplaced()当一个属性在ServletRequest对象中被替换时,容器会自动调用该方法。在这个方法中,你可以对替换的属性进行处理。
attributeRemoved()当一个属性从ServletRequest对象中被移除时,容器会自动调用该方法。在这个方法中,你可以对被移除的属性进行处理

相关文章:

JavaWeb-Listener监听器

目录 监听器Listener 1.功能 2.监听器分类 3.监听器的配置 4.ServletContext监听 5.HttpSession监听 6.ServletRequest监听 监听器Listener 1.功能 用于监听域对象ServletContext、HttpSession和ServletRequest的创建&#xff0c;与销毁事件监听一个对象的事件&#x…...

js数组常用的方法(总结)

目录 1.数组头和尾操作——push、pop、unshift/shift 2、数组转为字符串 —— join() 3、数组截取 —— slice() 4、数组更新 —— splice() 5、反转数组 —— reverse() 6、连接数组 —— concat() 7、ES6连接数组 —— ... ES5数组新增方法 8、索引方法 —— indexO…...

Linux:shell脚本:基础使用(5)《正则表达式-sed工具》

sed是一种流编辑器&#xff0c;它是文本处理中非常中的工具&#xff0c;能够完美的配合正则表达式使用&#xff0c;功能不同凡响。 处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为“模式空间”&#xff08;pattern space&#xff09;&#xff0c;接着用s…...

关于ubuntu下面安装cuda不对应版本的pyTorch

最近换了台新的linux的ubuntu的服务器&#xff0c;发现其实际安装的cuda版本为11.4&#xff0c;但是pytorch官方给出的针对cuda 11.4并没有具体的pytorch的安装指令&#xff0c;于是采用不指定pytorch版本直接安装让其自动搜索得到即可 直接通过&#xff1a; pip3 install tor…...

【SA8295P 源码分析】26 - QNX Ethernet MAC 驱动 之 emac_rx_thread_handler 数据接收线程 源码分析

【SA8295P 源码分析】26 - QNX Ethernet MAC 驱动 之 emac_rx_thread_handler 数据接收线程 源码分析 一、emac_rx_thread_handler():通过POLL 轮询方式获取数据二、emac_rx_poll_mq():调用 pdata->clean_rx() 来处理消息三、emac_configure_rx_fun_ptr():配置 pdata->…...

70 # 协商缓存的配置:通过修改时间

对比&#xff08;协商&#xff09;缓存 比较一下再去决定是用缓存还是重新获取数据&#xff0c;这样会减少网络请求&#xff0c;提高性能。 对比缓存的工作原理 客户端第一次请求服务器的时候&#xff0c;服务器会把数据进行缓存&#xff0c;同时会生成一个缓存标识符&#…...

适合程序员的DB性能测试工具 JMeter

背景 1、想要一款既要能压数到mysql&#xff0c;又要能压数到postGre&#xff0c;还要能压数到oracle的自动化工具 2、能够很容易编写insert sql&#xff08;因为需要指定表和指定字段类型压数据&#xff09;&#xff0c;然后点击运行按钮后&#xff0c;就能直接运行&#xff…...

java实现人物关系抽取

java实现人物关系抽取 人物关系抽取是实体关系抽取的一种情况。实际上是两个过程&#xff1a;命名实体识别和关系抽取。 Java人物关系抽取是指从文本中提取出与Java相关的人物之间的关系。这个过程可以通过自然语言处理和文本分析的方法来实现。具体的步骤包括&#xff1a; 文本…...

Docker网络与资源控制

一、Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。因为在同一宿…...

图片怎么转换成pdf格式?可以试试这样转换

图片怎么转换成pdf格式&#xff1f;图片转换成PDF格式是一个常见的需求&#xff0c;无论是为了方便存储还是为了分享文件&#xff0c;将图片转换成PDF格式都是一个不错的选择。有许多软件和在线工具可以帮助你完成这个任务&#xff0c;下面就给大家介绍一款转换工具。 【迅捷PD…...

[国产MCU]-W801开发实例-GPIO输入与中断

GPIO输入与中断 文章目录 GPIO输入与中断1、硬件准备2、软件准备3、驱动实现4、驱动测试W801的GPIO支持软件配置中断,中断触发方式包含:上升沿触发、下降沿触发、高电平触发、低电平触发。本文在前面[ 国产MCU]-W801开发实例-按键与GPIO输入的基础上实现GPIO中断配置。 1、硬…...

Layui列表表头去掉复选框改为选择

效果&#xff1a; 代码&#xff1a; // 表头复选框去掉改为选择 $(".layui-table th[data-field"0"] .layui-table-cell").html("<span>选择</span>");...

Flutter实战·第二版-第三章 基础组件笔记

第三章&#xff1a;基础组件 3.1文本及样式 3.1.1 Text Text("Hello world",textAlign: TextAlign.left, );Text("Hello world! Im Jack. "*4,maxLines: 1,overflow: TextOverflow.ellipsis, );Text("Hello world",textScaleFactor: 1.5, );3.1…...

一文彻底理解时间复杂度和空间复杂度(附实例)

目录 1 PNP&#xff1f;2 时间复杂度2.1 常数阶复杂度2.2 对数阶复杂度2.3 线性阶复杂度2.4 平方阶复杂度2.5 指数阶复杂度2.6 总结 3 空间复杂度 1 PNP&#xff1f; P类问题(Polynomial)指在多项式时间内能求解的问题&#xff1b;NP类问题(Non-Deterministic Polynomial)指在…...

Mysql的索引详解

零. 索引类型概述 1. 实际开发中使用的索引种类 主键索引唯一索引普通索引联合索引全文索引空间索引 2. 索引的格式类型 BTree类型Hash类型FullText类型&#xff08;全文索引)RTree类型&#xff08;空间索引) MySQL 的索引方法&#xff0c;主要包括 BTREE 和 HASH。 顾名思…...

.netcore windows app启动webserver

创建controller: using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json.Serialization; using System.Threading.Tasks;namespace MyWorker.…...

泰迪大数据挖掘建模平台功能特色介绍

大数据挖掘建模平台面相高校、企业级别用户快速进行数据处理的建模工具。 大数据挖掘建模平台介绍 平台底层算法基于R语言、Python、Spark等引擎&#xff0c;使用JAVA语言开发&#xff0c;采用 B/S 结构&#xff0c;用户无需下载客户端&#xff0c;可直接通过浏览器进行…...

【问题】java序列化,什么时候使用

文章目录 是什么为什么如何做流操作 注事事项 是什么 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途&#xff1a;   1&#xff09;把对象的字节序列永久地保存到硬盘上&#xff0c;通常存放在一…...

【最新可用】VMware中ubuntu与主机window之间使用共享文件夹传输大文件

一、VMware设置共享文件夹 &#xff08;1&#xff09;虚拟机关机情况下&#xff0c;创建一个共享文件夹 &#xff08;2&#xff09;ubuntu中挂载共享文件夹 1、如果之前已经挂载 hgfs&#xff0c;先取消挂载 sudo umount /mnt/hgfs2、重新使用以下命令挂载 sudo /usr/bin/vmh…...

A. Two Semiknights Meet

题目描述 可知走法为中国象棋中的象的走法 解题思路 利用结构体来存储两个 K K K的位置 x , y x,y x,y&#xff0c;因为两个 K K K同时走&#xff0c;所以会出现两种情况 相向而行&#xff0c;两者距离减少 相反而行&#xff0c;两者距离不变 我们完全可以不考虑格子是好…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...