servlet——Listener

本文深入解析Servlet监听器的原理及应用,包括观察者模式的运用,详细介绍了ServletRequestListener、ServletResquestAttributeListener、ServletContextListener等八个核心监听器接口的功能与实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 概述

  • Listener的设计采用了观察者模式
  • Servlet规范中已经定义好了八个监听器接口,它们要监听的对象分别是request、session、servletContext对象,触发监听器事件是这三个对象的创建和销毁,它们的域属性空间中的属性的添加、删除、修改,以及session的钝化和活化操作
  • 在JavaWeb项目中使用监听器,需要在web.xml文件中对监听器进行注册。
<listener>
     <listener-class>com.study.listener.MyRequestListener</listener-class>
</listener>

2 ServletRequestListener接口

    该监听器用于完成对Request对象的创建以及销毁的监听,即当Request对象被创建或者被销毁的时候,会触发该监听器中相应方法的执行。

void requestDestroyed(ServletRequestEvent sre)
void requestInitialized(ServletRequestEvent sre)

2.1 ServletRequestEvent

    ServletResquestEvent:SevletResquest对象生命周期的事件
    可以通过该ServletRequestEvent类的以下两个方法获取web应用的ServletContext对象和当前ServletRequest对象。

ServletContext getServletContext();//获取web应用的ServletContext对象
servletResquest getServletRequest();//获取当前的request对象

2.2 例子

public class MyResquestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("destory");
    }
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        ServletContext context = sre.getServletContext();
        ServletRequest request =sre.getServletRequest();
        System.out.println("init");
    }
}

在这里插入图片描述
    ServletRequestEvent对象由tomcat容器实例化,当浏览器请求web应用的任何资源,都会打印输出

3 SevletResquestAttributeListener

    该监听器用于完成对Request对象域属性添加、修改和删除的监听,即当Request对象域属性被添加、修改和删除时,会触发该监听器中相应方法的执行。
    该ServletRequestAttributeListener接口有三个方法需要实现:用于接收ServletRequest域属性被添加、删除或者修改时的通知。(监听ServletRequest域属性的添加、删除或者修改操作)

public void attributeAdded(ServletRequestAttributeEvent srae);
public void attributeRemoved(ServletRequestAttributeEvent srae);
public void attributeReplaced(ServletRequestAttributeEvent srae);

4 ServletContextListener

    该监听器用于完成对ServletContext对象的创建以及销毁的监听。在tomcat中实例为ApplictionContextFacade。由于ServletContext在一个应用中只有一个,且是在服务器启动时创建。另外,ServletContext的生命周期与整个应用的相同,所以当项目重新部署时,或者Tomcat正常关闭时(通过stop service关闭,不能是terminate关闭),可以销毁ServletContext。(其接口中定义的方法和ServletRequestListener接口方法定义类似)

5 ServletContextAttributeListener

    该监听器用于完成对ServletContext域属性空间中属性的添加、修改、删除操作的监听。(其接口定义的方法与ServletRequestAttributeListener接口定义的方法类似)

6 HttpSessionListener

    该监听器用于完成对Session对象的创建以及销毁的监听。(其接口中定义的方法和ServletRequestListener接口方法定义类似,与其不同的是,session对象在页面第一次访问的时候被创建,且只被创建一次。)

7 HtttpSessionAttributeListener

    该监听器用于完成对session域属性空间中属性的添加、修改、删除操作的监听。

8 HttpSessionBindingListener

    使对象在绑定session或者从session解绑时得以监听。

9 HttpSessionActivationListener

    该监听器用于监听在session中存放的指定类型对象的钝化与活化。

  • 钝化是指将内存中的数据写入到硬盘中,而活化是指将硬盘中的数据恢复到内存中。当用户正在访问的应用或者该应用所在的服务器由于种种原因被停掉,然后在短时间内又重启,此时用户再访问时session中的数据是不能丢失的,在应用关闭之前,需要将数据写入到硬盘中,在重启后可以立即重新恢复session中的数据,这就称之为session的钝化与活化。
  • 那么session中的哪些数据能够钝化呢?只有存放在JVM堆内存中的实现Serializable类的对象才能够被钝化。也就是说,对于字符串常量,基本数据类型等存放在JVM方法区中常量池常量,是无法被钝化的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值