监听器

本文详细介绍了Servlet规范中的八种监听器,包括它们如何监听ServletContext、HttpSession和ServletRequest对象的生命周期事件,以及这些对象中属性的变化。同时介绍了感知型监听器的工作原理。

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

观察者设计模式(监听器)
1.事件源:发生事件的对象
2、监听器:监听事件源上的发送的事件
3、事件对象:每发生一个事件都会产生一个事件对象,事件对象中封装了事件源

七、Servlet规范中的8个监听器
1监听ServletContext、HttpSession、ServletRequest对象的创建和销毁的监听器

注册监听:web.xml

ServletContextListener
/*
非常有用:
ServletContext初始化一次,contextInitialized也就调用一次
完成系统启动时的初始化工作。

比如:
一个配置文件中定义了很多的JavaBean
<beans>
    <bean id="xxDao1" class="XXXDao1Impl"/>
    <bean id="xxDao2" class="XXXDao2Impl"/>
    ...
</beans>

问题:用某个dao。在用dao实例时已经创建好的对象效率要高

在启动时,读取xml配置文件,把所有的bean都实例化,并放到内存中。

Spring:


 */
public class MyServletContextListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        ServletContext sc = sce.getServletContext();
        System.out.println("ServletContext对象创建了"+sc);
    }

    public void contextDestroyed(ServletContextEvent sce) {
        ServletContext sc = sce.getServletContext();
        System.out.println("ServletContext对象销毁了"+sc);
    }

}

这里写图片描述

/*
统计当前有多少个客户端在访问
 */
public class MyHttpSessionListener implements HttpSessionListener {

    //第一次调用 request.getSession()时
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println(se.getSession()+"创建了一个会话对象");
    }

    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println(se.getSession()+"会话对象销毁了");
    }

}
ServletRequestListener:统计网站中资源的访问次数
Map<String,Integer>  key:资源的URL,value:访问次数

2监听ServletContext、HttpSession、ServletRequest对象中域中数据变化的监听器
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener

public class MyServletContextAttributeListener implements
        ServletContextAttributeListener {

    public void attributeAdded(ServletContextAttributeEvent scab) {
        System.out.println("添加了新数据");
    }

    public void attributeRemoved(ServletContextAttributeEvent scab) {
        System.out.println("移除了数据");

    }

    public void attributeReplaced(ServletContextAttributeEvent scab) {
        System.out.println("数据被替换了");
    }

}

3感知型监听器:不需要注册。谁实现了该类型的监听器,就能检测到自身的变化
HttpSessionBindingListener:感知自己何时被绑/解绑HttpSession域中。
HttpSessionActivationListener:感知自己何时随着HttpSession钝化/激活。

//当调用session.setAttribute("user", new User());时就会触发user中的方法

public class User implements Serializable, HttpSessionBindingListener,
        HttpSessionActivationListener {

    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println("被钝化了");
    }

    public void sessionDidActivate(HttpSessionEvent se) {
        System.out.println("被激活了");
    }

    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("绑定到了HttpSession域中");
    }

    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("从HttpSession域中解绑了");
    }

}
web.xml

//配置session的会话时间
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

//注册监听器
<listener>
    <listener-class>com.itheima.listener.MyServletContextListener</listener-class>
  </listener>
  <listener>
    <listener-class>com.itheima.listener.MyHttpSessionListener</listener-class>
  </listener>
  <listener>
    <listener-class>com.itheima.listener.MyServletContextAttributeListener</listener-class>
  </listener>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值