监听器

概述

监听器: 主要是用来监听特定对象的创建或销毁、属性的变化的!
             是一个实现特定接口的普通java类!

对象:
    自己创建自己用 (不用监听)
    别人创建自己用 (需要监听)

Servlet中哪些对象需要监听?
    request / session / servletContext
    分别对应的是request监听器、session相关监听器、servletContext监听器

监听器(listener)


监听器接口:
一、监听对象创建/销毁的监听器接口
    Interface ServletRequestListener     监听request对象的创建或销毁
    Interface HttpSessionListener        监听session对象的创建或销毁
    Interface ServletContextListener     监听servletContext对象的创建或销毁
二、监听对象属性的变化
    Interface ServletRequestAttributeListener 监听request对象属性变化: 添加、移除、修改
    Interface HttpSessionAttributeListener    监听session对象属性变化: 添加、移除、修改
Interface ServletContextAttributeListener  监听servletContext对象属性变化

三、session相关监听器
    Interface HttpSessionBindingListener   监听对象绑定到session上的事件   
    Interface HttpSessionActivationListener(了解) 监听session序列化及反序列化的事件

生命周期监听器

生命周期监听器: 监听对象的创建、销毁的过程!
    ServletRequestListener
    HttpSessionListener
    ServletContextListener
监听器开发步骤:
    1.  写一个普通java类,实现相关接口;
    2.  配置(web.xml)
/**
 *  监听request对象的创建或销毁
 */
public class MyRequestListener implements ServletRequestListener{

    // 对象销毁
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        // 获取request中存放的数据
        Object obj = sre.getServletRequest().getAttribute("cn");
        System.out.println(obj);
        System.out.println("MyRequestListener.requestDestroyed()");
    }

    // 对象创建
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("MyRequestListener.requestInitialized()");
    }
}
/**
 * 监听Session对象创建、销毁
 */
public class MySessionListener implements HttpSessionListener{

    // 创建
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("MySessionListener.sessionCreated()");
    }

    // 销毁
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("MySessionListener.sessionDestroyed()");
    }
}
/**
 * 监听ServletContext对象创建或销毁
 */
public class MyServletContextListener implements ServletContextListener{

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("MyServletContextListener.contextDestroyed()");
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
                     System.out.println("1..........MyServletContextListener.contextInitialized()");
    }
}
Web.xml
<!-- 监听request对象创建、销毁 -->
<listener>
    <listener-class>cn.itcast.a_life.MyRequestListener</listener-class>
</listener>

<!-- 监听session对象创建、销毁 -->
<listener>
    <listener-class>cn.itcast.a_life.MySessionListener</listener-class>
</listener>

<!-- 监听servletContext对象创建、销毁 -->
<listener>
    <listener-class>cn.itcast.a_life.MyServletContextListener</listener-class>
</listener>

属性监听器

监听: request/session/servletContext 对象属性的变化!
    ServletRequestAttributeListener
    HttpSessionAttributeListener
    ServletContextAttributeListener

总结:先写类,实现接口;  再配置
/**
 * 监听session对象属性的变化
 */
public class MySessionAttrListener implements HttpSessionAttributeListener {

    // 属性添加
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        // 先获取session对象
        HttpSession session = se.getSession();
        // 获取添加的属性
        Object obj = session.getAttribute("userName");
        // 测试
        System.out.println("添加的属性:" + obj);
    }

    // 属性移除
    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        System.out.println("属性移除");
    }

    // 属性被替换
    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        // 获取sesison对象
        HttpSession session = se.getSession();

        // 获取替换前的值
        Object old = se.getValue();
        System.out.println("原来的值:" + old);

        // 获取新值
        Object obj_new = session.getAttribute("userName");
        System.out.println("新值:" + obj_new);    
    }
}
web.xml
<!-- 属性监听器 -->
    <listener>
        <listener-class>cn.itcast.b_attr.MySessionAttrListener</listener-class>
    </listener>

其他监听器

session相关监听器
    HttpSessionBindingListener
    监听对象绑定/解除绑定到sesison上的事件!

步骤:
    对象实现接口; 再把对象绑定/解除绑定到session上就会触发监听代码。
作用:
    (上线提醒!)
/**
 * 监听此对象绑定到session上的过程,需要实现session特定接口
 */
public class Admin implements HttpSessionBindingListener {
    //… 省略get/set
    // 对象放入session
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("Admin对象已经放入session");
    }
    // 对象从session中移除
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("Admin对象从session中移除!");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值