已定义好的监听器
Servlet规范中已经定义好的监听器有8个,他们分别要建听的对象时request、session、ServletContext对象,触发监听器的事件时这三个对象的创建、销毁与他们域属性空间中的属性的添加、删除、修改以及session的钝化与活化操作
请求对象监听器(创建销毁)
只要监听器类实现ServletRequestListener并用注解注册监听器即可
@WebListener
public class MyRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("请求对象被创建");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("请求对象被销毁");
}
}
请求的域属性的监听器(添加、删除、重置属性)
只要监听器类实现ServletRequestAttributeListener并用注解注册监听器即可
可以通过事件对象获取域属性的名称、值、事件源等
@WebListener
public class ServletRequestAtrributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("添加域属性"+srae.getName()+"="+srae.getValue());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("删除域属性");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("重置域属性");
}
Session监听器(创建和销毁)
只要监听器类实现HttpSessionListener并用注解注册监听器即可
@WebListener
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session被创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session被销毁");
}
}
Session域属性监听器(创建删除修改)
@WebListener
public class sessionAttribute implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
}
}
通过事件可以获取的到的信息
ServletContext监听器(创建、销毁)
ServletContext在一个应用中只有一个,且是在服务器启动时创建。ServletContext的生命周期与整个应用相同,所以当项目重新部署,或Tomcat正常关闭时,可以销毁ServletContext
@WebListener
public class ServletContexteListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
ServletContext域属性监听器(创建销毁修改)
@WebListener
public class ServletContextAttribute implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
}
}
Session绑定监听器(绑定值、解绑)
实体类实现接口HttpSessionBindingListener
作用:将实现了这个接口的实体类对象放到Session域的时候,或者从Session域中删除时,都会触发对应的方法
该监听器不需要注册
//该建听器不需要注册
public class SessionBindingListener implements HttpSessionBindingListener {
private int age;
private String name;
public SessionBindingListener() {
}
public SessionBindingListener(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "SessionBindingListener{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
//当当前类的对象绑定到Session时,放入到Session域里面会触发该方法执行
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println(event.getName()+"="+event.getValue()+": xx对象放入到Session域里");
}
//解绑时触发该方法
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println(event.getName()+"="+event.getValue()+": xx对象从Session域里解绑");
}
}
Session钝化与活化监听器
该监听器用于建听在Session中存放的指定类型对象的钝化与活化
钝化:将内存中的数据写入到硬盘中
活化:将硬盘中的数据恢复到内存
作用:当用户正在访问的应用或者该应用所在的服务器由于种种原因被停掉,短时间内又重启,此时用户访问时的Session中的数据是不能丢失的,需要在关闭应用前将数据写入到硬盘,再重启后应可以立即重新恢复Session中的数据。这就是钝化与活化
实体类实现接口HttpSessionActivationListener,同时还要实现序列化接口,
不需要注册
//不需要注册
//同时还需要实现序列化Serializable接口才能活化
public class SessionActivationListener implements HttpSessionActivationListener, Serializable {
private int age;
private String name;
public SessionActivationListener() {
}
public SessionActivationListener(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "SessionBindingListener{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
//发生在钝化前
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("将要钝化");
}
//活化
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("已经活化");
}
}