在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所示。
■ 图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所示。
评论(0)