域对象创建和销毁的事件监听器就是用来监听ServletContext、HttpSession和HttpServletRequest这三个对象的创建和销毁事件的监听器。
域对象 | 创建时机 | 销毁时机 |
---|---|---|
ServletContext | Web服务器启动时为每个web应用程序创建相应的ServletContext对象。 | Web服务器关闭时为每个web应用程序销毁相应的ServletContext对象。 |
HttpSession | 浏览器开始与服务器会话时创建 | 调用HttpSession.invalidate();超过了session的最大有效时间间隔;服务器进程被停止。 |
ServletRequest | 每次请求开始时创建 | 每次访问结束后销毁 |
1、ServletContext
创建类实现ServletContextListener接口对application对象的创建,销毁进行监听,干预。
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ApplicationListener implements ServletContextListener {
public ApplicationListener() {
System.out.println("ApplicationListener构造方法");
}
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("ApplicationListener对象销毁了");
}
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("ApplicationListener对象创建了");
}
}
在web.xml内加入配置
<listener>
<listener-class>com.zzu.listener.ApplicationListener</listener-class>
</listener>
启动服务器,控制台输出为:
关闭服务器,控制台输出为:
2、HttpSession
创建类实现ServletContextListener接口对application对象的创建,销毁进行监听,干预。
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener {
public SessionListener() {
System.out.println("SessionListener构造方法");
}
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("SessionListener对象创建了");
}
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("SessionListener对象销毁了");
}
}
在web.xml内加入配置
<listener>
<listener-class>com.zzu.listener.SessionListener</listener-class>
</listener>
启动服务器,控制台输出为:
只有构造方法执行,对象并没有创建,不难理解,因为session是浏览器访问页面时所创建的一个会话,只有浏览器访问本web项目中的页面时,才会创建session。
打开本web项目的页面,控制台输出:
我们知道浏览器关闭只是中断了和Web服务器的联系,但是session对象依然存在服务器端,如果时间超时,则Web服务器将其删除,如果服务器关闭,则将对象序列化到SESSIONS.ser文件内,服务器重新启动,则将该文件中session对象重新反序列化。。所以我们要监听session销毁则必须在web.xml中加入以下配置:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
等待1分钟,控制台输出:
3、ServletRequest
创建类实现ServletContextListener接口对application对象的创建,销毁进行监听,干预。
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class RequestListener implements ServletRequestListener {
public RequestListener() {
System.out.println("RequestListener构造方法");
}
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("request对象销毁了");
}
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("request对象创建了");
}
}
在web.xml内加入配置
<listener>
<listener-class>com.zzu.listener.RequestListener</listener-class>
</listener>
启动服务器,控制台输出为:
只有构造方法执行,对象并没有创建,不难理解,因为此时没有请求发出,打开本web项目的页面,控制台输出:
执行顺序
执行顺序与web.xml中配置顺序有关,配置在前执行在前。