[Java]监听器(Listener)

过滤器(Filter)icon-default.png?t=N3I4https://blog.csdn.net/m0_71229255/article/details/130246404?spm=1001.2014.3001.5501

一 : Listener监听器简述

监听器就是监听某个对象的的状态变化的组件

监听器的相关概念:

  • 事件源:
    被监听的对象 ----- 三个域对象 request session servletContext

  • 监听器 :
    监听事件源对象的状态的变化都会触发监听器

  • 注册监听器 :
    将监听器与事件源进行绑定

  • 响应行为 :
    监听器监听到事件源的状态变化时 所涉及的功能代码

二 : 监听器的种类

  • 按照被监听的对象划分:ServletRequest域 HttpSession域 ​ServletContext域
  • 监听的内容分:监听域对象的创建与销毁的 监听域对象的属性变​化的
...................................ServletContext域HttpSession域ServletRequest域
域对象的创建于销毁servletContextListenerHttpSessionListenerServletRequestListener
域对象内的属性的变化ServletContextAttributeListenerHttpSessionAttributeListenerServletRequestAttributeListener

三 : 监听三大域对象的创建与销毁的监听器

( 1 )监听ServletContext域的创建与销毁的监听器ServletContextListener

监听编写步骤 :

① : 编写一个监听器类去实现监听器接口

public class MyServletContextListener implements ServletContextListener

② : 覆盖监听器的方法

@Override
    public void contextInitialized(ServletContextEvent sce) {
    System.out.println("context创建了....");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("context销毁了");
    }

③ : 在web.xml中进行配置

<listener>
    <listener-class>com.TianTian.atrribute.MyServletContextAttributeListener</listener-class>
  </listener>

ServletContextListener监听器的主要作用

① : 初始化的工作 ,初始化对象,初始化数据,加载数据驱动,连接池的初始化
② : 加载一下初始化的配置文件,如Spring的配置文件
③ : 任务调度---定时器---Timer/TimerTask

    Timer timer = new Timer();
                //task:任务  firstTime:第一次执行时间  period:间隔执行时间
                //timer.scheduleAtFixedRate(task, firstTime, period);
                
                String currentTime = "2018-10-11 18:11:00";
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                Date parse = null;
                try {
                    parse = format.parse(currentTime);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                timer.scheduleAtFixedRate(new TimerTask() {
                    @Override
                    public void run() {
                        System.out.println("do something.....");
                    }
                } , parse, 24*60*60*1000);

( 2 )监听HttpSession域的创建与销毁的监听器HttpSessionListener

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MySessionListener implements HttpSessionListener{

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("sessionId : " + se.getSession().getId());
        
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        
    }

}

( 3 )监听ServletRequest域创建与销毁的监听器ServletRequestListener

public class MyServletRequestListener implements ServletRequestListener{

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {

        System.out.println("销毁");
    }
    @Override
    public void requestInitialized(ServletRequestEvent sre) {

        System.out.println("创建");
    }
}

四 : 监听三大域对象的属性变化的

( 1 )域对象的通用方法

  • setAttribute(name,value) 触发添加属性/修改属性的监听器的方法

  • getAttribute(name) 触发获取属性的监听方法

  • removeAttribute(name) 触发删除属性的监听器的方法

( 2 )ServletContextAttributeLisener监听器

public class MyServletContextAttributeListener implements ServletContextAttributeListener{

    @Override
    public void attributeAdded(ServletContextAttributeEvent scab) {

        //放到域中的属性
        System.out.println("+++++监听放入");
        System.out.println(scab.getName());//放到域中的name
        System.out.println(scab.getValue());//放到域中的value
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scab) {
        System.out.println("+++++监听修改");

        System.out.println(scab.getName());//删除的域中的name
        System.out.println(scab.getValue());//删除的域中的value
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent scab) {
        System.out.println("+++++监听移除");

        System.out.println(scab.getName());//获得修改前的name
        System.out.println(scab.getValue());//获得修改前的value
        
    }

测试

public class TestMyServletContextAttributeListener extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        //存数据
        context.setAttribute("name", "美美");
        //改数据
        context.setAttribute("name", "可可");
        //删除数据
        
        context.removeAttribute("name");
    }   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);
    }
}

(3) HttpSessionAttributeListener监听器(同上)

(4) ServletRequestAriibuteListenr监听器(同上)

五 : 对象感知监听器

即将要被绑定到Session中的对象有几种状态

  • 绑定状态 : 就一个对象被放到session域中
  • 解绑状态 : 被绑定的对象从session域中移除了
  • 钝化状态 : 是将session内存中的对象持久化( 序列化)到磁盘
  • 活化状态 : 就是将磁盘上的对象再次恢复到session内存中

(1) 绑定与解绑的监听器HttpSessionBindingListener

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class Person implements HttpSessionBindingListener{
    private String id;
    private String name;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    //绑定
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("person被绑定了");
                Person per = (Person)event.getValue();
        System.out.println(per.getName());
    }
    @Override
    //解除绑定
    public void valueUnbound(HttpSessionBindingEvent event) {

        System.out.println("person被解绑了");

    }
}

测试

public class TestPersonBindingServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    HttpSession session = request.getSession();
            //将person对象绑到session中
            Person p = new Person();
            p.setId("100");
            p.setName("思思");
            session.setAttribute("person", p);
            //将person对象从session中解绑
            session.removeAttribute("person");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
person被绑定了
思思
person被解绑了

(2) 钝化与活化的监听器HttpSessionActivationListener

可以通过配置文件,指定对象钝化时间---对象多长时间不用被敦化
在META-INF下创建一个context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
   <!-- maxIdleSwap:session中的对象多长时间不使用就钝化 -->
   <!-- directory:钝化后的对象的文件写到磁盘的哪个目录下 配置钝化的对象文件在 work/catalina/localhost/钝化文件 -->
   <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
       <Store className="org.apache.catalina.session.FileStore" directory="tiantian" />
   </Manager>
</Context>

创建customer类

public class Customer implements HttpSessionActivationListener,Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String id;
    private String name;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        //钝化
        System.out.println("customer被顿化了");
    }
    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        //激活
        System.out.println("customer被活化了");
    }   
}

测试

ublic class TestCustomerServlet1 extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        Customer customer = new Customer();
        customer.setId("200");
        customer.setName("狗狗");
        session.setAttribute("customer", customer);
        System.out.println("customer被放到session域中了");
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
}

活化取出

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //从session域中获得customer
                HttpSession session = request.getSession();
                Customer customer = (Customer) session.getAttribute("customer");
                System.out.println(customer.getName());
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(补)4.13每日一题

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 题目连接&#xff1a;https://leetcode.cn/problems/longest-substring-without-repeating-characters/ 解题 开始我把这个题目想简单了&#xff0c;我想的是输入一个字符串&#xff0c;从第一…

【系统集成项目管理工程师】项目整体管理

&#x1f4a5;十大知识领域&#xff1a;项目整体管理 项目整体管理包括以下 6 个过程: 制定项目章程定项目管理计划指导与管理项目工作监控项目工作实施整体变更控制结束项目或阶段过程 一、制定项目章程 制定项目章程。编写一份正式文件的过程&#xff0c;这份文件就是项目章程…

pushmall推贴共享电商2023年4月计划

Pushmall推贴共享电商2023年4月计划 2023年 二月份优化完成 1、商圈套餐卡&#xff1a;商品、优惠券、活动优化&#xff1b; 2、会员预充值一卡通&#xff1a;指定商家会员卡充值优惠&#xff1b; 3、商家海报&#xff1a;店铺海报、商品海报、商圈卡海报优化。 4、首页重新布…

MLCC周期性分析:当前时点处于周期反转前夜

MLCC是电子工业大米&#xff0c;供需波动导致行业成周期性波动 MLCC是最常用的被动元器件之一&#xff0c;终端下游涵盖消费电子、家电、汽车、通信等。在5g、汽车电子、智能硬件的推动下&#xff0c;MLCC行业需求稳步增长。供给端来看&#xff0c;中国大陆厂商合计市场份额不…

数据要素化全面提速,数据复制将迎来春天?

数据复制市场将迎来真正的春天&#xff1f; 目前看的确如此。近日&#xff0c;国家发改委密集发文&#xff0c;从产权、分配、流通、安全等多个角度解读“数据二十条”&#xff08; 《中共中央国务院关于构建数据基础制度更好发挥数据要素作用的意见》&#xff0c;简称“数据二…

Bots攻击威胁石油石化企业 瑞数动态安全实现从“人防”到“技防”

近日&#xff0c;中国石油石化企业信息技术交流大会暨油气产业数字化转型高峰论坛在京召开。本届大会由中国石油学会、中国石油、中国石化、中国海油、国家管网、国家能源、中国中化、中国航油、延长石油、中国地质调查局等单位共同主办。 作为我国石油石化行业的盛会&#xf…

什么是设计模式?

目录 常见的设计模式 创建型模式 结构型模式 行为型模式 总结 设计模式&#xff08;Design Pattern&#xff09;是一些被认为是最佳实践的面向对象编程经验的总结&#xff0c;它们提供了解决特定场景问题的可复用方案。设计模式可以加速开发过程并提高代码质量和可读性&…

GFD233A 3BHE022294R0103

GFD233A 3BHE022294R0103 ABB KUC321AE PLC模块 HIEE300698R0001 KU C321 AE01 ABB KUC711 3BHB004661R0001 高压变频模块 KUC711AE ABB KUC755AE105 3BHB005243R0105 驱动控制系统模块 KUC755 ABB KUC755AE106 3BH005243R006 控制系统模块 KU C755 AE 106 ABB LDGRB-01 3BSE01…

【C语言】基础语法1:变量和数据类型

下一篇&#xff1a;运算符和表达式 ❤️‍&#x1f525;前情提要❤️‍&#x1f525;   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图&#xff08;结束换链接&#xff09;并免费提供给大家学习&#xff0c;希望大家纠错指正。本专栏将以基础出发…

知乎版ChatGPT「知海图AI」加入国产大模型乱斗,称效果与GPT-4持平

“2023知乎发现大会”上&#xff0c;知乎创始人、董事长兼CEO周源和知乎合作人、CTO李大海共同宣布了知乎与面壁智能联合发布“知海图AI”中文大模型。 周源据介绍&#xff0c;知乎与面壁智能达成深度合作&#xff0c;共同开发中文大模型产品并推进应用落地。目前&#xff0c;知…

vue 报错 error:03000086:digital envelope routines::initialization error解决方案

目录 1. 引言: 2. 更换版本出现问题: 3. 出现原因: 4. 解决办法: -> 4. 1 删了 再换回16.15版本 -> 4.2 指令修改(好使) ---> 4.2.1效果如图 -> 4.3 其他指令就别试了 压根不好使 1. 引言: npm出现问题 , 卸载后 装了个新node 18.15版本 2. 更换版本…

JavaScript【三】JavaScript中的数组

文章目录 &#x1f31f;前言&#x1f31f;数组&#x1f31f;声明&#xff1a;&#x1f31f; 隐式创建&#xff1a;&#x1f31f; 实例化构造函数&#xff1a; &#x1f31f; 注意&#xff1a;一个值为数组的长度。&#x1f31f; 访问&#xff1a;&#x1f31f; 遍历&#xff1a…

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(Eureka、Ribbon)

微服务技术栈导学 微服务技术是分布式架构&#xff08;把服务做拆分&#xff09;的一种 而springcloud仅仅是解决了拆分时的微服务治理的问题&#xff0c;其他更复杂的问题并没有给出解决方案 一个完整的微服务技术要包含的不仅仅是springcloud 微服务技术栈 包括什么 …

深度学习中的各种不变性

不变性 平移不变性&#xff08;Translation Invariance&#xff09;旋转不变性&#xff08;Ratation Invariance&#xff09;尺度不变性&#xff08;Size Invariance&#xff09;光照不变性&#xff08;Illumination Invariance&#xff09;仿射不变性&#xff08;Affine Invar…

springcloud2.1.0整合seata1.5.2+nacos2.10(附源码)

springcloud2.1.0整合seata1.5.2nacos2.10&#xff08;附源码&#xff09; 1.创建springboot2.2.2springcloud2.1.0的maven父子工程如下&#xff0c;不过多描述&#xff1a; 搭建过程中也出现很多问题&#xff0c;主要包括&#xff1a; 1.seataServer.properties配置文件的组…

第二部分——长难句——第一章——并列句

conjunction(and,but,if,when(while)) 想把两个句子&#xff08;多件事&#xff09;连在一块&#xff0c;就必须加上连词。 所以长难句到底是啥&#xff1f; 所以长难句&#xff08;直白表达&#xff0c;并不是语法表述&#xff09;就是几个简单句多家上几个连接词就齐活了&am…

【vue2】使用vue-admin-template动态添加路由的思路/addRoutes的使用

&#x1f609;博主&#xff1a;初映CY的前说(前端领域) ,&#x1f4d2;本文核心&#xff1a;用原生js实现省市区联动 【前言】在通用的后台管理项目的开发中&#xff0c;不仅仅是会涉及到对表单数据等的增删改查操作还会涉及到一些关于权限管理的问题。我们将基于一个RBAC的思维…

C++STL大全----容器篇(上)

&#xff08;一&#xff09;概念 STL&#xff0c;英文全称 standard template library&#xff0c;中文可译为标准模板库或者泛型库&#xff0c;其包含有大量的模板类和模板函数&#xff0c;是 C 提供的一个基础模板的集合&#xff0c;用于完成诸如输入/输出、数学计算等功能。…

2023-04-21 学习记录--C/C++-实现升序降序(冒泡法/沉底法)

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、冒泡法(沉底法) —— 升序 ⭐️ &#xff08;一&#xff09;、思路 从左到右&#xff1a; 1、第一个与第二个比较&#xff0…

RK3568平台开发系列讲解(调试篇)IS_ERR函数的使用

🚀返回专栏总目录 文章目录 一、IS_ERR函数用法二、IS_ERR函数三、内核错误码沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 IS_ERR 函数的使用。 一、IS_ERR函数用法 先看下用法: 二、IS_ERR函数 对于任何一个指针来说,必然存在三种情况: 一种是合…