[Servlet] 18 监听器


prtyaa
prtyaa 2023-12-27 15:25:59 52237
分类专栏: 资讯

问题:

在 Servlet 技 术 中 我 们 学 习 了 request 、 session 、application 作用域对象,其主要作用是实现数据的在不同场景中的灵活流转。但是数据的具体流转过程我们是看不到的,比如作用域对象是什么时候创建和销毁的,数据是什么时候存取,改变和删除的。因为具体的流转过程看不到,所以也就无法再指定的时机对数据和对象进行操作,比如 session 销毁的时候,在线人数-1。

解决:

使用监听器

概念:

Servlet 监听器是 Servlet 规范中定义的一种特殊类,用于监听

ServletContext、HttpSession 和 ServletRequest 等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。

ServletRequest和HttpServletRequest的区别:

HttpServletRequest和ServletRequest都是接口


HttpServletRequest继承自ServletRequest

HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。如

getHeader(), getMethod(),getSession()等等。


客户端浏览器发出的请求被封装成为一个HttpServletRequest对象。

对象包含了客户端请求信息包括:

请求的地址,

请求的参数,

提交的数据,

上传的文件客户端的ip甚至客户端操作系统都包含在其内。

当HTTP转发给Web容器处理时,Web容器会收集相关信息,并产生HttpServletRequest对象,使用这个对象可以取得所有HTTP请求中的信息,可以在Servlet中进行处理,也可以转发给其他的Servlet/Jsp处理。

ServletRequestListener用于监听ServletRequest对象的创建和销毁,一个ServletRequest可以注册多个ServletRequestListener接口,request创建时调用requestInitialized(),request销毁时调用requestDestroyed()

 

监听对象:

Request

Session

Application

监听内容:

创建、销毁、属性改变事件

监听作用:

在事件发生之前,之后进行一些处理,比如统计在线人数

使用:

监听 request

监听 session

监听 application

案例:

统计网站在线人数


创建和使用步骤

一 创建一个普通java类实现指定的接口(从下列接口中选择)

1.监听request的创建和销毁:ServletRequestListener

requestInitialized(ServletRequestEvent sre)---创建

requestDestroyed(ServletRequestEvent sre)--销毁

形参:

  1. ServletRequestEvent可以获取当前监听到的request对象,
  2. 对request对象的中的资源进行操作。

 

1,1.监听request作用域数据的变更:ServletRequestAttributeListener

attributeAdded(ServletRequestAttributeEvent srae)--添加

attributeRemoved(ServletRequestAttributeEvent srae) --移除

attributeReplaced(ServletRequestAttributeEvent srae) --修改

形参:

  1. ServletRequestAttributeEvent可以获取当前被监听到的request中的数据。
  2. geName()返回监听到的数据的键
  3. getValue()返回监听的到的数据的值。

 

2.监听session的创建和销毁:HttpSessionListener

可用来做当前在线人数的统计功能

sessionCreated(HttpSessionEvent se)--创建

sessionDestroyed(HttpSessionEvent se)--销毁

形参:

  1. 获取当前被监听到的session对象
  2. 监听session的作用域数据的变更:

2.1 attributeAdded(HttpSessionBindingEvent event)--增加

2.2 attributeRemoved(HttpSessionBindingEvent event)--移除

2.3 attributeReplaced(HttpSessionBindingEvent event)--修改

形参:

  1. 获取当前监听到的session中的数据 getName()返回数据的键名
  2. getValue()返回数据的值

 

3.监听application对象的创建和销毁:ServletContextListener

可用来统计页面访问人数的操作或者投票操作

contextInitialized(ServletContextEvent sce)

contextDestroyed(ServletContextEvent sce)

形参:

  1. 获取application对象

2. 监听application对象的数据的变更:ServletContextAttributeListener

2.1 attributeAdded(ServletContextAttributeEvent event) --新增

2.2 attributeRemoved(ServletContextAttributeEvent event)--移除

2.3 attributeReplaced(ServletContextAttributeEvent event)--修改

形参:

  1. 获取当前被监听的数据 getName()返回数据的键名
  2. getValue()返回数据的值

二 在项目中的web.xml中配置监听器,让监听器生效

<listener>
  		<listener-class>监听器类的包名和类名</listener-class>
</listener>
示例:
 <listener>
  	<listener-class>com.lin.listener.MyListener</listener-class>
</listener>

在线人数的案例操作

每当有一个访问连接到服务器时,服务器就会创建一个session 来管理会话。那么我们就可以通过统计session 的数量来获得当前在线人数。

所以使用到的是HttpSessionListener √监听器。

public class MyListener implements HttpSessionListener,ServletContextListener{
	//监听Application对象
		@Override
		public void contextInitialized(ServletContextEvent sce) {
                      //声明计数对象
			int count=0;
			//获取Application对象
			ServletContext sc = sce.getServletContext();
			sc.setAttribute("count",count);
			
		}
	
		@Override
		public void contextDestroyed(ServletContextEvent sce) {
			// TODO Auto-generated method stub
			
		}
	//监听Sesion对象
		@Override
		public void sessionCreated(HttpSessionEvent se) {
			//获取Application对象中的计数器
				ServletContext sc = se.getSession().getServletContext();
				int count=(int) sc.getAttribute("count");
			//计数器自增
				++count;
			//然后再将计数器存储到application中
				sc.setAttribute("count", count);
		}
	
		@Override
		public void sessionDestroyed(HttpSessionEvent se) {
			//获取Application对象中的计数器
				ServletContext sc = se.getSession().getServletContext();
				int count=(int) sc.getAttribute("count");
			//计数器自减
				--count;
			//然后再将计数器存储到application中
				sc.setAttribute("count", count);
			
		}
		
}

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=31427
赞同 0
评论 0 条
prtyaaL2
粉丝 1 发表 2553 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2966
【软件正版化】软件正版化工作要点  2885
统信UOS试玩黑神话:悟空  2855
信刻光盘安全隔离与信息交换系统  2743
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1277
grub引导程序无法找到指定设备和分区  1244
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  169
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  168
点击报名 | 京东2025校招进校行程预告  164
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  161
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!