监听器
服务器通过我们的监听器类监听ServletContext
、HttpSession
和ServletRequest
对象的变化,也就是JSP中的application
、session
和request
内置对象的变化,若这些对象创建、销毁、自定义属性发生变化,服务器就会自动调用监听器类对应的方法
对多个同类型的监听器由web.xml
中注册的顺序决定
常见的过滤器使用场景有:
- 统计在线人数
- 统计页面访问次数
- 应用启动时完成信息初始化工作
ServletContext对象监听器
- 实现
ServletContextListener
接口,重写contextInitialized()
和contextDestroyed()
方法,这两个方法本分别监听了ServletContext对象的创建与销毁,这两个方法都是默认方法,可选择性实现 - 实现
ServletContextAttributeListenerListener
,重写attributeAdded()
、attributeReplaced()
和attributeRemoved
方法,这三个方法监听ServletContext对象上的自定义属性的添加替换和删除,这三个方法都是默认方法,可选择性实现
package com;
import javax.servlet.*;
import javax.servlet.annotation.WebListener;
//@WebListener() //同样Listener也提供了注解的方式配置
public class MyServletContextListener implements ServletContextListener, ServletContextAttributeListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
//通过ServletContextEvent事件对象获取全局ServletContext对象,之后可执行相应的操作
System.out.println("MyServletContextListener 监听到servletContext初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
//通过ServletContextEvent事件对象获取全局ServletContext对象,之后可执行相应的操作
System.out.println("MyServletContextListener 监听到servletContext销毁");
}
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
String name = scae.getName();
Object value = scae.getValue();
//通过ServletContextAttributeEvent事件对象获取该变化的属性和值
System.out.println("MyServletContextListener 监听到servletContext添加了自定义属性");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
String name = scae.getName();
Object value = scae.getValue();
//通过ServletContextAttributeEvent事件对象获取该变化的属性和值
System.out.println("MyServletContextListener 监听到servletContext修改了自定义属性");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
String name = scae.getName();
Object value = scae.getValue();
//通过ServletContextAttributeEvent事件对象获取该变化的属性和值
System.out.println("MyServletContextListener 监听到servletContext删除了自定义属性");
}
}
web.xml
中的配置
<listener>
<listener-class>com.MyServletContextListener</listener-class> <!--只需要配置监听器的全类名即可-->
</listener>
HttpSession对象监听器
- 实现
HttpSessionListener
接口,重写sessionCreated()
和sessionDestroyed()
方法,这两个方法本分别监听了Session对象的创建与销毁,这两个方法都是默认方法,可选择性实现 - 实现
HttpSessionAttributeListener
,重写attributeAdded()
、attributeReplaced()
和attributeRemoved
方法,这三个方法监听ServletContext对象上的自定义属性的添加替换和删除,这三个方法都是默认方法,可选择性实现
package com;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.*;
@WebListener()
public class MyHttpSessionListener implements HttpSessionListener, HttpSessionAttributeListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
//通过HttpSessionEvent事件对象获取刚创建的Session对象,之后可执行相应的操作
System.out.println("MyHttpSessionListener 监听到一个Session对象被创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
//通过HttpSessionEvent事件对象获取刚销毁的Session对象,之后可执行相应的操作
System.out.println("MyHttpSessionListener 监听到一个Session对象被销毁");
}
@Override
public void attributeAdded(HttpSessionBindingEvent scae) {
String name = scae.getName();
Object value = scae.getValue();
HttpSession session = scae.getSession();
//通过ServletContextAttributeEvent事件对象获取该变化的属性和值,以及该session对象
System.out.println("MyHttpSessionListener 监听到Session对象添加了自定义属性");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent scae) {
String name = scae.getName();
Object value = scae.getValue();
HttpSession session = scae.getSession();
//通过ServletContextAttributeEvent事件对象获取该变化的属性和值,以及该session对象
System.out.println("MyHttpSessionListener 监听到Session对象修改了自定义属性");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent scae) {
String name = scae.getName();
Object value = scae.getValue();
HttpSession session = scae.getSession();
//通过ServletContextAttributeEvent事件对象获取该变化的属性和值,以及该session对象
System.out.println("MyHttpSessionListener 监听到Session对象删除了自定义属性");
}
}
web.xml
中的配置
<session-config>
<session-timeout>1</session-timeout><!--设置session失效时间,单位分钟-->
</session-config>
ServletRequest对象监听器
- 实现
ServletRequestListener
接口,重写requestInitialized()
和requestDestroyed()
方法,这两个方法本分别监听了request对象的创建与销毁,这两个方法都是默认方法,可选择性实现 - 实现
ServletRequestAttributeListener
,重写attributeAdded()
、attributeReplaced()
和attributeRemoved
方法,这三个方法监听ServletContext对象上的自定义属性的添加替换和删除,这三个方法都是默认方法,可选择性实现
package com;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
@WebListener()
public class MyServletRequestListener implements ServletRequestListener, ServletRequestAttributeListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
//通过ServletRequestEvent事件对象获取刚创建的请求对象,向下转型为HttpServletRequest对象之后方便可执行相应的操作
System.out.println("MyServletRequestListener 监听到请求对象被创建");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
//通过ServletRequestEvent事件对象获取刚创建的请求对象,向下转型为HttpServletRequest对象之后方便可执行相应的操作
System.out.println("MyServletRequestListener 监听到请求对象被销毁");
}
@Override
public void attributeAdded(ServletRequestAttributeEvent scae) {
String name = scae.getName();
Object value = scae.getValue();
//通过ServletContextAttributeEvent事件对象获取该变化的属性和值
System.out.println("MyServletRequestListener 监听到请求对象添加了自定义属性");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent scae) {
String name = scae.getName();
Object value = scae.getValue();
//通过ServletContextAttributeEvent事件对象获取该变化的属性和值
System.out.println("MyServletRequestListener 监听到请求对象修改了自定义属性");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent scae) {
String name = scae.getName();
Object value = scae.getValue();
//通过ServletContextAttributeEvent事件对象获取该变化的属性和值
System.out.println("MyServletRequestListener 监听到请求对象删除了自定义属性");
}
}
HttpSessionBindingListener对象绑定解绑监听器
Javabean类实现ServletRequestListener
接口,重写valueBound()
和valueUnbound()
方法,这两个方法本分别监听了该Javabean对象与session对象绑定或解绑,这两个方法都是默认方法,可选择性实现,该监听器无需注册
package com;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements HttpSessionBindingListener {
//属性、getter和setter都省略
@Override
public void valueBound(HttpSessionBindingEvent event) {
String name = event.getName();
Object value = event.getValue();
HttpSession session = event.getSession();
//通过HttpSessionBindingEvent事件对象获取绑定的该JavaBean
System.out.println("User对象绑定到Session对象");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
String name = event.getName();
Object value = event.getValue();
HttpSession session = event.getSession();
//通过HttpSessionBindingEvent事件对象获取解绑的该JavaBean
System.out.println("User对象与Session对象解绑");
}
}
Comments NOTHING