Listener监听器生命周期

本文深入解析Servlet监听器的各类接口及其实现,包括生命周期监听器、属性变化监听器和session中指定类属性变化监听器。通过示例代码展示如何监听application、session和request对象的状态变化。

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

一、Listener生命周期

  listener是web三大组件之一,是servlet监听器,用来监听请求,监听服务端的操作。

  listener分为:(都是接口类,必须实现相应方法)

  1.生命周期监听器(3个)

      • ServletContextListener 
        • requestInitialized 在容器启动时被调用(在servlet被实例化前执行)
        • requestDestroyed 在容器销毁时调用(在servlet被销毁后执行)
      • HttpSessionListener
        • sessionCreated 在HttpSession创建后调用
        • sessionDestroyed 在HttpSession销毁前调用(执行session.invalidate();方法)
      • ServletRequestListener
        • requestDestroyed 在request对象创建后调用(发起请求)
        • requestInitialized 在request对象销毁前调用(请求结束)

  2.属性变化监听器(3个)

        • attributeAdded(ServletContextAttributeEvent event)  向appliction中添加属性时调用
        • attributeRemoved(ServletContextAttributeEvent event)  从appliction中删除属性时调用
        • attributeReplaced(ServletContextAttributeEvent event)  替换application中的属性时调用
      • HttpSessionAttributeListener
        • attributeAdded(HttpSessionBindingEvent event)
        • attributeRemoved(HttpSessionBindingEvent event)
        • attributeReplaced(HttpSessionBindingEvent event)
      • ServletRequestAttributeListener
        • attributeAdded(ServletRequestAttributeEvent event)
        • attributeRemoved(ServletRequestAttributeEvent event)
        • attributeReplaced(ServletRequestAttributeEvent event)

       以上监听器接口除了传参不同,方法名都是一样的。分别监听application,session,request对象的属性变化。

 

 

        3.session中指定类属性变化监听器(2)

      • HttpSessionBindingListener 
        • valueBound(HttpSessionBindingEvent event) 当该类实例设置进session域中时调用
        • valueUnbound(HttpSessionBindingEvent event) 当该类的实例从session域中移除时调用
      • HttpSessionActivationListener 
        • sessionWillPassivate(HttpSessionEvent se) 当对象session被序列化(钝化)后调用 
        • sessionDidActivate(HttpSessionEvent se)  当对象session被反序列化(活化)后调用
      •     

 二、测试范例

 1.生命周期监听:

  ServletContentAttribute_Listener.java

public class ServletContentAttribute_Listener implements ServletContextListener {
    /**
     * ServletContextListener实现方法
     * @param sce
     */
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContextListener初始化");
    }

    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContextListener销毁");
    }
}

其他两个监听器类似,不在重复贴出。

  在web.xml中配置

<!-- 监听器 -->
  <!-- servlet监听器 -->
  <listener>
    <listener-class>study.myListener.ServletContentAttribute_Listener</listener-class>
  </listener>

  <!-- session监听器 -->
  <listener>
    <listener-class>study.myListener.HttpSessionAttribute_Listener</listener-class>
  </listener>
  
  <!-- request监听器-->
  <listener>
    <listener-class>study.myListener.ServletRequestAttribute_Listener</listener-class>
  </listener>

运行结果:

 

2.属性监听:

  ServletContentAttribute_Listener.java

public class ServletContentAttribute_Listener implements ServletContextAttributeListener{

    /**
     * ServletContextAttributeListener实现方法
     * @param event
     */
    public void attributeAdded(ServletContextAttributeEvent event) {
        String meg = MessageFormat.format("ServletContent添加属性:{0},属性值:{1}",event.getName(),event.getValue());
        System.out.println(meg);
    }

    public void attributeRemoved(ServletContextAttributeEvent event) {
        String meg = MessageFormat.format("ServletContent删除属性:{0},属性值:{1}",event.getName(),event.getValue());
        System.out.println(meg);
    }

    public void attributeReplaced(ServletContextAttributeEvent event) {
        String meg = MessageFormat.format("ServletContent替换属性:{0},属性值:{1}",event.getName(),event.getValue());
        System.out.println(meg);
    }

}

 

另外两个监听器类似,不在赘诉。接下来用jsp页面测试

  listenerDemo.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2017/10/17
  Time: 15:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>监听器设置</title>
</head>
<body>
    <%
        /**
         * servlet监听
         */
        application.setAttribute("name","changxiang");
        application.setAttribute("name","小Cai先森");
        application.removeAttribute("name");

        /**
         * session监听
         */
        session.setAttribute("sessionName","changxiang");
        session.setAttribute("sessionName","小Cai先森");
        session.removeAttribute("sessionName");
        session.invalidate();
        /**
         * request监听
         */
        request.setAttribute("requestName","changxiang");
        request.setAttribute("requestName","小Cai先森");
        request.removeAttribute("requestName");
    %>
</body>
</html>

执行结果如下:

原作者:博客园小Cai先森,可以学习转载

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值