Listenner学习

一、listener

1.概述

  • 当web 应用在web容器中运行时,应用内部会不断的发生各种事件:如web应用被启动、应用停止,用户session的开始、结束,用户请求的到达等。通常来说,这些web 事件对开发者这透明的。listener可以监听这些web应用的内部事件,从而允许当事件触发时回调监听器内的方法。
  • Servlet 2.3 规范以后加入了listener,用于监听web 应用中的事件,并根据需求作出适当的响应
  • 根据监听对象不同,可将Listener分为三类:
    1.监听ServletContext
    2.监听Session
    3.监听Request
  • 使用Listener 只需要两个步骤:1.定义Listener实现类 2. 配置Listener实现类

2. ServletContext监听器
Servlet上下文监听器有两个:ServletContextListener、ServletContextAttributeListener
1.ServletContextListener
用于监听web应用的启动和关闭,对应的事件类为ServletContextEvent。该接口提供了2个方法:

  • contextInitialized(ServletContextEvent event)方法:启动web应用时(ServletContext对象创建时)调用此方法进行处理
  • contextDestroyed(ServletContextEvent event)方法:当ServletContext对象销毁时(关闭web容器或重新加载应用),调用此方法进行处理

    上述两个方法都需要一个ServletContextEvent类型的参数,该类只有一个方法,即ServletContext getServletContext()来获得ServletContext对象

2.ServletContextAttributeListener 该接口用于监听ServletContext(application范围)内属性的变化。事件类:ServletContextAttributeEvent,该接口提供了3个方法:

  • void attributeAdded(ServletContextAttributeEvent event ):当ServletContext中增加一个属性时,将会调用此方法处理
  • void attributeRemoved(ServletContextAttributeEvent event ):当ServletContext中删除一个属性时,将会调用此方法处理
  • void attributeReplaced(ServletContextAttributeEvent event ):当ServletContext中修改一个属性时,将会调用此方法处理

3. Session监听
针对Session会话的监听器有4个:

1.HttpSessionListener
该接口用于监听HTTP会话的创建和销毁,共两个方法:

  • sessionCreate(HttpSessionEvent event):当一个HttpSession对象被创建时,调用方法处理
  • sessionDestroyed(HttpSessionEvent event) :当一个HttpSession超时,或销毁时 调用方法处理
  • 这两个方法的参数都是HttpSessionEvent,该类的getSession()方法返回当前创建的Session对象

2.HttpSessionAttributeListener
监听HttpSession (session范围)中属性的变化,事件类HttpSessionBindingEvent,该接口提供三个方法

  • attributeAdded(HttpSessionBindingEvent event ):当Session中增加一个属性时,将会调用此方法处理
  • attributeRemoved(HttpSessionBindingEvent event ):当Session中删除一个属性时,将会调用此方法处理
  • attributeReplaced(HttpSessionBindingEvent event ):当Session中修改一个属性时,将会调用此方法处理
  • HttpSessionBindingEvent有三个常用方法:getName()、getValue()、getSession()

3.HttpSessionActivationListener
该接口用于监听HTTP会话的有效(active)、无效(passivate)情况,该接口提供两个方法:

  • sessionDidActivate(HttpSessionEvent event ) : 当session变为有效状态时,调用此方法处理
  • sessionWillPassivate(HttpSessionEvent event) : 当session变为无效状态时,调用此方法处理

4.HttpSessionBindingListener
该接口用于监听HTTP会话中,对象的绑定信息,它是唯一不需要在web.xml中配置的listener,2个方法:

  • valueBound(HttpSessionBindingEvent event ) : 当有对象加入到Session中,自动调用,处理
  • valueUnBound(HttpSessionBindingEvent event) : 当有对象从Session中移除时,自动调用、处理

Request监听
利用该类监听器可以监听用户的请求,有两个监听器:

1.ServletRequestListener接口:
可以方便地监听请求的创建和销毁,可以通过实现该监听器来监听每个请求,实现系统日志;该接口提供两个方法:

  • requestInitialized(ServletRequestEvent event ) : 当request创建时调用
  • requestDestroyed(ServletRequestEvent event) : 当Request销毁时调用
  • ServletRequestEvent 事件类常用方法 getServletRequest()

    2.ServletRequestAttributeListener:
    监听ServletRequest (request范围)中属性的变化,提供3个方法:

  • attributeAdded(ServletRequestAttributeEvent event ):当Request 中增加一个属性时,将会调用此方法处理

  • attributeRemoved(ServletRequestAttributeEvent event):当Request 中删除一个属性时,将会调用此方法处理
  • attributeReplaced(ServletRequestAttributeEvent event ):当Request 中修改一个属性时,将会调用此方法处理
  • ServletRequestAttributeEvent类常用方法:getName()、getValue()

实现Listener
以实现ServletRequestListener为例:
//可以采用一个监听器类实现多个监听器接口,来监听多种事件

@WebListener
public class RequestListener implements ServletRequestListener, ServletRequestAttributeListener {

    @Override
    public void attributeAdded(ServletRequestAttributeEvent arg0) {
        // TODO Auto-generated method stub
        ServletRequest request = arg0.getServletRequest();
        String name= arg0.getName();
        Object value = arg0.getValue();
        System.out.println(request+"范围添加了名为"+name+"值为"+value+"的属性!");
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent arg0) {
        // TODO Auto-generated method stub
        ServletRequest request = arg0.getServletRequest();
        String name= arg0.getName();
        Object value = arg0.getValue();
        System.out.println(request+"范围remove了名为"+name+"值为"+value+"的属性!");
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent arg0) {
        // TODO Auto-generated method stub
        ServletRequest request = arg0.getServletRequest();
        String name= arg0.getName();
        Object value = arg0.getValue();
        System.out.println(request+"范围replace了名为"+name+"值为"+value+"的属性!");
    }

    @Override
    public void requestDestroyed(ServletRequestEvent arg0) {
        // TODO Auto-generated method stub
        HttpServletRequest request = (HttpServletRequest)arg0.getServletRequest();
        System.out.println("----发向"+request.getRequestURI()+"的请求被销毁!");
    }

    @Override
    public void requestInitialized(ServletRequestEvent arg0) {
        // TODO Auto-generated method stub
        HttpServletRequest request = (HttpServletRequest)arg0.getServletRequest();
        System.out.println("----发向"+request.getRequestURI()+"的请求被初始化!");
    }

}

配置Listener

配置Listener只需要向web应用注册Listener实现类即可,无须配置参数之类

  • web.xml中配置
<listener>
    <listener-class>com.test.RequestListener</listener-class>
  </listener>
  <!-- Listener配置信息必须在Filter和Servlet配置之前,Listener的初始化(ServletContentListener初始化)比Servlet和Filter都优先,而销毁比Servlet和Filter都慢 -->
  • @WebListener 修饰Listener实现类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值