Servlet的监听器

news2024/12/1 8:33:33

Servlet常用的监听器
ServletContextAttributeListener 用来感知ServlerContext对象属性变化,比如添加或删除属性变化
ServletContextListener 用来感知ServlerContext对象的创建和销毁的
ServletRequestListener 可以用来监听感知ServletRequest对象的创建和销毁的
ServletRequestAttributeListener 用来感知ServletRequest属性变化,如何添加或删除属性还是替换
HttpSessionListener监听session的变化,常用于统计在线人数
HttpSessionAttributeListener用来监听Session属性变化
HttpSessionBindingListener 用来监听把一个数据绑定到Session对象 感知监听器
HttpSessionActivationListener用来监听session绑定的对象钝化(把对象持久化磁盘)
常用的有前6个

package com.sparrow.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * @Author: 诉衷情の麻雀
 * @Description: 当一个类实现了ServletContextListener 是一个监听器,该类可以监听的事件
 * 由该类实现的监听接口决定 该类可以监听ServletContext的创建和销毁
 * 当web应用启动时,就会产生ServletContextEvent事件,会调用监听器的对应事件处理方法contextInitialized,同时会传递事件对象
 * 我们可以通过ServletContextEvent事件对象,来获取需要的信息,然后再进行业务处理
 * 需要在web.xml配置监听器这样才能使tomcat知道,底层使用反射机制
 * @DateTime: 2023/7/5 9:57
 **/
public class SparrowServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        System.out.println("SparrowServletContextListener监听到" + servletContext+ " 被创建...");
        //如果我们获取到ServletContext对象进行业务处理
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        System.out.println("SparrowServletContextListener监听到" + servletContext+ " 被销毁...");
        //比如可以对servletContext数据进行处理 或者日志的管理
        System.out.println("进行处理");


    }
}

/**
 * @Author: 诉衷情の麻雀
 * @Description: TODO
 * @DateTime: 2023/7/5 10:10
 **/
public class SparrowServletContextAttributeListener implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("SparrowServletContextAttributeListener监听到"+ scae.getName());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println("SparrowServletContextAttributeListener监听到:" + scae.getValue());
    }


    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {

    }
}

ServletContextAttributeListener属性监听器

package com.sparrow.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

/**
 * @Author: 诉衷情の麻雀
 * @Description: TODO
 * @DateTime: 2023/7/5 10:10
 **/
public class SparrowServletContextAttributeListener implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("SparrowServletContextAttributeListener监听到添加属性:"+ scae.getName()+"=" + scae.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println("SparrowServletContextAttributeListener监听到删除属性:" + scae.getName() + "="+ scae.getValue());
    }


    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        System.out.println("SparrowServletContextAttributeListener监听到修改/替换属性:" + scae.getName() + "="+ scae.getValue());
    }
}

配置一个HelloServlet

/**
 * @Author: 诉衷情の麻雀
 * @Description: TODO
 * @DateTime: 2023/7/18 19:59
 **/
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("helloServlet被调用了");
        ServletContext servletContext = req.getServletContext();
        servletContext.setAttribute("name", "诉衷情の麻雀");
        servletContext.setAttribute("name", "诉衷情の麻雀");
        servletContext.removeAttribute("name");
    }
}

   <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.sparrow.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/helloServlet</url-pattern>
    </servlet-mapping>

在这里插入图片描述

HttpSessionListener

/**
 * @Author: 诉衷情の麻雀
 * @Description: TODO
 * @DateTime: 2023/7/5 10:25
 **/
public class SparrowHttpSessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        //当session创建时设置一个生命周期
        session.setMaxInactiveInterval(30);
        System.out.println("SparrowHttpSessionListener监听到session创建= " + session.getId());
    }


    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        System.out.println("SparrowHttpSessionListener监听到session销毁= " + session.getId());
    }
}

 @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取session
        HttpSession session = req.getSession(); //如果没有就创建

    }

配置监听器

 <!--配置监听器-->
    <listener>
        <listener-class>com.sparrow.listener.SparrowHttpSessionListener</listener-class>
    </listener>
    <listener>
        <listener-class>com.sparrow.listener.SparrowServletContextListener</listener-class>
    </listener>
    <listener>
        <listener-class>com.sparrow.listener.SparrowServletContextAttributeListener</listener-class>
    </listener>
    <listener>
        <listener-class>com.sparrow.listener.SparrowRequestListener</listener-class>
    </listener>

在这里插入图片描述

HttpSessionAttributeListener

package com.sparrow.listener;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

/**
* @Author: 诉衷情の麻雀
* @Description: TODO
* @DateTime: 2023/7/18 20:26
**/
public class SparrowHttpSessionAttributeListener implements HttpSessionAttributeListener {
   @Override
   public void attributeAdded(HttpSessionBindingEvent se) {
       System.out.println("SparrowHttpSessionAttributeListener 监听到session添加属性了" + se.getName() + "=" + se.getValue() );
   }

   @Override
   public void attributeRemoved(HttpSessionBindingEvent se) {
       System.out.println("SparrowHttpSessionAttributeListener 监听到session删除属性了" + se.getName());
   }

   @Override
   public void attributeReplaced(HttpSessionBindingEvent se) {
       System.out.println("SparrowHttpSessionAttributeListener 监听到session修改属性了" + se.getName() + "=" + se.getValue() );

   }
}

在这里插入图片描述

ServletRequestListener监听器

作用:监听Request对象的创建和销毁
常用于监控某个IP访问网站频率/用户访问的页面、资源(日志)

public class SparrowRequestListener implements ServletRequestListener {
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("监听到request对象创建");
        ServletRequest servletRequest = sre.getServletRequest();
        System.out.println("访问IP=" + servletRequest.getRemoteAddr());
        System.out.println("访问的资源=" + ((HttpServletRequest) servletRequest).getRequestURL());

    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("监听到request对象被销毁");
    }
}

在这里插入图片描述

ServletRequestAttributeListener监听器

作用:监听Request属性变化

public class SparrowRequestAttributeListener implements ServletRequestAttributeListener {
    @Override
    public void attributeAdded(ServletRequestAttributeEvent srae) {
        
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
        ServletRequestAttributeListener.super.attributeRemoved(srae);
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
        ServletRequestAttributeListener.super.attributeReplaced(srae);
    }
}

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

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

相关文章

大语言模型(LLM)评估综述

论文地址&#xff1a;https://arxiv.org/abs/2307.03109 Github地址&#xff1a;https://github.com/MLGroupJLU/LLM-eval-survey 一 、背景 随着ChatGPT和GPT-4的推出&#xff0c;大型语言模型&#xff08;LLM&#xff09;在学术界和工业界的热度日益升高&#xff0c;这主要…

优雅的设计测试用例

⭐️前言⭐️ 入职以后接触到了公司的具体业务&#xff0c;提升了设计测试用例的能力&#xff0c;于是沉淀出这篇文档与大家分享。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&…

Acwing.905 区间选点(贪心)

题目 给定N个闭区间[a,bi]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数N&#xff0c;表示区间数。 接下来N行&#xff0c;每行包含两个整数…

Linux内核《CPU负载计算》

目录 前言一、什么是CPU负载&#xff1f;二、如何计算CPU负载三、计算CPU负载的一个脚本四、top命令详解 前言 在实际的产品开发中&#xff0c;我们往往需要关注CPU的负载&#xff0c;确保程序可以长久稳定的运行&#xff0c;并且能够重复发挥SOC的性能。Linux中提供了一些命令…

ArrayList和LinkedList

ArrayList的注意事项 1、在ArrayList中可以放任意元素&#xff0c;包括空值&#xff0c;任何元素&#xff0c;且可重复添加。 2、ArrayList底层是由数组来实现数据存储的 3、ArrayList基本等同于Vector&#xff0c;除了ArrayList是线程不安全(执行效率高),看源码 在多线程的…

【Linux系列P7】进度条小程序的深度解剖(细节满满)

​​​​​ ​ 前言 大家好吖&#xff0c;欢迎来到 YY 滴 Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过Linux的老铁&#xff0c;主要内容含 欢迎订阅 YY滴Linux专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 订阅专栏阅读&am…

SpringBoot项目中MVC使用--【SB系列之010】

SpringBoot系列文章目录 SpringBoot 的项目编译即报错处理–SB系列之001 —第一部的其它章节可以通过001链接 SpringBoot项目中WEB页面放哪里–【SB系列之008】 SpringBoot项目中WEB与Controller的联系–【SB系列之009】 ———————————————— 文章目录 SpringBoo…

线程池学习(五)线程工厂、线程池工厂

Executors 定义的Executor, ExecutorService, ScheduledExecutorService, ThreadFactory和Callable类的工厂和实用程序方法&#xff0c;我们称为线程池工厂。ThreadFactory 为定制化创建新线程的对象,我们称为线程工厂 前面几期的学习中&#xff0c;我已经初步会使用线程池了&…

用于公司文件防泄密用的保密软件(企业数据防泄密软件)

防止公司文件泄露是指采取各种措施和方法&#xff0c;以防止公司的敏感和机密文件被未经授权的人员获取、泄露或滥用的行为。 这些文件可能包含公司的商业机密、客户数据、财务信息、研发成果等重要资料&#xff0c;如果泄露给竞争对手、黑客或其他恶意人员&#xff0c;可能会对…

未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。

offiice64位的按装名字短的&#xff0c;office32位的安装名字长的 安装32位的AccessDatabaseEngine.exe&#xff0c;如果使用64位office点击安装32位access时提示无法安装&#xff0c;此时需要&#xff1a; 1.WINR打开运行&#xff0c;输入CMD&#xff0c;进入安装包文件夹 …

AHD模拟高清方案汇总及国产替代方案

由于模拟高清方案对比LVDS数字高清方案在降本、远距离传输的优势明显&#xff0c;及实现方案相对简单&#xff0c;模拟相机一直在车载和安防监控产品上有着较重要的市场地位。伴随着ZM贸易战和境外疫情影响愈来愈趋于严重化&#xff0c;原有外来品牌公司模拟高清方案在产品交期…

LeetCode 75 第五题(345)反转字符串中的元音字母

题目: 示例: 分析: 给一个字符串,将里面的元音字母反转,并且保持非元音字母不变(包括顺序). 字符串反转类型的题,我们都可以使用双指针来解决:定义首尾指针,分别向中间靠拢,直到首尾指针都指向了元音字母,然后交换首尾指针所指的字母,如此不会影响到非元音字母,同时也将元音字…

【4】Vite+Vue3左右容器中相同属性的元素内容自动对齐

在当今前端开发的领域里&#xff0c;快速、高效的项目构建工具以及使用最新技术栈是非常关键的。ViteVue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。 作为下一代前端构建工具&#xff0c;Vite 在开发中的启动速度和热重载方面具有突…

【运维小知识】(四)——linux常用命令

运维专栏&#xff1a;运维小知识 目录 1.&#x1f341;&#x1f341;用mv命令修改文件名 2.&#x1f343;&#x1f343;创建及删除文件夹即文件夹下所有文件 3.&#x1f342;&#x1f342;移动文件夹并重命名 4.&#x1f33f;&#x1f33f;复制文件 5.&#x1f344;&#x…

Redis相关配置(3)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis相关配置1、units2、Include3、loadmodule 加载模块4、NET…

MySQL-多表设计-一对多

多表的设计-概述 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#xff1a; 一…

【PostgreSQL内核学习(二)—— 查询分析】

查询分析 查询处理查询分析查询处理与查询分析的关系查询分析执行流程Lex和YaccLex&#xff1a;Yacc&#xff1a;词法分析工具Lex语法分析工具Yacc使用Lex和Yacc的案例 词法和语法分析以SELECT语句为例讲解 PostgreSQL中查询语句如何被解析并生成分析树。 语义分析 声明&#x…

【Vue面试题系列】四

VNode有哪些属性&#xff1f; Vue内部定义的Vnode对象包含了以下属性&#xff1a; __v_isVNode: true&#xff0c;内部属性&#xff0c;有该属性表示为Vnode __v_skip: true&#xff0c;内部属性&#xff0c;表示跳过响应式转换&#xff0c;reactive转换时会根据此属性进行判断…

黑马B站视频JAVA部分的知识范围、学习步骤详解

文章目录 学习资源选择最后选择 JAVA的知识范围JDBCswing与JAVAFX JAVA的学习步骤1.右侧的部分:2 JAVA的高级但是必须要学的3 有一些要学&#xff08;部分&#xff09;4力扣 总结作业配套资源 学习资源选择 我从画面&#xff08;一定要看清代码&#xff09;声音&#xff08;清…

金融中的数学:概率分布(上)

概率分布是描述随机变量可能取值的概率的函数。它可以用来描述离散变量和连续变量的概率分布。对于离散变量的概率分布&#xff0c;我们称其为离散概率分布。对于连续变量的概率分布&#xff0c;我们称其为连续概率分布。本文主要介绍离散型概率分布。 &#xff11;.离散型均匀…