当前位置: 首页 > 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;两者距离不变 我们完全可以不考虑格子是好…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...