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
文件 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
为了尽快看到 HttpSession 对象的创建和销毁过程,可以在项目的 web.xml 文件中设置 session 的超时时间为 1min,内容如下:
启动 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 所示。
版权声明: 本文为 InfoQ 作者【TiAmo】的原创文章。
原文链接:【http://xie.infoq.cn/article/f3140906a16ddf325cad12ea4】。文章转载请联系作者。
评论