Web监听器
1、Web监听器概述
监听器(Listener),主要用于监听某个事件是否发生。一旦该事件发生,便立即去处理监听器相应方法中的内容。
Java
中给我们提供了许多监听器,我们这里介绍的是仅仅是Web
应用中的**Web
监听器**。
由于Web
监听器均在javax.servlet
包中定义,因此:Web
监听器又称“Servlet
监听器”。
- **生命周期:**监听器在服务器启动时创建,监听器被移除或服务器关闭才会被销毁。
2、Web监听器种类
Servlet
规范中定义了8个Web
监听器接口,可用于监听ServletContext
、HttpSession
和ServletRequest
对象的生命周期事件,以及这些对象的属性改变事件。
2.1、对象监听器
对象监听器主要用于监听对象的创建与销毁。用于监听对象的监听器有以下三种:
(1)ServletContext
监听器: 用于监听ServletContext
对象的创建与销毁。
监听器接口 | 监听事件 |
---|---|
javax.servlet.ServletContextListener |
(1)当ServletContext 对象创建时激活contextInitialized 方法。(2)当ServletContext 对象销毁时激活contextDestroyed 方法。 |
(2)HttpSession
监听器: 用于监听HttpSession
对象的创建与销毁。
监听器接口 | 监听事件 |
---|---|
javax.servlet.http.HttpSessionListener |
(1)当HttpSession 对象创建时激活sessionCreated 方法。(2)当HttpSession 对象销毁时激活sessionDestroyed 方法。 |
(3)ServletRequest
监听器: 用于监听ServletRequest
对象的创建与销毁。
监听器接口 | 监听事件 |
---|---|
javax.servlet.ServletRequestListener |
(1)当ServletRequest 对象创建时激活requestInitialized 方法。(2)当ServletRequest 对象销毁时激活requestDestroyed 方法。 |
2.2、属性变化监听器
属性变化监听器主要用于监听属性的创建、修改和删除。用于监听属性变化的监听器有以下三种:
**(1)ServletContextAttributeListener
监听器:**用于监听ServletContext
中属性的创建、修改和删除。
监听器接口 | 监听事件 |
---|---|
javax.servlet.ServletContextAttributeListener |
(1)当向ServletContext 对象中添加属性时激活attributeAdded 方法。(2)当ServletContext 对象中的属性被修改时激活attributeReplaced 方法。(3)当从ServletContext 对象中删除属性时激活attributeRemoved 方法。 |
**(2)HttpSessionAttributeListener
监听器:**用于监听HttpSession
中属性的创建、修改和删除。
监听器接口 | 监听事件 |
---|---|
javax.servlet.http.HttpSessionAttributeListener |
(1)当向HttpSession 对象中添加属性时激活attributeAdded 方法。(2)当HttpSession 对象中的属性被修改时激活attributeReplaced 方法。(3)当从HttpSession 对象中删除属性时激活attributeRemoved 方法。 |
(2)HttpSessionAttributeListener
监听器
**(3)ServletRequestAttributeListener
监听器:**用于监听ServletRequest
中属性的创建、修改和删除。
监听器接口 | 监听事件 |
---|---|
javax.servlet.ServletRequestAttributeListener |
(1)当向ServletRequest 对象中添加属性时激活attributeAdded 方法。(2)当ServletRequest 对象中的属性被修改时激活attributeReplaced 方法。(3)当从ServletRequest 对象中删除属性时激活attributeRemoved 方法。 |
2.3、session状态监听器
**(1)HttpSessionBindingListener
监听器:**用于监听某个(实体)类的对象在Session
中的创建与删除。
监听器接口 | 监听事件 |
---|---|
javax.servlet.http.HttpSessionBindingListener |
(1)当一个类的对象绑定到Session 中时激活valueBound 方法。(2)当一个类的对象从Session 中删除时激活valueUnbound 方法。 |
**(2)HttpSessionActivationListener
监听器:**用于监听某个(实体)类的对象在Session
中的钝化和活化。
监听器接口 | 监听事件 |
---|---|
javax.servlet.http.HttpSessionActivationListener |
如果一个类的对象绑定到Session 中时,(1)当Session 被钝化时激活sessionWillPassivate 方法。(2)当Session 被活化时激活sessionDidActivate 方法。 |
**附:**由于Session
中保存了大量访问网站相关的重要信息,过多的Session
数据会占用过多的内存,导致服务器的性能下降。因此,类似于数据库对象的持久化,web
容器也会把不常使用的Session
数据持久化到本地文件中。
- **钝化:**指的是把不用的
Session
数据序列化到本地文件中的过程。 - **活化:**指的是从本地文件中读取
Session
数据的过程。
3、使用步骤
使用监听器与创建Servlet
类似,主要分为以下两个步骤:
- 编写一个Java类实现对应的Web监听器接口。
- 在
web.xml
文件中配置(注册)监听器。
4、应用示例:统计网站在线人数
4.1、创建测试项目
(1)使用Maven
模板创建一个MavenWeb
项目(具体步骤参考《Maven详解》),项目名称为javaweb-listener
。
(2)同样地,填写项目名称和Maven
项目GAV
。
(3)同样地,配置该MavenWeb
项目的安装目录、配置文件和本地仓库。点击Finish
按钮完成项目创建,等待Maven
依赖包导入完毕。
(4)同样地,为了避免以后出现兼容性问题,建议我们先将该项目中的web.xml
文件替换成“web-app_4_0”
版本(具体步骤参考《Servlet
详解》)。
(5)同样地,在该项目的main
文件夹下新建一个java
文件夹和一个resource
文件夹,并将它们分别标记为“源码根目录”和“资源根目录”。
(6)同样地,配置Tomcat服务器,deploy(发布)javaweb-listener:war exploded
包,并为该项目添加虚拟路径映射:/listener
(具体步骤参考《Tomcat
详解》)。
(7)在项目的pom.xml
文件中添加项目依赖,并重新加载Maven项目。
pom.xml
文件:
1 | <dependencies> |
(8)同样地,在该项目的java
目录下新建一个com.atangbiji.servlet
包,并在该包下新建一个OnlineCountServlet
类,用于在服务器后台统计网站在线人数。同样地,让OnlineCountServlet
类继承(extends)HttpServlet
类,以实现Servlet
接口。然后,在OnlineCountServlet
类中重写doGet
和doPost
方法。
OnlineCountServlet.java
文件:
1 | public class OnlineCountServlet extends HttpServlet { |
(9)同样地,在该项目的Web
配置文件(web.xml
)中注册(映射)我们自己编写的Servlet
,并为它提供一个浏览器可以访问的路径。
web.xml
文件:
1 | <servlet> |
(10)为了测试Session
对象的销毁,在该项目的Web
配置文件(web.xml
)中设置Session
默认的失效时间为1min
。
web.xml
文件:
1 | <!-- 设置Session默认的失效时间 --> |
4.2、创建监听器,实现对应的Web监听器接口
(11)同样地,在该项目的java
目录下新建一个com.atangbiji.listener
包,并在该包下新建一个OnlineCountListener
类,用于统计网站在线人数。类似地,让OnlineCountListener
类实现(implements)javax.servlet.http
包中的HttpSessionListener
接口。然后,在OnlineCountListener
类中重写sessionCreated
和sessionDestroyed
方法。
OnlineCountListener.java
文件:
1 | //统计网站在线人数,即:统计Session |
4.3、配置(注册)监听器
(12)类似地,在该项目的Web
配置文件(web.xml
)中注册(映射)我们自己编写的Listener
。
web.xml
文件:
1 | <listener> |
4.4、测试结果
(13)重启Tomcat。若在谷歌浏览器中输入http://localhost:8080/listener/count
,则网站当前在线人数为2人。此时,服务器后台输出结果如下图所示:
**注:**由于JSP
的默认指令<%@ page session="true"%>
,导致Tomcat
启动后默认访问JSP
首面时,会自动创建一个Session
。我们可以在JSP
页面顶部置通过如下代码将其关闭。
1 | <%@ page session="false"%> |
(14)在不关闭谷歌浏览器的情况下,再在火狐浏览器中输入http://localhost:8080/listener/count
,则网站当前在线人数变为3人。此时,服务器后台输出结果如下图所示:
(15)1min
后,3个Session
对象均自动销毁。此时,在不关闭谷歌浏览器和火狐浏览器的情况下,再在谷歌浏览器中刷新http://localhost:8080/listener/count
页面,则网站当前在线人数变为1人。此时,服务器后台输出结果如下图所示:
**注:**当一个Session
被注销后,若通过该浏览器重新访问该网站,则服务器会立即重新创建一个新的Session
。
(本讲完,系列博文持续更新中…… )
关注**“阿汤笔迹”** 微信公众号,获取更多学习笔记。
原文地址:http://www.atangbiji.com/2022/10/23/listener
博主最新文章在个人博客 http://www.atangbiji.com/ 发布。