在WEB中监听器的监听对象也就是针对域对象【application/session/request/pageContext(不用)】的创建、销毁以及域对象属性对象的添加、移除。
监听三个域对象的创建和销毁的监听器 ( 类型名Listener)
ServletContextListener
HttpSessionListener
ServletRequestListener
监听三个域对象的属性变更的监听器(属性添加,修改,移除) (类型名AttributeListener)
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
实现监听器步骤
①自定义类实现对应的监听器接口
public class MyListener implements ServletRequestListener,HttpSessionListener,ServletContextListener,HttpSessionAttributeListener { @Override public void requestInitialized(ServletRequestEvent sre) { System.out.println("===ServletRequest:创建...==="); } @Override public void requestDestroyed(ServletRequestEvent sre) { System.out.println("===ServletRequest:销毁...==="); } // ================================================================= @Override public void sessionCreated(HttpSessionEvent hse) { System.out.println("===HttpSession:创建...==="); } @Override public void sessionDestroyed(HttpSessionEvent hse) { System.out.println("===HttpSession:销毁...==="); } // ================================================================= @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("===ServletContext:创建...==="); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("===ServletContext:销毁...==="); } // ================================================================= @Override public void attributeAdded(HttpSessionBindingEvent hsbe) { System.out.println("===添加属性===");//session存值 } @Override public void attributeReplaced(HttpSessionBindingEvent hsbe) { System.out.println("===修改、覆盖属性==="); } @Override public void attributeRemoved(HttpSessionBindingEvent hsbe) { System.out.println("===移除属性==="); } }
②在web.xml中配置监听器
<?xml version="1.0" encoding="utf-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="false"> <listener> <listener-class>com.zhengqing.listener.MyListener</listener-class> </listener> </web-app>
分别访问jsp、html、servlet,对应的三个域对象是否会创建??
|
request【请求对象】 |
session【getSession】 |
servletContext【服务器启动时】 |
jsp |
会 |
会【当前用户首次访问】 |
不会 |
html |
会 |
不会 |
不会 |
servlet |
会 |
不会【当首次访问,而且存在getSession,就会创建】 |
不会 |
监听域对象的创建和销毁
ServletRequest
创建:客户端向服务器发送一次请求,服务器就会创建request对象.
销毁:服务器对这次请求作出响应后就会销毁request对象.
HttpSession
创建: 服务器端第一次调用getSession()
销毁: ①非正常关闭服务器(正常关闭session会序列化)
②session过期了默认30分钟
③手动调用 session.invalidate();
ServletContext
创建:服务器启动的时候,服务器为每个WEB应用创建一个属于该web项目的对象ServletContext
销毁:服务器关闭或者项目从服务器中移除的时候