JavaWeb 速通Listener

news2024/11/17 12:21:10

目录

一、Listener快速入门

        1.Listener简介 :  

        2.Java事件处理机制 : 

二、ServletContextListener

        1.作用 : 

        2.相关方法 : 

        3.应用实例 : 

三、ServletContextAttributeListener

        1.作用 : 

        2.相关方法 : 

        3.应用实例 : 

四、HttpSessionListener

        1.作用 : 

        2.相关方法 : 

        3.应用实例 : 

五、其他监听器

        1.HttpSessionAttributeListener : 

            1.1 作用 

            1.2 相关方法

        2.ServletRequestListener : 

            2.1 作用

            2.2 相关方法

        3.ServletRequestAttributeListener : 

            3.1 作用

            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 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类代码如下 : 

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 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类代码如下 : 

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类代码如下 : 

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类代码如下 : 

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类代码如下 : 

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----------------------------------------------------------------------------------------------------------------------------------");

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

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

相关文章

KeilMDk软仿真设置_STM32F03C8

1、KeilMDK软仿真的价值 (1)在没有硬件的情况下进行程序的编写调试。 (2)避免频繁的下载程序&#xff0c;延长单片机Flash寿命。 2、软仿真配置。 (1)打开Keil工程。 (2)点击“Options for Target ***”&#xff0c;如下图所示。 (3)点击“Debug”。 (4)进行如下配置。 U…

无涯教程-TensorFlow - XOR实现

在本章中&#xff0c;无涯教程将学习使用TensorFlow的XOR实现&#xff0c;在TensorFlow中开始XOR实施之前&#xff0c;看一下XOR表值。这将帮助了解加密和解密过程。 A B A XOR B 0 0 0 0 1 1 1 0 1 1 1 0 XOR密码加密方法基本上用于加密&#xff0c;即通过生成与适当密钥匹配…

科技大厂GenAI最新动态一览!AI创意字终极全攻略;一文入门LLM应用开发框架LangChain;Llama初学者指南 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 使用浏览器插件 immersive translate&#xff0c;将外语书翻译成双语对照版 immersive translate 是一款非常好用的浏览器翻译插件。今…

idea2023 springboot2.7.5+mybatisplus3.5.2+jsp 初学单表增删改查

创建项目 修改pom.xml 为2.7.5 引入mybatisplus 2.1 修改pom.xml <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!--mysq…

XSS攻击是什么?它有哪些类型?

xss攻击是什么&#xff1f; XSS全称是Cross Site Scripting即跨站脚本&#xff0c;当目标网站目标用户浏览器渲染HTML文档的过程中&#xff0c;出现了不被预期的脚本指令并执行时&#xff0c;XSS就发生了。 作为一种HTML注入攻击&#xff0c;XSS攻击的核心思想就是在HTML页面中…

git错误记录

露id没有影响&#xff0c;搞得微软不知道我ip一样 git fatal: 拒绝合并无关的历史的错误解决(亲测有效)

使用Pandas处理Excel文件

Excel工作表是非常本能和用户友好的&#xff0c;这使得它们非常适合操作大型数据集&#xff0c;即使是技术人员也不例外。如果您正在寻找学习使用Python在Excel文件中操作和自动化内容的地方&#xff0c;请不要再找了。你来对地方了。 在本文中&#xff0c;您将学习如何使用Pan…

ansible(1)-- 部署ansible连接被控端

目录 一、部署ansible 1.1 安装 1.2 测试连接 192.168.136.55 ansible 192.168.136.56被控端 一、部署ansible 1.1 安装 zabbix-s只是主机名&#xff0c;不用在意&#xff0c;更好该主机也安装了zabbix&#xff0c;不好更改。 下载阿里云epel源 #安装阿里云的epel源&#…

33.Netty源码之读写数据

highlight: arduino-light 写数据 写数据的三种方式 md 快递场景(包裹) Netty 写数据(数据) 揽收到仓库 write&#xff1a;写到一个 buffer 从仓库发货 flush: 把 buffer 里的数据发送出去 揽收到仓库并立马发货 (加急件) writeAndFlush&#xff1a;写到 buffer&#xff0c;立马…

Android5:活动生命周期

创建项目Stopwatch activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_w…

产品经理必知必会0.2

Q1:产品经理需要具备的能力&#xff1f; A:硬实力&#xff1a;产品设计、需求分析、竞品分析、数据分析、撰写文档 软实力&#xff1a;沟通能力、学习能力、用户思维、主动性、好奇心、同理心、责任心、抗压能力、目标导向.... 扩展能力&#xff1a;商业思维、市场敏感度... Q…

3D与沉浸式技术,如何助力企业数字化转型?

说起3D&#xff0c;估计许多读者朋友会在第一时间想起《阿凡达》系列和《侏罗纪公园》系列电影大作。每一帧细节纤毫毕现的逼真画面&#xff0c;让观众几乎分不清虚拟与现实&#xff0c;完全沉浸在导演打造的视觉盛宴中。 事实上&#xff0c;除了大家所熟知的3D影视动画之外&am…

ps丢失d3dcompiler_47.dll怎么办,启动无反应,分享三个解决方法

d3dcompiler_47.dll64位是windows系统中重要的dll文件&#xff0c;缺少了它可能会引起部分软件或者游戏不能运行。 如果系统出现“找不到d3dcompiler_47.dll”或“d3dcompiler_47.dll丢失”等错误信息&#xff0c;那么我们就该着手修复它。 先带了解一下d3dcompiler_47.dll是什…

【MATLAB基础绘图第16棒】绘制热图(Heatmap)

热图&#xff08;Heatmap&#xff09; 热图的主要作用是直观展示重点研究对象的差异情况&#xff0c;多用于经济学与工学差异性分析之中。 heatmap函数创建热图 语法 hheatmap(tbl,xvar,yvar) hheatmap(tbl,xvar,yvar,ColorVariable,cvar) hheatmap(cdata) hheatmap(xvalue…

开发板启动过程

开发板启动过程 开发板上电后首先运行SOC内部iROM中固化的代码(BL0)&#xff0c;这段代码先对基本的软硬件环境(时钟等…)进行初始化&#xff0c;然后再检测拨码开关位置获取启动方式&#xff0c;然后再将对应存储器中的uboot搬移到内存&#xff0c;然后跳转到uboot运行 uboot…

《TCP IP网络编程》第二十四章

第 24 章 制作 HTTP 服务器端 24.1 HTTP 概要 本章将编写 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;服务器端&#xff0c;即 Web 服务器端。 理解 Web 服务器端&#xff1a; web服务器端就是要基于 HTTP 协议&#xff0c;将网页对…

将挖洞当作爱好和职业的笑与泪:微软漏洞研究员的自白

前言 本文主人公目前是微软的一名漏洞研究员&#xff0c;他讲述了将挖洞当作爱好和当作职业的笑与泪&#xff0c;以及一些建议忠告。 我写的通常都是自己挖到的有意思的浏览器 bug&#xff0c;希望能借读者一臂之力&#xff0c;应用这些经验或思路。不过这次我写的是将挖洞作…

kicad 7 如何设置画直线

kicad 7和之前的版本有些地方不一样&#xff0c;有些默认的快捷键失效了&#xff0c;比如画直线的功能。小伙伴们可以按照下图操作&#xff0c;点击该按钮&#xff0c;画出的线就是直直的线了~ 图1&#xff1a;Kicad 7 画直线的按钮 作者&#xff1a;潇洒的电磁波&#xff08;…

妙鸭爆火给AI开发者的启示;最全LangChain资源库;LLM大学;大模型实践长文总结 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; AI全流程动画「剪刀石头布2」&#xff0c;以及幕后制作解析 BV1oV41137Vr BV1SG411Z77M 油管知名博主 Corridor Crew 用AI工具 Stable…

8.1.5:Extreme Optimization Numerical Libraries for .NET

构建金融、工程和科学应用程序。 Extreme Optimization Numerical Libraries for .NET 是通用数学和统计类的集合。它为基于 Microsoft .NET 平台构建的技术和统计计算提供了一个完整的平台。它将数学库、向量和矩阵库以及统计库结合在一个方便的包中。 一般特征 即使对数学不太…