监听在Java体系中运用的很广泛,在安卓开发、JavaWeb开发中到处存在,在其他语言也有类似的,如果有了解过设计模式那很容易理解实现的原理。不过对于开发者来说,使用观察者模式只需实现相应的接口就好,所以很方便。在Servlet2.5中有8种的Listener,Session、Request、Context的创建与销毁、属性变化对应6种还有2个是对Session内对象的监听。

一、监听对象的创建与销毁

1.ServletRequestListener:监听Request的创建和监听

JavaWeb之Listener监听器

每次请求都会执行requestInitialized(ServletRequestEvent sre)方法,request处理完毕自动销毁前会执行requestDestroyed(ServletRequestEvent sre)方法。

ServletRequestEvent的API可以看下图,里面有一个getServletContext()方法可以获得值改变后的getServletContext

JavaWeb之Listener监听器

2.HttpSessionListener:监听Session的创建和监听

JavaWeb之Listener监听器

Session创建时执行sessionCreated(HttpSessionEvent se)方法,当Session销毁失效时执行sessionDestroyed(HttpSessionEvent se)方法。下面再看下HttpSessionEvent对象。

JavaWeb之Listener监听器

从API可以看到可以通过getSession()方法获取改变后的session对象。

3.ServletContextListener:监听Context的创建和销毁

JavaWeb之Listener监听器

通知将开始 Web 应用程序初始化过程。在初始化 Web 应用程序中的所有过滤器或 servlet 之前,应该通知所有 ServletContextListener 关于上下文初始化的信息。通知即将关闭 servlet 上下文。在通知所有 ServletContextListener 上下文销毁之前,所有 servlet 和过滤器都已销毁。下图是ServletContextEvent类。

 JavaWeb之Listener监听器

可以通过getServletContext()方法来获得改变后的ServletContext对象。

二、监听对象的属性变化

1.HttpSessionAttributeListener:监听Session的改变,Session的增加、删除和替换

JavaWeb之Listener监听器

下面再查下API看看HttpSessionBindingEvent对象

JavaWeb之Listener监听器

可以通过该对象获取session的name和值value。

2.ServletRequestAttributeListener:监听Request属性的改变

JavaWeb之Listener监听器

下面是ServletRequestAttributeEvent对象

JavaWeb之Listener监听器

可以通过属性的Name和Value。

3.ServletContextAttributeListener:用于监听上下文属性的改变

JavaWeb之Listener监听器

下图是ServletContextAttributeEvent类

JavaWeb之Listener监听器

也是获取Name和Value,和上面的基本类似。

三、监听Session内的对象

这两个与其他的就有点不一样了。

1.HttpSessionBindingListener

首先看它的接口

JavaWeb之Listener监听器

当对象被放到Session里时会执行valueBound(HttpSessionBindingEvent event)方法,当对象从Session中移除时会执行valueUnbound(HttpSessionBindingEvent event)方法,不过对象要实现这个接口。

2.HttpSessionActivationListener

JavaWeb之Listener监听器

服务器关闭时会将Session的内容保存到硬盘,这个过程叫钝化。服务器重启时会将Session内容从内容中加载,钝化会执行sessionDidActivate(HttpSessionEvent se)方法,重新加载会执行sessionWillPassivate(HttpSessionEvent se),对象也是要实现这个接口。

四、实验

上面算是把8个监听对象理论学习了下,下面利用上面的来做个实验。

1.创建

还是和Filter一样,以HelloWorld为基础,不重新创建包了,直接在com.test.cyw包中创建一个Listener,实现了6个接口。同时新建了一个Person类实现了Session内对象监听的两个接口

JavaWeb之Listener监听器

点击下一步可以选择要实现哪些监听接口.除了上面介绍的几个接口,还有几个新的接口,这里不再一一介绍,不过都是实现接口。

JavaWeb之Listener监听器

JavaWeb之Listener监听器

2.实现

1.创建一个Person类继承HttpSessionActivationListener, HttpSessionBindingListener实现这两个接口

package com.test.cyw;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;

public class Person implements HttpSessionActivationListener, HttpSessionBindingListener {

    public Person(String name, int age) {
        
        Name = name;
        Age = age;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public int getAge() {
        return Age;
    }

    public void setAge(int age) {
        Age = age;
    }

    private String Name;
    private int Age;
    @Override
    public void valueBound(HttpSessionBindingEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("HttpSessionBindingListener_valueBound  Name:"+arg0.getName()+"Value:"+arg0.getValue());

    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("HttpSessionBindingListener_valueUnbound  Name:"+arg0.getName()+"Value:"+arg0.getValue());
    }

    @Override
    public void sessionDidActivate(HttpSessionEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("HttpSessionActivationListener_sessionDidActivate");
    }

    @Override
    public void sessionWillPassivate(HttpSessionEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("HttpSessionActivationListener_sessionWillPassivate");
    }

}
View Code

相关文章: