监听器
1、基本概念
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
2、Servlet监听器的分类
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象
Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:
- 监听域对象自身的创建和销毁的事件监听器。
- 监听域对象中的属性的增加和删除的事件监听器。
- 监听绑定到HttpSession域中的某个对象的状态的事件监听器。
3、监听ServletContext域对象的创建和销毁
ServletContextListener接口用于监听ServletContext对象的创建和销毁事件。实现了ServletContextListener接口的类都可以对ServletContext对象的创建和销毁进行监听。
当ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法。
当ServletContext对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。
ServletContext域对象创建和销毁时机:
创建:服务器启动针对每一个Web应用创建ServletContext
销毁:服务器关闭前先关闭代表每一个web应用的ServletContext
public class MyServletContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("ServletContext对象创建"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("ServletContext对象销毁"); } }
4、监听HttpSession域对象的创建和销毁
HttpSessionListener 接口用于监听HttpSession对象的创建和销毁
创建一个Session时,激发sessionCreated (HttpSessionEvent se) 方法
销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se) 方法。
范例:编写一个MyHttpSessionListener类,实现HttpSessionListener接口,监听HttpSession对象的创建和销毁
public class MyHttpSessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println( se.getSession() + "创建了!!"); } /* HttpSession的销毁时机需要在web.xml中进行配置,如下: * <session-config> <session-timeout>1</session-timeout> </session-config> 这样配置就表示session在1分钟之后就被销毁 */ @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session销毁了!!"); } }
5、监听ServletRequest域对象的创建和销毁
ServletRequestListener接口用于监听ServletRequest 对象的创建和销毁
Request对象被创建时,监听器的requestInitialized(ServletRequestEvent sre)方法将会被调用
Request对象被销毁时,监听器的requestDestroyed(ServletRequestEvent sre)方法将会被调用
ServletRequest域对象创建和销毁时机:
创建:用户每一次访问都会创建request对象
销毁:当前访问结束,request对象就会销毁
范例:编写一个MyServletRequestListener类,实现ServletRequestListener接口,监听ServletRequest对象的创建和销毁
public class MyServletRequestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent sre) { System.out.println(sre.getServletRequest() + "销毁了!!"); } @Override public void requestInitialized(ServletRequestEvent sre) { System.out.println(sre.getServletRequest() + "创建了!!"); } }
6.index.jsp
<%@ 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>
7.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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> <!-- 注册针对ServletContext对象进行监听的监听器 --> <listener> <description>ServletContextListener监听器</description> <!--实现了ServletContextListener接口的监听器类 --> <listener-class>com.servlet.study.listener.MyServletContextListener</listener-class> </listener> <!--注册针对HttpSession对象进行监听的监听器--> <listener> <description>HttpSessionListener监听器</description> <listener-class>com.servlet.study.listener.MyHttpSessionListener</listener-class> </listener> <!-- 配置HttpSession对象的销毁时机 --> <session-config> <!--配置HttpSession对象的1分钟之后销毁 --> <session-timeout>1</session-timeout> </session-config> <!--注册针对ServletRequest对象进行监听的监听器--> <listener> <description>ServletRequestListener监听器</description> <listener-class>com.servlet.study.listener.MyServletRequestListener</listener-class> </listener> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>