监听器Listener详解

1、Listener

  • 是由Java编写的WEB组件,主要完成对内置对象状态的变化 (创建、销毁)和属性的变化 进行监听,做进一步的处理
  • 作用:主要对session和application内置对象监听。

2、对application监听


package cn.mldn.lxh.listener ;
import javax.servlet.* ;public class ServletContextDemoimplements ServletContextListener,ServletContextAttributeListener
{private ServletContext application = null ;// 实现方法public void contextInitialized(ServletContextEvent sce){this.application = sce.getServletContext() ;System.out.println("** 上下文初始化 ...") ;System.out.println("** 当前虚拟目录的绝对路径:"+this.application.getRealPath("/")) ;}public void contextDestroyed(ServletContextEvent sce){System.out.println("** 上下文销毁 ...") ;}public void attributeAdded(ServletContextAttributeEvent scab){System.out.println("** 增加属性:"+scab.getName()+" --> "+scab.getValue()) ;}public void attributeRemoved(ServletContextAttributeEvent scab){System.out.println("** 删除属性:"+scab.getName()+" --> "+scab.getValue()) ;}public void attributeReplaced(ServletContextAttributeEvent scab){System.out.println("** 替换属性:"+scab.getName()+" --> "+scab.getValue()) ;}
};/*<listener><listener-class>cn.mldn.lxh.listener.ServletContextDemo</listener-class></listener>
*/

1、语法

  • 是WEB组件,一定要有包声明 package cn.mldn.lxh.listener ;
  • 包导入 javax.servlet
  • 实现接口 ServletContextListener ,ServletContextAttributeListener
  • 实现接口的方法

2、实现方法

实现的两个接口,一个是为了实现对application状态监听的方法,一个是为了实现对applciation属性的变化监听的方法。如下:

  • 对applicaiton的状态做监听 implements ServletContextListener ,实现两个方法:

public void contextInitialized(ServletContextEvent sce);

tomcat一启动,先创建出监听器,对application的创建和销毁做监听。当application一创建,被监听器监听到,就调用contextInitialized()方法;

public void contextDestroyed(ServletContextEvent sce);
当application一销毁,监听器就会监听到applicaiton销毁,调用contextDestoryed();

  • 对applicaiton里属性的变化做监听 , implements ServletContextAttributeListener
public void attributeAdded(ServletContextAttributeEvent scab)public void attributeRemoved(ServletContextAttributeEvent scab)public void attributeReplaced(ServletContextAttributeEvent scab)

通过实现ServletContextAttributeListener 的三个方法,对applcation的属性变化做监听。注意:监听到的都是已经完成的变化 。比如往application里设值属性、删除属性、替换属性值等,这些都会被监听器监听到。可以通过方法获得增加的属性名和属性值,获得删除的属性名和属性值,获得替换的属性名和替换前的属性值(是被替换的,而不是替换后的值)

3、Tomcat一启动,创建了哪些内置对象?

  • tomcat一启动,首先会创建监听器,去监听内置对象的状态和属性变化。
  • 然后会创建Config对象,来收集配置文件中的初始参数,一共有会创建两个Config对象,分别是封装Servlet初始参数的ServletConfig,封装Filter初始参数的FilterConfig。
  • 然后会创建applicaiton对象
  • 然后创建Filter
  • 如果配了loadonstartup,就再创建servlet。

3、对session做监听


package cn.mldn.lxh.listener ;import javax.servlet.http.* ;public class HttpSessionDemo implements HttpSessionListener,HttpSessionAttributeListener
{private HttpSession session ;// 实现方法public void sessionCreated(HttpSessionEvent se){this.session = se.getSession() ;System.out.println("** Session 创建 ....") ;System.out.println("** SessionID --> "+this.session.getId()) ;}public void sessionDestroyed(HttpSessionEvent se){System.out.println("** Session 销毁 ....") ;}public void attributeAdded(HttpSessionBindingEvent se){System.out.println("** Session 增加属性:"+se.getName()+" --> "+se.getValue()) ;System.out.println("** 获得Session "+se.getSession().getId()) ;}public void attributeRemoved(HttpSessionBindingEvent se){System.out.println("** Session 删除属性:"+se.getName()+" --> "+se.getValue()) ;}public void attributeReplaced(HttpSessionBindingEvent se){System.out.println("** Session 替换属性:"+se.getName()+" --> "+se.getValue()) ;}
};
/*<listener><listener-class>cn.mldn.lxh.listener.HttpSessionDemo</listener-class></listener>
*/
  • 包声明
  • 包导入
  • 类声明,实现 HttpSessionListener接口,实现对状态监听的方法
  • 实现HttpSessionAttributeListener接口,实现对属性变化监听的方法

什么时候创建session?

我们可以通过public void sessionCreated(HttpSessionEvent se) 来监听session的创建

  • 访问服务器不会
  • 访问静态组件不会(html)
  • 只有访问动态组件(jsp),才会创建请求—第一次发送请求

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

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

相关文章

AcWing 算法基础课二 数据结构 链表 栈 队列 并查集 哈希表

单链表. AcWing. 826.单链表 import java.util.Scanner; public class Main{static int[] e new int[100010];//结点i的值static int[] ne new int[100010];//结点i的next指针static int idx,head;//head是头结点&#xff0c;idx存当前已经用到了哪个点public static void i…

【简化程序设计】C++STL“容器适配器“之栈和队列

【STL】容器适配器之栈和队列 stack的介绍和使用stack的介绍stack的使用stack的模拟实现 queue的介绍和使用queue的介绍queue的使用queue的模拟实现 priority_queue的介绍和使用priority_queue的介绍priority_queue的使用priority_queue的模拟实现 容器适配器什么是容器适配器&…

Vision Transformer (ViT):图像分块、图像块嵌入、类别标记、QKV矩阵与自注意力机制的解析

作者:CSDN @ _养乐多_ 本文将介绍Vision Transformers (ViT)中的关键点。包括图像分块(Image Patching)、图像块嵌入(Patch Embedding)、类别标记、(class_token)、QKV矩阵计算过程、余弦相似度(cosine similarity)、Softmax、自注意力机制等概念。主要介绍QKV矩阵…

C# XML 的读写以及和JSON对比

通过我们进行跨平台传输&#xff0c;我们需要把某一个平台特有的数据类型转化为一种通用的数据类型序列化和反序列化 通用形式有两种&#xff1a; 《1》JSON&#xff1a;是一种以键值形式组成 《2》XML&#xff1a;可扩展标记语言 XML文件格式要求&#xff1a; 《1》头部需要有…

基于x-scan扫描线的3D模型渲染算法

基于x-scan算法实现的z-buffer染色。c#语言&#xff0c;.net core framework 3.1运行。 模型是读取3D Max的obj模型。 x-scan算法实现&#xff1a; public List<Vertex3> xscan() {List<Vertex3> results new List<Vertex3>();SurfaceFormula formula g…

NFS、FTP、SMB、WebDav、DLNA协议区别

文章目录 NFSFTP/SFTP/SCPSMB/SambaWebDAVDLNA总结 随着智能化互联时代的来临&#xff0c;家中的智能设备越来越多&#xff1a;电视机、平板、游戏主机、电脑、手机等遍及家中各个角落&#xff0c;同时设备之间共享数据的需求变的越来越强烈。比如同步、备份手机上的照片和视频…

代码随想录Day53动态规划part14|1143.最长公共子序列|1035.不相交的线|53. 最大子序和 动态规划

1143.最长公共子序列 也不考虑顺序&#xff0c;元素之间可以不连续和718很相似&#xff0c;只不过这题要累加不连续的情况 1035.不相交的线 套上一题的程序可以通过&#xff0c;但是实际没有特别理解 53. 最大子序和 动态规划 之前用贪心做的&#xff0c;一旦sum<0&…

springboot log4j2日志 配置路径

一、log4j2 日志由xml配置&#xff0c;如果想改日志路径&#xff0c; 没办法和application.prop 文件读取参数 处理解决办法 二、1、默认解决办法 xml配置死路径&#xff0c;且测试与生产保持一致 <?xml version"1.0" encoding"UTF-8"?> <!…

从使用回溯分割字符串的技巧到前向搜索

题目 131. 分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 答案&#xff1a; class Solution {boolean[][] f;List<List<String>>…

【多线程中的线程安全问题】线程互斥

1 &#x1f351;线程间的互斥相关背景概念&#x1f351; 先来看看一些基本概念&#xff1a; 1️⃣临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源。2️⃣临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。3️⃣互斥&…

js 下载url返回的excel数据,并解析为json

XLSX GitHub地址&#xff1a;https://github.com/SheetJS/sheetjs/blob/github/dist/xlsx.full.min.js 需要先引入&#xff1a;XLSX.full.min.js // 下载文件的请求 fetch(downloadFileUrl).then(response > {return rsp.blob() }).then(data > {let reader new FileR…

【密码学】三、AES

AES 1、AES产生2、数学基础2.1有限域GF(2^8^)2.1.1加法运算2.1.2乘法运算2.1.3x乘运算2.1.4系数在GF(2^8^)上的多项式 3、AES算法描述3.1字节代换3.2行移位3.3列混合3.4轮密钥加3.5密钥扩展 1、AES产生 征集AES算法的活动&#xff0c;目的是确定一个非保密的、公开的、全球免费…

HCIP——重发布及路由策略实验

重发布及路由策略实验 一、实验拓扑二、实验要求三、实验思路三、实验步骤1、配置接口IP地址以及环回地址2、配置动态路由协议3、重发布4、更改接口类型5、配置路由策略 一、实验拓扑 二、实验要求 1、使用双点双向重发布2、所有路由器进行最佳选路3、存在备份路径&#xff0c…

软考05根据内存区域大小计算芯片数量

文章目录 前言一、原题二、解题思路1.计算内存区域的大小2.计算每个存储器芯片的容量3.计算芯片数量 总结 前言 从网上看题答案是有了&#xff0c;但是不知道具体的计算过程就很难受&#xff0c;不然下次还是不会&#xff0c;只能自己梳理了 一、原题 二、解题思路 1.计算内存…

Android开发之Fragment动态添加与管理

文章目录 主界面布局资源两个工具Fragment主程序 主界面布局资源 在activity_main.xml中&#xff0c;声明两个按钮备用&#xff0c;再加入一个帧布局&#xff0c;待会儿用来展示Fragment。 <?xml version"1.0" encoding"utf-8"?> <LinearLayo…

手机的python怎么运行文件,python在手机上怎么运行

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;手机上的python怎么运行程序&#xff0c;手机的python怎么运行文件&#xff0c;今天让我们一起来看看吧&#xff01; 1、python程序怎么在手机上运行 python语言应用很广泛&#xff0c;自己也很喜欢使用它&#xff0c;其…

iOS - 检测项目中无用类和无用图片

一、无引用图片检测 LSUnusedResources 安装插件 LSUnusedResources &#xff0c;用【My Mac】模拟器运行,如下图&#xff1a; Project Path 就是项目所在的路径&#xff0c;然后点击右下角 Search按钮&#xff0c;就可以看到被搜索出来的图片资源。 注意&#xff1a;这里被搜…

springboot 序列化相关问题汇总(持续更新...)

一、序列化问题 没有过多的性能需求&#xff0c;建议使用spring内置的jackjson&#xff0c;安全上更有保障 &#xff08;1&#xff09;返回数据 返回空字段 /*** 处理空字段* param builder* return*/Beanpublic ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilde…

Lambda 表达式的作用域

在Lambda表达式中访问外层作用域和旧版本的匿名对象中的方式类似。你可以直接访问标记了final的外层局部变量&#xff0c;或者实例的字段以及静态变量。 Lambda表达式不会从超类&#xff08;supertype&#xff09;中继承任何变量名&#xff0c;也不会引入一个新的作用域。Lambd…

路由器(第二十五课)

路由器的深入学习 一、路由 1、路由 1) 什么是路由:路由就是数据包从一个网络到另外一外网络的过程 2)支持路由功能的设备:路由器、三层交换机、防火墙 3 路由器转发数据包的依据: -每一台路由器都维护着一张路由表 -路由器是依靠这张路由表来转发数据的 -这张路由表就…