Servlet规范中的监听器

已定义好的监听器

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("已经活化");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值