JavaWeb 18.监听器

news2024/11/24 11:50:48

目录

 一、监听器概述

监听器的分类

按监听的对象划分

按监听的事件划分

二、监听器的六个主要接口

1.application监听器

2.session域监听器

3.request域监听器

三、session域的两个特殊监听器

1.session绑定监听器

2.钝化活化监听器

什么是钝化活化

如何配置钝化与活化

​编辑

如何监听钝化活化?


我们都会逐渐发现努力不一定有结果,但有时你还是得向前走,

都说要找方向,可你不去碰壁怎么知道在哪个路口应该转弯,大多坚持和努力都会被浪费,

或许绕了一个圈后发现当初只要自己坚持向前一步就能做好这件事,但你不绕这么一大圈就不会明白这些,

没什么好抱怨的,就像很多你突然明白的道理都有伏笔,只要你不放弃前行就行

                                                                                                                        —— 24.10.13

 一、监听器概述

监听器:专门用于对域对象身上发生的事件或状态改变进行监听和相应处理的对象

监听器是GOF设计模式中,观察者模式的典型案例;

监听器使用的感受类似于JavaScript中的事件,被观察的对象发生某些情况时,自动触发代码的执行;

监听器并不监听web项目中的所有组件,仅仅是对三大域对象做相关的事件监听;


监听器的分类

web中定义八个监听器接口作为监听器的规范,这八个接口按照不同的标准可以形成不同的分类

按监听的对象划分

① application域监听器        

ServletContextListener

ServletContextAttributeListener

② session域监听器         

ServletContextListener

ServletContextAttributeListener

③ reguest域监听器        

ServletRequestListener

ServletRequestAttributeListener

按监听的事件划分

① 域对象的创建和销毁监听器        

ServletContextListener

HttpSessionListener

ServletRequestListener

② 域对象数据增删改事件监听器

ServletContextAtributeListener

HttpSessionAttributeListener

ServletRequestAtributeListener

③ 其他监听器

HttpSessionBindingListener

HttpSessionActivationListener


二、监听器的六个主要接口

1.application监听器

ServletContextListener:监听ServletContext对象的创建与销毁

contextInitialized(ServletContextEvent sce)          ServletContext创建时调用

contextDestroyed(ServletContextEvent sce)         ServletContext销毁时调用

 ServletContextEvent对象代表ServletContext对象上捕获到的事件,通过这个时间对象我们可以 获取到ServletContext对象

ServletContextAttributeListener: ServletContext中属性的添加、移除和修改

attributeAdded(ServletContextAttributeEvent scab)        向ServletContext中添加属性时调用 attributeRemoved(ServletContextAttributeEvent scab)   从ServletContext中移除属性时调用 attributeReplaced(ServletContextAttributeEvent scab)   当ServletContext中的属性被修改时调用

ServletContextAttributeEvent对象代表属性变化事件

        getName()                                获取修改或添加属性名

        getValue()                                 获取被修改或添加属性值

        getServletContext()                  获取ServletContext对象


2.session域监听器

HttpSessionListener:监听HttpSession对象的创建与销毁

sessionCreated(HttpSessionEvent hse)         HttpSession对象创建时调用

sessionDestroyed(HttpSessionEvent hse)        HttpSession对象销毁时调用

HttpSessionEvent对象代表从HttpSession对象上捕获到的事件,通过这个事件对象我们可以获取到触发事件的HttpSession对象

HttpSessionAttributeListener:监听HttpSession中属性的添加、移除和修改:

attributeAdded(HttpSessionBindingEvent se)                向HttpSession中添加属性时调用 attributeRemoved(HttpSessionBindingEvent se)           从HttpSession中移除属性时调用 attributeReplaced(HttpSessionBindingEvent se)           当HttpSession中的属性被修改时调用

HttpSessionBindingEvent对象代表属性变化事件

        getName()                  获取修改或添加属性名

        getValue()                   获取被修改或添加属性值

        getSession()                获取触发事件的HttpSession对象


3.request域监听器

ServletRequestListener监听ServletRequest对象的创建与销毁:

requestInitialized(ServletRequestEvent sre)                 ServletRequest对象创建时调用

requestDestroyed(ServletRequestEvent sre)                ServletRequest对象销毁时调用

ServletRequestAttributeListener 监听 ServletRequest中属性的添加、移除和修改:

attributeAdded(ServletRequestAttributeEvent srae)        向ServletRequest中添加属性时调用

attributeRemoved(ServletRequestAttributeEvent srae)   从ServletRequest中移除属性时调用

attributeReplaced(ServletRequestAttributeEvent srae)  当ServletRequest中属性修改时调用

 ServletRequestAttributeEvent对象代表属性变化事件

        getName()                                获取修改或添加属性名

        getValue()                                 获取被修改或添加属性值

        getServletRequest()                 获取触发事件ServletRequest对象


三、session域的两个特殊监听器

1.session绑定监听器

HttpSessionBindingListener 监听当前监听器对象在Session域中的增加与移除

valueBound(HttpSessionBindingEvent event)            该类的实例被放到Session域中时调用
valueUnbound(HttpSessionBindingEvent event)        该类的实例从Session中移除时调用

HttpSessionBindingEvent对象代表属性变化事件 

        getName()                                获取当前事件涉及属性名

        getValue()                                 获取当前事件涉及属性值

        getServletRequest()                 获取触发事件HttpSession对象


2.钝化活化监听器

HttpSessionActivationListener 监听某个对象在Session中的序列化与反序列化

sessionWillPassivate(HttpSessionEvent se)       该类实例和Session一起钝化硬盘时调用

sessionDidActivate(HttpSessionEvent se)             该类实例和Session一起活化内存时调用


什么是钝化活化

钝化与活化,本质上是session对象的序列化和反序列化

session对象在服务端是以对象的形式存储于内存的,session过多,服务器的内存不足;

一旦服务器发生重启,所有的session对象都将被清除,也就意味着session中存储的不同客户端的登录状态丢失;

为了分摊内存压力并且为了保证session重启不丢失,我们可以设置将session进行钝化处理;

在关闭服务器前或者到达了设定时间时,对session进行序列化到磁盘,这种情况叫做session的钝化

在服务器启动后或者再次获取某个session时,将磁盘上的session进行反序列化到内存,这种情况叫做session的活化:


如何配置钝化与活化

1.在web目录下,添加META-INF下创建Context.xml

2.文件中配置钝化

<?xml version="1.0" encoding="UTF-8" >
<Context>
    <Manager className="org.apache.catalina.session.PersistentManager" 
maxIdleSwap="1">
        <Store className="org.apache.catalina.session.FileStore" 
        directory="d:\mysession"></Store>
    </Manager>
</Context>

3.请求servletA,获得session,并存入数据,然后重启服务器

@WebServlet(urlPatterns = "/servletA",name = "servletA ame")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws 
ServletException, IOException {
        HttpSession session = req.getSession();
        // 添加数据
        session.setAttribute("k1","v1");
    }
 }

4.请求servletB获取session,获取重启前存入的数据

@WebServlet(urlPatterns = "/servletB", name = "servletBName")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws 
ServletException, IOException {
        HttpSession session = req.getSession();
        Object v1 = session.getAttribute("k1");
    System.out.println(v1);
   }
}

如何监听钝化活化?

1.定义监听器

import akarta.servlet.http.HttpSession;
import akarta.servlet.http.HttpSessionActivationListener;
import akarta.servlet.http.HttpSessionEvent;
import ava.io.Serializable;
public class ActivationListener implements HttpSessionActivationListener, 
Serializable {
    // 监听钝化
    @Override
    public void session illPassivate(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        System.out.println("session with JSESSIO ID "+ session.getId()+" will 
passivate");
    }
    // 监听活化
    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
    HttpSession session = se.getSession();
    System.out.println("session with JSESSIONID "+ session.getId()+" did 
activate");
    }
}

2.定义触发监听器的代码

@WebServlet(urlPatterns = "/servletA",name = "servletAName")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws 
ServletException, IOException {
        HttpSession session = re .getSession();
        // 添加数据
        session.setAttribute("k1","v1");
        // 添加钝化活化监听器
        session.setAttribute("activationListener",new ActivationListener());
    }
}

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

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

相关文章

高并发下的库存扣减技术

背景 针对库存操作&#xff0c;宗旨&#xff1a;绝不超卖&#xff08;存在资损、造成客诉、用户体验差&#xff09;、尽量避免少卖&#xff08;相对资损&#xff09;。 在明星直播、大促、秒杀等高并发场景下&#xff0c;数据库的性能会变得非常差&#xff0c;传统的分库分表…

【C++进阶专栏】:priority_queue(优先级队列)?仿函数?

文章目录 前言1、优先级队列的使用&#xff1f;2、仿函数&#xff1f;3、优先级队列用仿函数实现大/小堆变换&#xff1f; 前言 priority_queue&#xff1a;优先级队列&#xff0c;别看有一个队列的名字&#xff0c;但结构个队列完全不一样。队列是一种先进先出的结构特征&…

AttributeError: ‘str‘ Object Has No Attribute ‘x‘:字符串对象没有属性x的完美解决方法

AttributeError: str Object Has No Attribute x&#xff1a;字符串对象没有属性x的完美解决方法 &#x1f50d;&#x1f4a1; AttributeError: str Object Has No Attribute x&#xff1a;字符串对象没有属性x的完美解决方法 &#x1f50d;&#x1f4a1;摘要 &#x1f4d6;引言…

四、音频播放

一、相关逻辑 在登录代码中调用&#xff0c;资源加载代码&#xff0c;然后再资源加载代码中调用。 1、登陆方法中&#xff1a; 单例类音频调用自己的方法&#xff0c;然后传入配置代码中的常量 2、音频播放代码中&#xff1a; 首先设置为一个单例类&#xff0c;然后初始化一…

精益与数字化的融合:制造业的创新之路

回望过去&#xff0c;精益管理作为制造业的瑰宝&#xff0c;以其“消除浪费、持续改进、顾客至上”的核心理念&#xff0c;引领了无数企业走向成功。从丰田生产方式到全球范围内的广泛实践&#xff0c;精益管理不仅提升了生产效率&#xff0c;更重塑了企业的文化和价值观。它教…

【Python大语言模型系列】一文教你使用dify云版本开发一个简单的Agent(完整教程)

这是我的第365篇原创文章。 一、引言 智能助手&#xff08;Agent&#xff09;&#xff0c;利用大语言模型的推理能力&#xff0c;能够自主对复杂的人类任务进行目标规划、任务拆解、工具调用、过程迭代&#xff0c;并在没有人类干预的情况下完成任务。 本文我们将搭建一个旅行…

vt虚拟化怎么开启_各品牌主板及品牌机开启VT虚拟化教程

VT指的是CPU的虚拟化技术可以单CPU模拟多CPU并行&#xff0c;允许一个平台同时运行多个操作系统&#xff0c;并且应用程序都可以在相互独立的空间内运行而互不影响&#xff0c;从而显著提高计算机的工作效率。下面&#xff0c;小编给大家介绍电脑开启vt的操作步骤。 VT虚…

[LeetCode] 155. 最小栈

设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int get…

TiDB 监控组件之 Blackbox_exporter 运行原理

作者&#xff1a; TiDBerHailang 原文来源&#xff1a; https://tidb.net/blog/b269e96f 1. 介绍 本文介绍了 TiDB 集群监控组件Blackbox Exporter监控运行机制和配置方式。Blackbox Exporter是Prometheus官方提供的 Exporter&#xff0c;它能够通过多种协议对网络服务进行…

使用HTML、CSS和JavaScript创建滚动弹幕效果

使用HTML、CSS和JavaScript创建滚动弹幕效果 在现代网页设计中&#xff0c;滚动文本是一种常见的动态效果&#xff0c;可以吸引用户的注意力并增强交互体验。在这篇博客文章中&#xff0c;我们将详细介绍如何使用HTML、CSS和JavaScript实现滚动文本效果。 效果 步骤1&#xf…

【电商购物管理系统】Python+Django网页界面平台+商品管理+数据库

一、介绍 电商购物管理系统&#xff0c;本系统前端使用HTML、CSS、BootStrap等技术搭建前端界面&#xff0c;后端使用Django框架处理用户的逻辑请求。主要功能有&#xff1a; 管理员登录与管理&#xff1a;管理员可以登录后台&#xff0c;对用户和商品进行增删改查的操作。用…

使用mybatis查询数据库时,表有数据但是为空值null

前言 数据库有数据但是查出来都是空的 解决方法 这里写错了&#xff0c; resultType只能用在数据库字段和实体类字段一致的情况下&#xff0c;而数据库多单词通常用下划线隔开&#xff0c;不能映射到驼峰命名的实体类属性上&#xff0c;因此得使用一个ResultMap 1.定义映射映…

【C++】set/map(重点解析)

目录 一、关联式容器和序列式容器 二、C中的键值对——pair 1.概念 2.定义 3.构造pair 三.set 1.construct构造 2.iterator迭代器 3.insert插入 4.erase删除 5.find查找 6.lower_bound和upper_bound 7.count 四.multiset 五.map 1.insert 2.operator[] 一、…

Pygame实现音乐可视化

pip install pydub pip install ffmpeg pip install pyaudio 完整代码如下&#xff1a; import pygame,sys import random import numpy as np from random import randint import colorsys from pydub import AudioSegment import mathdef rnd_color(): #随机颜色h,s,l…

Python的reshape的用法和reshape(1,-1)、reshape(-1,1)

在创建DataFrame的时候常常使用reshape来更改数据的列数和行数。 reshape可以用于numpy库里的ndarray和array结构以及pandas库里面的DataFrame和Series结构。 reshape&#xff08;行&#xff0c;列&#xff09;可以根据指定的数值将数据转换为特定的行数和列数&#xff0c;这个…

用SAM2和Cutie模型目标追踪

一、数据集 视频&#xff1a;每个视频文件夹以图片帧的形式存储 box&#xff1a;给出每个视频第一帧要追踪的物体的box 二、将数据格式转换成SAM2所需要的格式 主要是将box转换成mask的格式&#xff0c;下面这个代码就是将box转换成mask的代码&#xff0c;具体转换原理如下…

深圳易图讯科技有限公司承建的厦门应急处突大队三维电子沙盘顺利通过专家验收

近日&#xff0c;深圳易图讯科技有限公司承建的厦门应急处突大队三维电子沙盘系统项目成功通过专家组的严格验收&#xff0c;标志着该系统在应急管理和处置突发事件方面的应用取得了重要突破。 验收过程中&#xff0c;专家组对三维电子沙盘系统的各项功能进行了全面而细致的测试…

第十六周:机器学习笔记

第十六周周报 摘要Abstratc一、机器学习1. Pointer Network&#xff08;指针网络&#xff09;2. 生成式对抗网络&#xff08;Generative Adversarial Networks | GAN&#xff09;——&#xff08;上&#xff09;2.1 Generator&#xff08;生成器&#xff09;2.2 Discriminator&…

Cef加载自定义本地资源

在Cef auto build下载cefCEF Automated Builds 我下载的是104&#xff0c;使用cefsimple工程。 例如&#xff1a;前端资源如下 通过http协议把前端资源加载出来。所有的资源都通过http://local.test.cn/xxx加载。 前端资源包括index.html、test.css、test.js index.html&am…

麒麟系统离线安装英伟达驱动

麒麟系统离线安装英伟达驱动 驱动相关程序下载下载显卡驱动下载CUDA-Toolkit下载cudnn 安装关闭自带图形界面禁用 Nouveau 驱动安装驱动安装CUDA-Toolkit安装cudnn 驱动相关程序下载 下载显卡驱动 进入显卡驱动查询页面&#xff0c;下载对应的显卡驱动&#xff0c;页面如下&a…