监听器一
监听器是一个专门用于对其他对象身上发生的事件或状态改变,进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生事件后,监听器某个方法立即被执行。
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
Servlet监听器的分类
在Servlet规范中定义多种类型的监听器,用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象
Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:
- 监听域对象自身的创建和销毁的事件监听器。
- 监听域对象中的属性的增加和删除的事件监听器。
- 监听绑定到HttpSession域中的某个对象的状态的事件监听器。
监听ServletContext域对象的创建和销毁
ServletContextListener接口用于监听ServletContext对象的创建和销毁事件。实现ServletContextListener接口的类都可以对ServletContext对象的创建和销毁进行监听。
当ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法。
当ServletContext对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。
ServletContext域对象创建和销毁时机:
创建:服务器启动针对每一个Web应用创建ServletContext
销毁:服务器关闭前先关闭代表每一个web应用的ServletContext
编写一个MyServletContextListener类,实现ServletContextListener接口,监听ServletContext对象的创建和销毁
package com.smart.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /*** * ServletContextListener 监听器 */ public class MyServletContextListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { System.out.println("ServletContext 创建对象sce"); } public void contextDestroyed(ServletContextEvent sce) { System.out.println("ServletContext 销毁对象sce"); } }
在web.xml文件中注册监听器
要想监听事件源,那么必须将监听器注册到事件源上才能够实现对事件源的行为动作进行监听,在JavaWeb中,监听的注册是在web.xml文件中进行配置的,如下:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <listener> <listener-class>com.smart.listener.MyServletContextListener</listener-class> </listener> </web-app>
监听HttpSession域对象的创建和销毁
HttpSessionListener 接口用于监听HttpSession对象的创建和销毁
创建一个Session时,激发sessionCreated (HttpSessionEvent se) 方法
销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se) 方法。
范例:编写一个MyHttpSessionListener类,实现HttpSessionListener接口,监听HttpSession对象的创建和销毁
package com.smart.listener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * HttpSessionListener 监听器 */ public class MyHttpSessionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent se) { System.out.println("HttpSessionListener 创建"); } public void sessionDestroyed(HttpSessionEvent se) { System.out.println("HttpSessionListener 销毁"); } }
在web.xml文件中注册监听器
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <listener> <!--ServletContextListener监听器--> <listener-class>com.smart.listener.MyServletContextListener</listener-class> </listener> <listener> <!--HttpSessionListener监听器--> <listener-class>com.smart.listener.MyHttpSessionListener</listener-class> </listener> <!--配置session的销毁时间--> <session-config> <!--1分钟销毁--> <session-timeout>1</session-timeout> </session-config> </web-app>
访问jsp页面时,HttpSession对象就会创建,此时就可以在HttpSessionListener观察到HttpSession对象的创建过程
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> <!DOCTYPE HTML> <html> <head> <title>HttpSessionListener监听器监听HttpSession对象的创建</title> </head> <body> 一访问JSP页面,HttpSession就创建了,创建好的Session的Id是:${pageContext.session.id} </body> </html>
监听ServletRequest域对象的创建和销毁
ServletRequestListener接口用于监听ServletRequest 对象的创建和销毁
Request对象被创建时,监听器的requestInitialized(ServletRequestEvent sre)方法将会被调用
Request对象被销毁时,监听器的requestDestroyed(ServletRequestEvent sre)方法将会被调用
ServletRequest域对象创建和销毁时机:
创建:用户每一次访问都会创建request对象
销毁:当前访问结束,request对象就会销毁
范例:编写一个MyServletRequestListener类,实现ServletRequestListener接口,监听ServletRequest对象的创建和销毁
package com.smart.listener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; public class MyServletRequestListener implements ServletRequestListener { public void requestDestroyed(ServletRequestEvent sre) { System.out.println("servlet request 被创建"); } public void requestInitialized(ServletRequestEvent sre) { System.out.println("servlet request 被销毁"); } }
在web.xml中进行配置
<!--HttpServletRequest监听器--> <listener> <listener-class>com.smart.listener.MyServletRequestListener</listener-class> </listener>