JavaWeb之Listener监听器

2023-09-18 22:07:41

1.什么是监听器?

(1)监听器是Servlet规范中的一员。就像Filter一样。Filter也是Servlet规范中的一员。
(2)在Servlet中,所有的监听器接口都是以“Listener”结尾。
(3)监听器中的方法不需要程序员手动调用,是发生某个特殊事件之后被服务器调用的

2.监听器有什么用?

(1)监听器实际上是Servlet规范留给我们javaweb程序员去执行某段代码的特殊时机。
(2)如果在特殊的时刻想执行一段代码,你需要想到使用对应的监听器。

3.Servlet规范中提供了哪些监听器?

3.1 jakarta.servlet包下

(1)ServletContextListener

public interface ServletContextListener extends EventListener {
    public default void contextInitialized(ServletContextEvent sce) {
	// 这个方法是在ServletContext对象被创建的时候调用
    }
    public default void contextDestroyed(ServletContextEvent sce) {
    // 这个方法是在ServletContext对象被销毁的时候调用
    }
}

(2)ServletContextAttributeListener
(3)ServletRequestListener

public interface ServletRequestListener extends EventListener {
    public default void requestDestroyed (ServletRequestEvent sre) {
    // request对象销毁时间点被调用
    }
    public default void requestInitialized (ServletRequestEvent sre) {
    // request对象创建时间点被调用
} }

(4)ServletRequestAttributeListener

2.2 jakarta.servlet.http包下

(1)HttpSessionListener

public interface HttpSessionListener extends EventListener {
    public default void sessionCreated(HttpSessionEvent se) {
     // session创建的时候被调用
    }
    public default void sessionDestroyed(HttpSessionEvent se) {
   // session销毁的时候被调用
    }
}

(2)HttpSessionAttributeListener
该监听器监听的是session域中数据的变化。只要数据变化,则执行相应的方法。主要监测点在session域对象上。

public interface HttpSessionAttributeListener extends EventListener {
    public default void attributeAdded(HttpSessionBindingEvent se) {
    // 向session域中存储数据的时候,该方法被WEB服务器调用
    }
    public default void attributeRemoved(HttpSessionBindingEvent se) {
   // 将session域中存储的数据删除的时候,该方法被WEB服务器调用
    }
    public default void attributeReplaced(HttpSessionBindingEvent se) {
   // session域中某个数据被替换的时候,该方法被WEB服务器调用
    }
}

(3)HttpSessionBindingListener
● 该监听器不需要使用@WebListener进行标注。
● 假设User类实现了该监听器,那么User对象在被放入session的时候触发“绑定”事件,User对象从session中删除的时候,触发
”解绑“事件。

@Data
public class User implements HttpSessionBindingListener {
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        // 绑定数据时调用
    }
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
		// 解绑数据时调用
    }
    // 构造方法, Getter/Setter方法
    private String username;
    private Integer password;
}

(4)HttpSessionIdListener
● session的id发生改变的时候,监听器中的唯一一个方法就会被调用。
(5)HttpSessionActivationListener
● 监听session对象的钝化和活化的。
● 钝化:session对象从内存存储到硬盘文件。
● 活化:从硬盘文件把session恢复到内存。

4.实现一个监听器的步骤

以ServletContextListener为例:
(1)第一步:编写一个类比如MyServletContextListener实现ServletContextListener接口。并且实现里面的方法。

void contextInitialized(ServletContextEvent event)
void contextDestroyed(ServletContextEvent event)

(2)第二步:在web.xml文件中对ServletContextListener进行配置,如下:

<listener>
  <listener-class>com.bjpowernode.javaweb.listener.MyServletContextListener</listener-class>
</listener>

● 当然,第二步也可以不使用配置文件,也可以用注解,例如:@WebListener
● 注意:所有监听器中的方法都是不需要javaweb程序员调用的,由服务器来负责调用。当某个特殊的事件发生
(其实就是某个时机到了)之后,被web服务器自动调用。

更多推荐

搭建Android自动化python+appium环境

一.需要软件JDK:JAVA安装后配置JDK环境SDK:SDK下载后配置adb环境Python:pyhton语言Pycharm:python脚本编译工具Appium-python-client:pyhton中的库Appium客户端二.搭建步骤1.配置JDK环境①.下载安装java:https://www.oracle.

解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制

一、引言癌症是全球范围内健康领域的一大挑战,早期预测和诊断对于提高治疗效果和生存率至关重要。机器学习在癌症预测中发挥了重要作用,可以从临床数据中学习并构建癌症预测模型,帮助医生进行早期检测和干预,提高患者的生活质量和预后结果。然而,机器学习模型的黑盒性质限制了其在临床实践中的应用。可解释的机器学习被广泛关注,它不仅能够

selenium+python实现基本自动化测试

安装selenium打开命令控制符输入:pipinstall-Uselenium火狐浏览器安装firebug:www.firebug.com,调试所有网站语言,调试功能SeleniumIDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能,IDE录制的脚本可以可以转换成多种语言,从而帮助我

蓝桥杯 题库 简单 每日十题 day5

01字符计数字符计数题目描述给定一个单词,请计算这个单词中有多少个元音字母,多少个辅音字母。元音字母包括a,e,i,o,u,共五个,其他均为辅音字母。输入描述输入格式:输入一行,包含一个单词,单词中只包含小写英文字母。单词中的字母个数不超过100。输出描述输出两行,第一行包含一个整数,表示元音字母的数量。第二行包含一个

【运维 Pro】时序场景实践与原理 - 2. 宽表,窄表与 JSON 字段

【运维Pro】:由YMatrix售前和售后团队负责的栏目。除了介绍日常的数据库运维和使用知识,我们更希望能够通过介绍这些知识背后的原理,让大家和我们一起感知数据库的美妙。摘要在上一期《时序场景实践与原理-1.分布与分区》中,我们围绕时间戳和设备标识列,介绍了设计关于分区、分布的设计思路和原理;在本期内容中,我们会围绕指

SpringBoot项目Redis使用

SpringBoot项目Redis使用引入依赖<!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>对R

【C语言】求一个整数的二进制序列中1的个数的三种方法

方法一:逐位%2法该方法的初步测试代码如下:intNumberOf1(intn){intcount=0;while(n){if(n%2==1){count++;}n=n/2;}returncount;}众所周知,数据在内存里以补码的形式存储,这是为了简化计算机的结构设计,同时也提高了运算速度。因此在计算机系统中,数值一

C语言字符串数组的定义方式

方法1:定义一个char类型的二维数组charstr[4][20]={"IloveC","Iloveyou","C语言","string"};这种方法是通过定义一个char类型的二维数组实现,通过二维数组的行索引可得到数组中的每个字符串,列的大小限定了每个字符串所能包含的最大字符个数,所以采用这种定义方式时,列的大小必

Camunda自定义多实例审批人列表

Camunda自定义多实例审批人列表1.多实例案例在工作流中会有遇到这样一个"多个人处理同一个任务“的情形,在camunda中可以使用"任务的多实例"来实现。这里以或签为例,可以设置完成条件为${nrOfCompletedInstances==1},如果是会签,设置成${nrOfCompletedInstances==

windows下gvim的配置

一、vim配置文件"查看自己的vimrc所在的目录"在命令模式下:echo$MYVIMRC"打开自己的vimrc文件"在命令模式下:e$MYVIMRC二、排版"查看自己当前的字体及大小"在命令模式下:setguifont?"设置默认的字体为仿宋_GB2312,大小为14号"在vimrc文件中添加setguifont=仿

嵌入式:驱动开发 Day4

作业:通过字符设备驱动分步注册方式编写LED驱动,完成设备文件和设备的绑定驱动程序:myled.c#include<linux/init.h>#include<linux/module.h>#include<linux/cdev.h>#include<linux/fs.h>#include<linux/device.h

热文推荐