JavaWeb中三大组件(Servlet、Filter、listener)之 listtener(监听器)干货详解(十一)

 

监听器

 

一.简述&入门

为什么要学习监听器:复杂特效,项目环境监控。

 

  • 所谓的监听器是指对整个WEB环境的监控,当被监视的对象发生改变时,立即调用相应的方法进行处理。

 

Java GUI

安卓

 

监听器入门:

 

 

 

 

 

代码:

/**
 * 监控ServletContext对象
 * 创建
 * 销毁
 */
public class MyListener1 implements ServletContextListener {
    /**
     * ServletContext被创建时,触发该方法
     * @param servletContextEvent
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("servletContext被创建了");
    }
    /**
     * ServletContext被销毁时,触发该方法
     * @param servletContextEvent
     */
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext被销毁了");
    }
}

 

监听器:JS中

//监听器

function run1(){

alert(“一点就炸”);

}

 

<input type=”button” value=”点我有惊喜” οnclick=”run1()”/>

 

应用场景:

  1. 项目启动时(ServletContext创建),读取硬盘上的数据(初始化)
  2. 项目关闭时(ServletContext销毁),保存程序中未完成的运算数据

 

 

 

 

二.监听器术语

专门监听ServletContext对象的创建和销毁

  • 事件源:被监听的对象。(ServletContext)
  • 事件:事件源所产生的特定动作。(创建和销毁)
  • 监听器:处理事件源所产生的事件。(ServletContextListener)
  • 注册(绑定)监听器:把监听器和事件源进行绑定。

缺一不可

 

 

 

三.常见8个监听器

JavaWeb常见8个监听器,接口。

 

  • 监听:域对象的创建销毁。

ServletContext:ServletContextListener

HttpSession:HttpSessionListener

HttpServletRequest:ServletRequestListener

这类监听器监听事件:

       创建、销毁

 

这类监听器事件对象:获取事件源对象

 

  • 监听:域对象键值对的 添加、替换、删除

ServletContext:ServletContextAttributeListener

HttpSession:HttpSessionAttributeListener

HttpServletRequest:ServletRequestAttributeListener

这类监听器,专门监听域对象 键值对的:  添加、替换、删除

 

代码:

Servlet:

/**
 * 操作session中的键值对
 * @return
 */
public String run1(){
    //1、向session中添加一个键值对
    getSession().setAttribute("uname","小煌煌");
    //2、向session中替换一个键值对
    getSession().setAttribute("uname","啊sir");
    //3、从session中删除一个键值对
    getSession().removeAttribute("uname");
    return null;
}

 

 

监听器

/**
 * 监听HttpSession作用域中,键值对的
 * 添加、替换、删除
 */
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
    /**
     * session中添加一个键值对,就会触发该方法
     * @param httpSessionBindingEvent
     */
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("监控到:session中添加了一个键值对");
        //1、获取到session对象
        HttpSession session = httpSessionBindingEvent.getSession();
        //2、获取到触发该方法的键值对
        System.out.println("键:"+httpSessionBindingEvent.getName());
        System.out.println("值:"+httpSessionBindingEvent.getValue());
    }
    /**
     * session中删除一个键值对,就会触发该方法
     * @param httpSessionBindingEvent
     */
    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("监控到:session中删除了一个键值对");
        //1、获取到session对象
        HttpSession session = httpSessionBindingEvent.getSession();
        //2、获取到触发该方法的键值对
        System.out.println("键:"+httpSessionBindingEvent.getName());
        System.out.println("值:"+httpSessionBindingEvent.getValue());
    }
    /**
     * session中替换一个键值对,就会触发该方法
     * @param httpSessionBindingEvent
     */
    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("监控到:session中替换了一个键值对");
        //1、获取到session对象
        HttpSession session = httpSessionBindingEvent.getSession();
        //2、获取到触发该方法的键值对
        System.out.println("键:"+httpSessionBindingEvent.getName());
        System.out.println("值:"+httpSessionBindingEvent.getValue());
    }
}

 

 

 

 

小结:

该类监听器。

事件对象:

  1. 获取事件源对象
  2. 触发事件的键值对   getName()  getValue()

 

  • 监听:特殊JavaBean在session中的状态

HttpSessionBindingListener: 监听某个特殊JavaBean在session中的绑定和解除绑定操作

       绑定:设置键值对

      解除绑定:删除键值对

      特殊:定义一个JavaBean,实现该接口即可

 

HttpSessionActivationListener:监听某个特殊JavaBean在session中,

钝化(序列化,把内存数据保存到硬盘上)和活化(反序列化,把硬盘数据读取回内存中)

 

 

 

代码:

public class Person implements Serializable,HttpSessionBindingListener {
    private String name;
    /**
     * 当该JavaBean对象被绑定到session上时,触发该方法
     * @param httpSessionBindingEvent
     */
    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("我被绑定到session上了");
        //1、获取事件源
        HttpSession session = httpSessionBindingEvent.getSession();
        //2、获取触发该事件的键值对
        String name = httpSessionBindingEvent.getName();
        Object value = httpSessionBindingEvent.getValue();
    }
    /**
     * 当该JavaBean对象被从session上解除绑定时,触发该方法
     * @param httpSessionBindingEvent
     */
    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("我被session遗弃了,解除绑定了");
    }
}

 

Servlet:

/**
 * 操作特殊JavaBean
 * @return
 */
public String run2(){
    //1、绑定
    Person p1 = new Person("张公子");
    getSession().setAttribute("xx",p1);
    //2、解除绑定
    getSession().removeAttribute("xx");
    return null;
}

 

 

小结:

1、HttpSessionBindingListener不用在web.xml中注册

2、HttpSessionBindingListener仅能监听自己在session中的状态

 

HttpSessionAttributeListener:

①需要在web.xml中注册

 ②监听SESSION中所有的键值对

 

 

 

 

看完恭喜你,又知道了一点点!!!

你知道的越多,不知道的越多! 

~感谢志同道合的你阅读,  你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!

注: 如果本篇有需要改进的地方或错误,欢迎大神们指定一二~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值