Listener(监听器)

文章目录

  • Listener和ServletContext
    • 1.0 ServletContext对象介绍
    • 1.1 Listener概述
    • 1.2 Listener快速入门
        • ① xml版本
        • ② 注解版本
    • 1.3 案例:模拟spring框架


在这里插入图片描述

Listener和ServletContext

补充:1.ServletContext 表示上下文对象,属于接口,代表整个web项目,可以使用方法获取当前web项目的所有文件的MIME类型2.之前学习能够共享数据的对象:1)request: 只能在一次请求一次响应中进行数据的共享 ===》请求转发2)session:只能在一次会话过程中,可以有多次请求和响应,3)ServletContext:只要项目存在就可以共享数据,多次会话,多次请求和响应都可以共享数据:操作整个项目的配置文件范围大小: ServletContext > session > request

1.0 ServletContext对象介绍

ServletContext对象:当tomcat服务器启动的时候,会为每个web项目创建一个唯一的ServletContext对象,该对象代表当前整个Web应用项目。该对象不仅封装了当前web应用的所有信息,而且实现了多个servlet的数据共享.在ServletContext中可以存放共享数据,ServletContext对象是真正的一个全局对象,凡是web容器中的Servlet都可以访问。

​ 在每个项目中可以有多个Servlet程序,每个Servlet程序都是独立的。当前这个项目的配置信息,就必须使用描述这个项目的ServletContext对象获取。

在这里插入图片描述

方法名描述
setAttribute(String name,Object object)向ServletContext中存数据
getAttribute(String name)从ServletContext中取数据
removeAttribute(name)从ServletContext中移除数据
String getRealPath(String path)返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)
getMimeType(fileName)获取服务器中文件类型.txt text/plain .html text/html

ServletContext对象,tomcat为每一个web项目单独创建的一个上下文(知上知下贯穿全文)对象。有如下功能:

1.可以在多个servlet之间共享数据

​ 存放:setAttribute()

​ 获得:getAttribute()

​ 删除:removeAttribute()

2.可以获得当前WEB项目中的指定资源(文件)

String path = getRealPath( String string);

需求1:如何获取上下文servletContext对象。

使用HttpServlet类的父类 GenericServlet 中的方法:getServletContext();

代码如下:

/*获取上下文ServletContext对象:使用HttpServlet类的父类 GenericServlet 中的方法:getServletContext();*/
@WebServlet("/servletContextDemoServlet")
public class ServletContextDemoServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取ServletContext类的对象ServletContext servletContext = getServletContext();}
}

需求2:如何获取服务器中每个文件的路径。例如,在当前项目下的web文件夹下放一个1.jpg的图片,获取其真实路径(绝对路径)。

@WebServlet("/servletContextDemoServlet")
public class ServletContextDemoServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext = getServletContext();//如何获取服务器中每个文件的路径。// 例如,在当前项目下的web文件夹下放一个1.jpg的图片,获取其真实路径(绝对路径)。String realPath = servletContext.getRealPath("/1.jpg");/*输出结果:realPath = 			F:\ideawork\jiuyeban2\heima60\heima03\out\artifacts\web_war_exploded\1.jpg说明:我们的项目在发布的时候会被打成一个war包,这个war包下的class文件会被放在tomcat下被运行。所以这里获取的真实路径是这个war包下的1.jpg所在的路径。*/System.out.println("realPath = " + realPath);}
}

说明:

获取结果:

realPath = 	''
说明:我们的项目在发布的时候会被打成一个war包,这个war包下的class文件会被放在tomcat下被运行。所以这里获取的真实路径是这个war包下的1.jpg所在的路径。

需求3:获取当前项目下的1.jpg在服务器中的文件类型。

/*需求3:获取当前项目下的1.jpg在服务器中的文件类型。getMimeType("1.jpg");这里书写获取文件类型的文件名和后缀名即可*/String mimeType = servletContext.getMimeType("1.jpg");System.out.println("mimeType = " + mimeType);//mimeType = image/jpeg

注意:对于方法 getMimeType(“1.jpg”);这里书写获取文件类型的文件名和后缀名即可

总结:

1.ServletContext表示上下文对象,代表整个web项目,tomcat一启动就会创建该接口对象,关闭tomcat就会消失

2.ServletContext属于对象,多次会话,多次请求限制,三个域对象范围:ServletContext > HttpSession > HttpServletRequest

3.ServletContext其他作用:

​ 1)获取文件真实路径: String getRealPath(String path) 参数path如果书写的是相对路径相对的是webapp

​ 2)获取文件的MIME类型: String getMimeType(String file) 参数file只书写文件名+后缀名即可,不会判断是否存在

1.1 Listener概述

说明:

​ javaweb中的监听器是监听 ServletContext HttpSession HttpServletRequest 三个对象创建和销毁的,同时监听是哪个对象中数据的变化,就是监听属性的变化:setAttribute removeAttribute

1.ServletContext 是在tomcat启动创建,关闭tomcat销毁

2.HttpSession 是在浏览器第一次访问执行request.getSession()创建,销毁时间:1)30min 2)执行invalidate()

3.HttpServletRequest 是浏览器第一次访问创建,浏览器接收到服务器的响应就销毁

# 监听
1. 设置监听器的人
2. 监听器 
2. 监听器目标: 被监听的对象 
3. 监听器工作: 被监听的对象执行某种行为,监听器就开始工作# web里面
1. 雇佣人 : web程序开发者
2. 监听器例子A1). 监听器A: ServletContextListener ****2). 目标 :  监听ServletContext对象3). 执行 : 监听ServletContext对象创建和销毁
3. 监听器例子B1). 监听器A: HttpSessionListener2). 目标 : HttpSession对象3). 执行 : 监听HttpSession对象创建和销毁
4. 监听器例子C1). 监听器A: HttpRequestListener2). 目标 : HttpRequest对象3). 执行 : 监听HttpRequest对象创建和销毁	
5.  监听器例子D1). 监听器A: ServletContextAttributeListener ****2). 目标 : ServletContext对象3). 执行 : 监听ServletContext对象增删改数据 (add,remove) 当我们向ServletContext对象中添加数据(setAttribute())和删除数据(removeAttribute())就会被ServletContextAttributeListener监听器监听HttpSessionAttributeListener HttpRequestAttributeListener

生活中的监听器

我们很多商场有摄像头,监视着客户的一举一动。如果客户有违法行为,商场可以采取相应的措施。

javaweb中的监听器

在我们的java程序中,有时也需要监视某些事情,一旦被监视的对象发生相应的变化,我们应该采取相应的操作。

监听web三大域对象:HttpServletRequest、HttpSession、ServletContext (创建和销毁)

场景

历史访问次数、统计在线人数、系统启动时初始化配置信息

监听器的接口分类

事件源监听器接口时机
ServletContextServletContextListener上下文域创建和销毁
ServletContextServletContextAttributeListener上下文域属性增删改的操作
HttpSessionHttpSessionListener会话域创建和销毁
HttpSessionHttpSessionAttributeListener会话域属性增删改的操作
HttpServletRequestServletRequestListener请求域创建和销毁
HttpServletRequestServletRequestAttributeListener请求域属性增删改的操作

1.2 Listener快速入门

​ 监听器在web开发中使用的比较少,见的机会就更少了,今天我们使用ServletContextListenner来带领大家学习下监听器,因为这个监听器是监听器中使用率最高的一个,且监听器的使用方式都差不多。

我们使用这个监听器可以在项目启动和销毁的时候做一些事情,例如,在项目启动的时候加载配置文件。

步骤分析

1. 创建一个普通类,实现ServletContextListenner2. 重写方法监听ServletContext创建监听ServletContext销毁3. 配置web.xml注解 掌握
① xml版本
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;/*设置监听器的人: 开发者监听器 : MyListener监听器目标 : ServletContext 对象监听器的工作:1). 当ServletContext 对象创建的时候就会执行contextInitialized方法ServletContext是tomcat启动时就会创建 (早于Filter和Servlet)2). 当ServletContext 对象销毁的时候就会执行contextDestroyed方法ServletContext是tomcat关闭时销毁 (晚于Filter和Servlet)这两个方法是事件驱动*/
public class MyListener implements ServletContextListener {//tomcat一启动,此方法就会运行//运用场景: spring底层封装了一个ServletContextListener加载配置文件@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("contextInitialized");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("contextDestroyed");}
}
<listener><listener-class>com.baidu.MyServletContextListener</listener-class>
</listener>
② 注解版本
@WebListener
public class MyListener implements ServletContextListener {//tomcat一启动,此方法就会运行//运用场景: spring底层封装了一个ServletContextListener加载配置文件@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("contextInitialized");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("contextDestroyed");}
}

1.3 案例:模拟spring框架

需求:可以在项目启动时读取配置文件。获取配置文件的名字。

步骤:

1.在web.xml进行配置文件的配置

2.创建自定义监听器类监听ServletContext的创建和销毁

3.在自定义监听器类中实现监听器的方法

4.实现的方法体中读取web.xml文件中关于当前项目配置文件的信息

5.输出结果

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;//2.创建自定义监听器类监听ServletContext的创建和销毁
//别忘记注册监听器
@WebListener
public class SpringContextListener implements ServletContextListener{//3.在自定义监听器类中实现监听器的抽象方法@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {//4.实现的方法体中读取web.xml文件中关于当前项目配置文件的信息//4.1根据事件类对象servletContextEvent调用方法获取ServletContext上下文对象ServletContext servletContext = servletContextEvent.getServletContext();//4.2使用上下文对象调用方法获取web.xml配置文件中的数据/*<context-param><param-name>jdbc</param-name><param-value>jdbc.properties</param-value></context-param>*/String str = servletContext.getInitParameter("jdbc");System.out.println("str = " + str);}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("释放资源....销毁。。。。");}
}
 <!--配置当前项目的配置文件信息--><!--1.在web.xml进行配置文件的配置--><context-param><param-name>jdbc</param-name><param-value>jdbc.properties</param-value></context-param>
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;//2.创建自定义监听器类监听ServletContext的创建和销毁
//别忘记注册监听器
@WebListener
public class SpringContextListener implements ServletContextListener{//3.在自定义监听器类中实现监听器的抽象方法@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {//4.实现的方法体中读取web.xml文件中关于当前项目配置文件的信息//4.1根据事件类对象servletContextEvent调用方法获取ServletContext上下文对象ServletContext servletContext = servletContextEvent.getServletContext();//4.2使用上下文对象调用方法获取web.xml配置文件中的数据/*<context-param><param-name>jdbc</param-name><param-value>jdbc.properties</param-value></context-param>*/String str = servletContext.getInitParameter("jdbc");System.out.println("str = " + str);}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("释放资源....销毁。。。。");}
}
 <!--配置当前项目的配置文件信息--><!--1.在web.xml进行配置文件的配置--><context-param><param-name>jdbc</param-name><param-value>jdbc.properties</param-value></context-param>


在这里插入图片描述



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

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

相关文章

MySQL主从读写分离之Proxysql(openEuler版)

实验目的&#xff1a; 基于proxysql实现MySQL的主从读写分离。 实验过程&#xff1a; 前期准备&#xff1a; 一共有四台虚拟机&#xff0c;其中三台为配置好的一主两从虚拟机&#xff0c;还有一台干净的虚拟机用来配置proxysql。 主机名地址master192.168.27.137node1192.…

bat文件给多个Android设备安装apk

本文是安装一个apk 1、确保以下3个文件在同一个目录下 1>要安装的apk&#xff0c;这里是mmb.apk 2>设备名单&#xff0c;保存在.txt文件中&#xff0c;一行一个设备名&#xff0c;设备名通过adb devices获取&#xff0c;截图中是两个设备 txt文件中的样式 3>要运行…

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数---分类性能评估的利器

【Pytorch】进阶学习&#xff1a;深入解析 sklearn.metrics 中的 classification_report 函数—分类性能评估的利器 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合…

外包干了3个月,技术退步明显。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

定制repo(不再切换python和google源)

文章目录 定制repo&#xff08;不再切换python和google源&#xff09;前言各用各的repo定制repo2/repo3源码自动识别repo2/repo3项目完整解决方案&#xff1a; 定制repo&#xff08;不再切换python和google源&#xff09; 众知&#xff0c;Android/AOSP/ROM系统开发&#xff0c…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记05_共谋(中)

1. 默许共谋 1.1. 又称寡头价格协调&#xff08;Oligopolistic Price Coordination&#xff09;或有意识的平行行为&#xff08;Conscious Parallelism&#xff09; 1.1.1. 在条件允许的情况下&#xff0c;它会发生在市场集中度较高的行业当中 1.1.…

论文笔记 Where Would I Go Next? Large Language Models as Human Mobility Predictor

arxiv 2023 08的论文 1 intro 1.1 人类流动性的独特性 人类流动性的独特特性在于其固有的规律性、随机性以及复杂的时空依赖性 ——>准确预测人们的行踪变得困难近期的研究利用深度学习模型的时空建模能力实现了更好的预测性能 但准确性仍然不足&#xff0c;且产生的结果…

爬虫(五)

1. 前端JS相关 三元运算 v1 条件 ? 值A : 值B; # 如果条件成立v1值A&#xff0c;不成立v1等于值Bres 1 1 ? 99 : 88 # res99特殊的逻辑运算 v1 11 || 22 # Ture v2 9 || 14 # 9 v3 0 || 15 # 15 v3 0 || 15 || "zhangfei" # 15赋值和…

201909 青少年软件编程(Scratch)等级考试试卷(一级)

第1题&#xff1a;【 单选题】 小明在做一个采访的小动画&#xff0c;想让主持人角色说“大家好&#xff01;”3秒钟&#xff0c;用下列程序中的哪一个可以实现呢&#xff1f;&#xff08; &#xff09; A: B: C: D: 【正确答案】: B 【试题解析】 : 第2题&#xff1a…

领域模型设计-COLA架构

前言 当我们需要创建的新应用的时候&#xff0c;往往需要站在一个长远的角度来设计我们的系统架构。有时候我们接手一个老的应用的时候&#xff0c;会发现由于创建之初没有好好规划系统架构&#xff0c;导致我们后期开分成本和维护成本都非常高。近些年来领域模型的系统设计非常…

《AI歌手:音乐产业的未来之音?》

引言 随着人工智能技术的快速发展,AI歌手作为一种新兴的演艺模式逐渐走进了人们的视野。AI歌手以其独特的魅力和无限的潜力引发了人们对于音乐产业未来的思考。本文将围绕AI歌手的音乐呈现、市场认可、替代性以及其他类似AI应用等方面展开讨论,探究AI歌手是否有望成为音乐产…

Matlab|10节点潮流计算程序(通用性强)

主要内容 潮流计算程序matlab 牛拉法 采用matlab对10节点进行潮流计算&#xff0c;采用牛拉法&#xff0c;程序运行可靠&#xff0c;牛拉法实现通用性强&#xff0c;可替换参数形成其他节点系统的潮流计算程序。 下载链接

DDoS和CC攻击的原理

目前最常见的网络攻击方式就是CC攻击和DDoS攻击这两种&#xff0c;很多互联网企业服务器遭到攻击后接入我们德迅云安全高防时会问到&#xff0c;什么是CC攻击&#xff0c;什么又是DDoS攻击&#xff0c;这两个有什么区别的&#xff0c;其实清楚它们的攻击原理&#xff0c;也就知…

攻击技术:命令和控制服务器(C2)是什么意思

在攻击者使用的众多策略中&#xff0c;最阴险的策略之一是命令和控制服务器&#xff08;C2&#xff09;。通过这篇文章&#xff0c;我们想准确地解释它是什么。 这些服务器充当计算机黑客行动的大脑&#xff0c;协调受感染设备的操作并允许攻击者随意操纵它们。 在网络安全领…

AJAX学习(一)

版权声明 本文章来源于B站上的某马课程&#xff0c;由本人整理&#xff0c;仅供学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;本人致力于维护原创作品的权益&#xff0c;共同营造一个尊重知识…

Apache的运用与实战

WEB服务器 1、WEB服务简介 # 目前最主流的三个Web服务器是Apache、Nginx、 IIS。 - WEB服务器一般指网站服务器&#xff0c;可以向浏览器等Web客户端提供网站的访问&#xff0c;让全世界浏览。 - WEB服务器也称为WWW(WORLD WIDE WEB)服务器&#xff0c;主要功能是提供网上信息…

Feign实现微服务间远程调用续;基于Redis实现消息队列用于延迟任务的处理,Redis分布式锁的实现;(黑马头条Day05)

目录 延迟任务和定时任务 使用Redis设计延迟队列原理 点评项目中选用list和zset两种数据结构进行实现 如何缓解Redis内存的压力同时保证Redis中任务能够被正确消费不丢失 系统流程设计 使用Feign实现微服务间的任务消费以及文章自动审核 系统微服务功能介绍 提交文章-&g…

stable diffusion 零基础入门教程

一、前言 Midjourney 生成的图片很难精准的控制&#xff0c;随机性很高&#xff0c;需要大量的跑图&#xff0c;但Stable Diffusion可以根据模型较精准的控制。 SD 效果图展示&#xff1a; 二、Stable Diffusion 介绍 Stable Diffusion 是一款基于人工智能技术开发的绘画软件…

IM6ULL学习总结(四-七-1)输入系统应用编程

第7章 输入系统应用编程 7.1 什么是输入系统 ⚫ 先来了解什么是输入设备&#xff1f; 常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等,用户通过这些输入设备与 Linux 系统进行数据交换。 ⚫ 什么是输入系统&#xff1f; 输入设备种类繁多&#xff0c;能否统一它们的…

ZJUBCA研报分享 | 《BTC/USDT周内效应研究》

ZJUBCA研报分享 引言 2023 年 11 月 — 2024 年初&#xff0c;浙大链协顺利举办为期 6 周的浙大链协加密创投训练营 &#xff08;ZJUBCA Community Crypto VC Course&#xff09;。在本次训练营中&#xff0c;我们组织了投研比赛&#xff0c;鼓励学员分析感兴趣的 Web3 前沿话题…