Java Web实战 | 设计一个监听器

举报
TiAmoZhang 发表于 2023/04/12 09:37:55 2023/04/12
【摘要】 在Web应用程序设计中,经常需要对某些事件进行监听,以便及时做出处理。对于桌面应用程序而言,鼠标单击或双击、键盘上的键被按下等都是事件。类似地,对于Web应用程序来说,session对象的创建、请求域中某个属性的移除等都是事件。为此,Servlet规范提供了监听器(Listener),专门用于监听Servlet事件。监听器技术涉及几个重要的概念,分别如下。
简介: 在Web应用程序设计中,经常需要对某些事件进行监听,以便及时做出处理。对于桌面应用程序而言,鼠标单击或双击、键盘上的键被按下等都是事件。类似地,对于Web应用程序来说,session对象的创建、请求域中某个属性的移除等都是事件。为此,Servlet规范提供了监听器(Listener),专门用于监听Servlet事件。监听器技术涉及几个重要的概念,分别如下。


640.jpg


在Web应用程序设计中,经常需要对某些事件进行监听,以便及时做出处理。对于桌面应用程序而言,鼠标单击或双击、键盘上的键被按下等都是事件。类似地,对于Web应用程序来说,session对象的创建、请求域中某个属性的移除等都是事件。为此,Servlet规范提供了监听器(Listener),专门用于监听Servlet事件。监听器技术涉及几个重要的概念,分别如下。


(1) 事件:对于Web应用程序而言,ServletContext对象、HttpSession对象和ServletRequest对象的状态改变可称为Servlet事件。如HttpSession对象的创建,ServletRequest对象中属性的增加或移除都是事件。

(2) 监听器:负责监听事件是否发生。它是一个实现了一个或多个Servlet事件监听接口的类。它在Web应用程序部署时被注册到Web容器中并被实例化。

(3) 事件处理器: 监听器的方法。当事件发生的时候,监听器会监听到事件的发生,并触发相应的处理器用以处理事件。

01、监听器应用案例

设计一个监听器一般需要如下步骤。

(1) 实现合适的接口:监听器需要根据监听对象的不同,实现表5-5中的某个监听接口。

(2) 设计事件处理器:根据所选择的监听器接口,实现该接口中的相关方法。

(3) 配置监听器:既可以在部署描述文件web.xml文件中配置,又可以利用注解@WebListener完成监听器配置。

(4) 提供任何需要的初始化参数。
【例1】设计监听器,监听ServletContext、HttpSession和ServletRequest域对象的生命周期事件。

为实现这个目标,就要设计监听器类来实现针对这些域对象的监听器接口。可以设计一个类,来实现3个接口,从而使这个类具有针对3个域对象的事件监听的功能。监听器MyListener代码如文件1所示。
【文件1】MyListener.java

package com.example.listener;
//import 部分此处略
@WebListener
public class MyListener implements ServletContextListener,HttpSessionListener,ServletRequestListener{
public void contextInitialized(ServletContextEvent sce){
System.out.println("ServletContext 对象被创建");
}
public void contextDestroyed(ServletContextEvent sce){system.out.println("ServletContext 对象被销毁");}
public void sessionCreated(HttpSessionEvent se) {System.out.println("HttpSession 对象被创建");
public void sessionDestroyed(HttpSessionEvent se) {System.out.println("HttpSession 对象被销毁");
public void requestInitialized(ServletRequestEvent sre)System.out.println("ServletRequest 对象被创建");
public void requestDestroyed(ServletRequestEvent sre)System.out.println("ServletRequest 对象被销毁”)

文件1中,@WebListener的作用是配置监听器(第4行)。ServletContext对象与当前的Web应用程序对应。因为已在Tomcat服务器上部署了chapter5项目,当服务器启动时,Tomcat服务器会自动加载chapter5项目,并创建与其对应的ServletContext对象。由于chapter5项目中配置了MyListener监听器,并且该监听器实现了ServletContextListener接口,当Tomcat创建ServletContext对象时就会调用MyListener类的contextInitialized()方法作为事件处理器,输出“ServletContext对象被创建”这行信息(第7~9行)。要观察ServletContext对象的销毁信息,可以将Tomcat服务器关闭。Tomcat服务器关闭前,会销毁ServletContext对象,同时contextDestroyed()方法被调用(第10~12行),在控制台可见ServletContext对象被销毁的信息,如图1所示。

640.png


■ 图1 ServletContext对象的创建和销毁


为了查看HttpSessionListener和ServletRequestListener的运行效果,可以在chapter5项目中编写一个名为listener.jsp的文件,内容如文件2所示。
【文件2】listener.jsp

< html >
 <body>
  This is listener
 </body>
</html>

为了尽快看到HttpSession对象的创建和销毁过程,可以在项目的web.xml文件中设置session的超时时间为1min,内容如下:

< session - config >
< session - timeout > 1 </session - timeout >
</session- config>

启动Tomcat服务器,在浏览器的地址栏输入“http://localhost:8080/chapter5/listener.jsp”, 观察控制台输出。当浏览器第一次访问项目中的动态资源(JSP、Servlet)时,会创建HttpSession对象,Tomcat服务器会调用监听器的sessionCreated()方法作为创建HttpSession对象事件的事件处理器(第13~15行)。并且,由于浏览器发送请求,会自动创建HttpServletRequest对象,Tomcat服务器会调用requestInitialized()方法作为创建请求对象事件的处理器(第19~21行)。当listener.jsp对该请求做出响应后,请求随即被销毁,控制台就会输出“ServletRequest对象被销毁”的消息(第22~24行),如图2所示。

640.png


■ 图2 控制台输出


如果关闭访问listener.jsp文件的浏览器页面或保持浏览器不刷新。与之对应的HttpSession对象会在1min后被销毁。控制台显示结果如图2所示。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。