[Java]监听器(Listener)

news2024/12/24 20:22:51

过滤器(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);
    }

}

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

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

相关文章

Jenkins安装maven integration plugin以及jenkins安装allure插件失败的解决方法

这里写目录标题 一、Jenkins安装maven integration plugin失败解决方法&#xff08;1&#xff09;修改系统时间&#xff08;2&#xff09;查看当前操作系统时间&#xff08;3&#xff09;防止出错先执行命令&#xff08;4&#xff09;修改系统时间&#xff08;5&#xff09;写入…

Cocos Creator 源码解读:引擎启动与主循环

前言 本文基于 Cocos Creator 2.4.3 撰写。 Ready? 不知道你有没有想过&#xff0c;假如把游戏世界比作一辆汽车&#xff0c;那么这辆“汽车”是如何启动&#xff0c;又是如何持续运转的呢&#xff1f; 如题&#xff0c;本文的内容主要为 Cocos Creator 引擎的启动流程和主…

C# | 上位机开发新手指南(十一)压缩算法

上位机开发新手指南&#xff08;十一&#xff09;压缩算法 文章目录 上位机开发新手指南&#xff08;十一&#xff09;压缩算法前言压缩算法的分类从数据来源角度分类流式压缩块压缩 从是否需要建立字典角度分类字典压缩无字典压缩 流式压缩与块压缩流式压缩的优势与劣势优势劣…

各种开源协议介绍

世界上的开源许可证&#xff08;Open Source License&#xff09;大概有上百种&#xff0c;今天我们来介绍下几种我们常见的开源协议。大致有GPL、BSD、MIT、Mozilla、Apache和LGPL等。 Apache License Apache License&#xff08;Apache许可证&#xff09;&#xff0c;是Apac…

O2OA (翱途) 平台 V8.0 即将亮相

亲爱的小伙伴们&#xff0c;O2OA (翱途) 平台开发团队经过几个月的持续努力&#xff0c;实现功能的新增、优化以及问题的修复。2023 年度 V8.0 版本将于近期正式发布。届时我们将会用文档或者视频的方式详细来介绍新增的功能和优化的亮点&#xff0c;欢迎大家一起来体验&#x…

在Vue中将单独一张图片设为背景图并充满整个屏幕

将单独一张图片设为背景图并充满整个屏幕 代码如下(在主div中添加样式) background: url("../xx/images/图片名字.jpg");//这里的地址是用你项目中图片所在的路径为准background-repeat: no-repeat;//将图片样式不重复background-size: 100% 100%; //设置图片大小po…

YOLOv8 更换主干网络之 PP-LCNet

《PP-LCNet: A Lightweight CPU Convlutional Neural Network》 论文地址:https://arxiv.org/abs/2109.15099 代码地址:https://github.com/ngnquan/PP-LCNet 我们提出了一种基于MKLDNN加速策略的轻量级CPU网络,名为PP LCNet,它提高了轻量级模型在多个任务上的性能。本文列…

13、DRF实战总结:重写DRF的to_representation和to_internal_value方法的作用详解(附源码)

DRF的to_representation和to_internal_value是序列化和反序列化过程中最核心的方法&#xff0c;它们分别用于将数据对象转换成字典&#xff0c;和将字典转换成数据对象。 DRF所有序列化器类都继承了BaseSerializer类&#xff0c;通过重写该类的to_representation()和to_intern…

Python ---->> PiP 的重要性

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 关于Python基本语法学习---->可以参考我的这篇博客&#xff1a;《我在VScode学Python》 Python是一种跨平台的计算机程序设计语言&#xff0c;是一个高层次的结合了解释性、编译性、互动性和面向对象的语…

linux安装oracle

我系统为centos7&#xff0c;最小化安装的&#xff0c;需调用xshell图行化界面安装oracle** 前提准备 1、安装Xmanager&#xff0c;配置x11转发。 2、oracle下载地址 https://download.oracle.com 3、关闭selinux 临时关闭&#xff1a; setenforce 0 永久关闭 vim /et…

Servlet 和 Servlet API 简述

目录 1、什么是 Servlet&#xff1f; 2、Servlet API 有哪些内容&#xff1f; 3、Servlet 与 Tomcat 的区别和联系 4、常用的Web服务器有哪些&#xff1f; 5、拓展&#xff1a;Undertow 和Tomcat 的区别 1、什么是 Servlet&#xff1f; Servlet 是 Java Web 应用程序中的一…

使用 node 管理器管理 monorepo

使用 node 管理器管理 monorepo 不包含工具的使用&#xff0c;一方面因为我没用到过工具&#xff0c;另外一方面看了一下 Lerna&#xff0c;说 Learna 底层还是用到了 yarn 去进行管理&#xff0c;二者并不冲突&#xff0c;所以打算先学习一下基础再说。 顾名思义&#xff0c…

800V高压系统的驱动力和系统架构分析——为什么是800V高压系统,及其挑战?

摘要&#xff1a; 800V高压系统下汽车系统架构会出现哪些变化&#xff1f; 过去一年是新能源汽车市场爆发的一年&#xff0c;据中汽协数据&#xff0c;2021年新能源汽车销售352万辆&#xff0c;同比大幅增长157.5%。新能源汽车技术发展迅速&#xff0c;畅销车辆在动力性能、智…

IS210AEBIH3BED包含逻辑集成电路、存储器集成电路、专用集成电路

IS210AEBIH3BED包含逻辑集成电路、存储器集成电路、专用集成电路 什么是集成电路测试仪   集成电路测试仪是对集成电路进行测试的专用仪器设备。集成电路测试是保证集成电路性能、质量的关键手段之一。集成电路测试技术是发展集成电路产业的三大支撑技术之一&#xff0c;因此…

ELK部署

ELK部署 1. 整体部署规划1.1 服务器规划1.2 关闭防火墙&#xff0c;同步时间 2. ElasticSearch集群部署2.1 环境准备2.2 部署 Elasticsearch 软件 3. ELK Logstash 部署3.1 安装Logstash,httpd,java3.2 测试 Logstash与elasticsearch功能是否能做对接3.3 定义 logstash配置文件…

ES-IK分词器的概念和基本使用

文章目录 一、ES-IK分词器1.1 初识ES-IK分词器1.2 IK分词器-拓展和停用1.3 索引库1.3.1 mapping属性1.3.2 索引库的CRUD基本语法&#xff1a; 1.3.3 文档的DSL 一、ES-IK分词器 1.1 初识ES-IK分词器 ES IK分词器是一种基于中文文本的分词器&#xff0c;它是Elasticsearch中文分…

DJ4-4 网际协议:因特网中的转发和编址

目录 一、因特网中的网络层协议 二、IP 数据报格式&#xff08;IPv4&#xff09; 三、IP数据报分片和重组 1. 分片的概述 2. 分片的例子 四、IP 地址 1. IP 地址概述 2. IPv4 编址 3. IP 地址结构 4. 传统的 IP 地址分类 5. ABC 类地址 6. 特殊 IP 地址段 7. 特殊…

Mysql 截取字符串并将文本转换为数值

有一个需求, 需要在 字符串 20230410 中获取 月份(04), 然后变为 (4), 解决: SELECT cast(left(SUBSTRING(20230410, 5),2) as SIGNED); 用到的函数有 left(str, length) substring(str, pos)&#xff0c;即&#xff1a;substring(被截取字符串&#xff0c; 从第几位开始截…

Linux驱动之在Ubuntu下编译驱动模块——学习笔记(12)

为了方便驱动开发学习&#xff0c;了解一下在Ubuntu上进行驱动编译的流程。 一、下载对应的内核源码 首先要通过 uname -a查询一下自己的内核版本。 我这里下载的是 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.tar.gz 二、编译内核 &#xff08;1&a…

一起学 WebGL:复合矩阵

大家好&#xff0c;我是前端西瓜哥。之前讲了平移矩阵、旋转矩阵以及缩放矩阵&#xff0c;以及演示了在 WebGL 中的单独应用的效果。 这次我们看看同时进行多次矩阵变换的组合写法。 我们将会对一个三角形先平移&#xff0c;然后旋转。 矩阵乘法 简单过一下矩阵乘法的知识点…