JavaWeb 速通Listener

目录

一、Listener快速入门

[1.Listener简介 :](#1.Listener简介 :)

[2.Java事件处理机制 :](#2.Java事件处理机制 :)

二、ServletContextListener

[1.作用 :](#1.作用 :)

[2.相关方法 :](#2.相关方法 :)

[3.应用实例 :](#3.应用实例 :)

三、ServletContextAttributeListener

[1.作用 :](#1.作用 :)

[2.相关方法 :](#2.相关方法 :)

[3.应用实例 :](#3.应用实例 :)

四、HttpSessionListener

[1.作用 :](#1.作用 :)

[2.相关方法 :](#2.相关方法 :)

[3.应用实例 :](#3.应用实例 :)

五、其他监听器

[1.HttpSessionAttributeListener :](#1.HttpSessionAttributeListener :)

[1.1 作用](#1.1 作用)

[1.2 相关方法](#1.2 相关方法)

[2.ServletRequestListener :](#2.ServletRequestListener :)

[2.1 作用](#2.1 作用)

[2.2 相关方法](#2.2 相关方法)

[3.ServletRequestAttributeListener :](#3.ServletRequestAttributeListener :)

[3.1 作用](#3.1 作用)

[3.2 相关方法](#3.2 相关方法)


一、Listener快速入门

1.Listener简介 :

(1) Listener是 JavaWeb 的三大组件之一。 JavaWeb 的三大组件分别是: Servlet 程序 Listener 监听器、 Filter 过滤器。
(2) Listener 是 JavaEE 的规范,就是接口.
(3) 监听器 的作用是,监听某种变化 ( 一般是对象的创建/销毁, 属性的变化 ), 触发对应方法完成 相应的任务。
(4) JavaWeb 中的监听器共8个 , 其中最常用的是 ServletContextListener。

2.Java事件处理机制 :

java的事件处理采用"委派事件模型"。即当事件发生时,产生该事件的对象,并把相关信息传递给"事件的监听者"处理

其中------

①****事件源,就是指用户的操作,可以是一个按钮,也可以是一个窗口,即产生事件对象的对象;

②****事件,就是承载事件源状态改变时生成的信息的事件对象,比如键盘事件,窗口事件,鼠标事件等等,该对象保存着当前事件的很多信息,比如KeyEvent对象含有当前被按下键的Code值。java.awt.event包和javax.swing.event包下定义了各种事件类型。


二、ServletContextListener

1.作用 :

监听ServletContext的创建或销毁( Web 应用启动时 创建ServletContext对象), 即生命周期监听。
应用场景------
(1)加载初始化的配置文件;eg : Spring的配置文件
(2)任务调度 (配合定时器 Timer/TimerTask)

2.相关方法 :

(1) void contextInitialized(ServletContextEvent sce) 创建 ServletContext对象时触发
(2) void contextDestroyed(ServletContextEvent sce) 销毁ServletContext对象时触发

3.应用实例 :

web.xml配置文件如下 :

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <listener>
        <listener-class>listener.IntroListener</listener-class>
    </listener>
</web-app>

IntroListener类代码如下 :

java 复制代码
package listener;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;

/** Δ注意事项 : 
    (1) 当一个类实现了ServletContextListener接口,该类就是一个监听器。
    (2) 该类可以监听的事件,由该类实现的监听接口决定,
        eg: 实现了ServletContextListener接口,就可以监听ServletContextListener对象
            的创建和销毁,以此类推。
    (3) 当Web应用启动时,会产生ServletContextEvent事件对象,会调用对应的监听器的事件
        处理方法,此处为contextInitialized(...)方法,同时会传递事件对象。
    (4) 程序员可以通过ServletContextEvent事件对象,来获取需要的信息,然后再进行相应的业务处理。
    (5) Tomcat有维护一个容器来管理Listener.
 */
public class IntroListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        System.out.println("获取到的ServletContext对象 = " + servletContext);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        System.out.println(servletContext + "------------ServletContext对象被销毁~");
    }
}

运行结果 :


三、ServletContextAttributeListener

1.作用 :

监听 ServletContext 属性变化

2.相关方法 :

(1) void attributeAdded(ServletContextAttributeEvent event) 添加属性时调用
(2) void attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用
(3) void attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用

3.应用实例 :

web.xml配置文件如下 :

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <listener>
        <listener-class>listener.IntroListener</listener-class>
    </listener>
    <listener>
        <listener-class>listener.ServletContextAttribute</listener-class>
    </listener>
</web-app>

ServletContextAttribute类代码如下 :

java 复制代码
package listener;

import jakarta.servlet.ServletContextAttributeEvent;
import jakarta.servlet.ServletContextAttributeListener;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class ServletContextAttribute implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        String name = scae.getName();
        Object value = scae.getValue();
        System.out.println("监听到\"" + name + " = " + value + "\"属性被添加");
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        //Δ该方法取得的属性为旧值。

        String name = scae.getName();
        Object value = scae.getValue();
        System.out.println("监听到\"" + name + " = " + value + "\"属性被修改");
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        String name = scae.getName();
        Object value = scae.getValue();
        System.out.println("监听到\"" + name + " = " + value + "\"属性被删除");
    }
}

TestServlet类代码如下 :

java 复制代码
package listener;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet(urlPatterns={"/test"})
public class TestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();

        servletContext.setAttribute("color", "cyan");
        servletContext.setAttribute("color", "pink");

        servletContext.removeAttribute("color");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

运行结果 : (GIF)


四、HttpSessionListener

1.作用 :

监听Session对象的创建或销毁,即Session生命周期监听。

2.相关方法 :

(1) void sessionCreated(HttpSessionEvent se) 创建Session对象时调用
(2) void sessionDestroyed(HttpSessionEvent se) 销毁Session对象时调用

3.应用实例 :

HttpSessionListener_Demo类代码如下 :

java 复制代码
package listener;

import jakarta.servlet.http.HttpSession;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;

public class HttpSessionListener_Demo implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        String sessionId = session.getId();
        System.out.println("Session" + sessionId + "被创建.");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        String sessionId = session.getId();
        System.out.println("Session" + sessionId + "被销毁.");
    }
}

在web.xml配置文件中配置该Listener,如下图所示 :

TestServlet2类代码如下 :

java 复制代码
package listener;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

@WebServlet(urlPatterns = {"/test2"})
public class TestServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        System.out.println("session = " + session);

        String threadName = Thread.currentThread().getName();
        System.out.println("令" + threadName + "线程休眠10秒钟~");
        try {
            Thread.sleep(1000 * 10);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        session.invalidate();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

运行结果 : (如下GIF)


五、其他监听器

1.HttpSessionAttributeListener :

1.1 作用

监听 Session 属性的变化

1.2 相关方法

(1) void attributeAdded(ServletRequestAttributeEvent srae) 向Session对象中添加属性时
(2) void attributeReplaced(ServletRequestAttributeEvent srae) 替换Session对象中的属性时
(3) void attributeRemoved(ServletRequestAttributeEvent srae) 移除Session对象中的属性时

2.ServletRequestListener :

2.1 作用

监听Req对象的创建或销毁,即Request对象生命周期监听。

2.2 相关方法

(1) void requestInitialized(ServletRequestEvent sre) 创建request对象 时调用;可以通过ServletRequestEvent对象获取到ServletRequest对象,然后通过多态的向下转型,得到HttpServletRequest接口的实现类对象。
(2) void requestDestroyed(ServletRequestEvent sre) 销毁request对象 时调用。

3.ServletRequestAttributeListener :

3.1 作用

监听Req的属性变化 . ( 最先被调用 ;结合Tomcat的底层机制, Tomcat会通过HttpServletRequest对象来处理HTTP请求

3.2 相关方法

(1) void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
(2) void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时
(3) void attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时

System.out.println("END----------------------------------------------------------------------------------------------------------------------------------");

相关推荐
utmhikari41 分钟前
【架构艺术】Go语言微服务monorepo的代码架构设计
后端·微服务·架构·golang·monorepo
蜡笔小新星44 分钟前
Flask项目框架
开发语言·前端·经验分享·后端·python·学习·flask
IT猿手1 小时前
2025最新群智能优化算法:海市蜃楼搜索优化(Mirage Search Optimization, MSO)算法求解23个经典函数测试集,MATLAB
开发语言·人工智能·算法·机器学习·matlab·机器人
计算机学姐1 小时前
基于Asp.net的驾校管理系统
vue.js·后端·mysql·sqlserver·c#·asp.net·.netcore
欢乐少年19043 小时前
SpringBoot集成Sentry日志收集-3 (Spring Boot集成)
spring boot·后端·sentry
夏天的味道٥4 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
Fantasywt4 小时前
THREEJS 片元着色器实现更自然的呼吸灯效果
前端·javascript·着色器
IT、木易5 小时前
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。
开发语言·前端·javascript·ecmascript
冰糖码奇朵5 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
好教员好5 小时前
【Spring】整合【SpringMVC】
java·spring