写点什么

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

作者:TiAmo
  • 2023-05-15
    江苏
  • 本文字数:2123 字

    阅读完需:约 7 分钟

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

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

在 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 部分此处略@WebListenerpublic 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 所示。



■ 图 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 所示。



■ 图 2 控制台输出


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

发布于: 刚刚阅读数: 3
用户头像

TiAmo

关注

有能力爱自己,有余力爱别人! 2022-06-16 加入

CSDN全栈领域优质创作者,万粉博主;阿里云专家博主、星级博主、技术博主、阿里云问答官,阿里云MVP;华为云享专家;华为Iot专家;亚马逊人工智能自动驾驶(大众组)吉尼斯世界纪录获得者

评论

发布
暂无评论
Java Web实战 | 设计一个监听器_JDBC_TiAmo_InfoQ写作社区