Servlet事件监听器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MyBabyChao/article/details/82353673

Servlet事件监听器

Servlet事件监听器是实现一个或多个Servlet事件监听器接口的类,支持在ServletContext、HttpSession和ServletRequest状态改变时进行事件通知。

在JavaWeb中,若要对ServletContext、HttpSession和ServletRequest这三大域对象的创建销毁属性发生修改事件进行监听,实现相应的监听器接口即可。

Servlet事件监听器的分类

下面对常用的8个监听器进行分类。

先补充3个名词概念:
1. 事件源:事件是由谁产生的。
2. 事件对象:产生的事件
3. 监听器: 监听事件源产生的事件

对监听的事件源分别为ServletContext、HttpSession和ServletRequest三个域对象的操作,可以把监听器划分为三种类型:

  1. 域对象的生命周期监听:监听域对象的创建和销毁。
  2. 域对象的属性监听:监听域对象属性的增加、替换和删除。
  3. 感知监听(只与HttpSession域对象有关):监听绑定到HttpSession域中的某个对象的状态。

第一类:域对象的生命周期监听

  • 事件源:三大域
  • 事件对象:创建和销毁
  • 监听器:实现了ServletContextListener、HttpSessionListener、ServletRequestListener任一接口的类。

1. ServletContext的生命周期监听

(1) 编码

public class MyServletContextListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent arg0)  { 
        //项目启动调用
        System.out.println("ServletContext对象创建了。。。");
        //参数ServletContextEvent对象可以获取ServletContext对象
        //ServletContext servletContext = arg0.getServletContext();
    }

    public void contextDestroyed(ServletContextEvent arg0)  { 
        //项目关闭或服务器关闭时调用
        System.out.println("ServletContext对象销毁了。。。");
    }
}

(2)在web.xml文件中注册监听器

Web服务器会根据web.xml文件配置的监听器,把监听器注册到相应的对象上(这里的对象是ServletContext)。

配置如下:

<listener>
    <listener-class>com.mbc.listener.MyServletContextListener</listener-class>
</listener>

2. HttpSession的生命周期监听

(1)编码

public class MyHttpSessionListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent arg0)  {
        //Session产生时调用
        //产生:通过getSession()
        System.out.println("Session对象创建了。。。");
        //参数HttpSessionEvent对象可以获取Session对象
        //HttpSession session = arg0.getSession();
    }

    public void sessionDestroyed(HttpSessionEvent arg0)  { 
        //Session销毁时调用
        //销毁:1.到达Session的存活时间   2.非正常关闭服务器
        System.out.println("Session对象创建了。。。");
    }
}

(2)在web.xml文件中注册监听器

<listener>
    <listener-class>com.mbc.listener.MyHttpSessionListener</listener-class>
</listener>

 <!-- 配置HttpSession对象的销毁时机 -->
<session-config>
    <!-- 配置HttpSession对象在1分钟后销毁 -->
    <session-timeout>1</session-timeout>
</session-config>

3. ServletContext的生命周期监听

(1)编码

public class MyServletRequestListener implements ServletRequestListener {

    public void requestInitialized(ServletRequestEvent arg0)  { 
        //请求产生时调用
        System.out.println("ServletRequest对象创建了");
        //参数ServletRequestEvent对象可以获取ServletContext对象和ServletRequest对象
        //ServletContext servletContext = arg0.getServletContext();
        //ServletRequest servletRequest = arg0.getServletRequest();
    }

    public void requestDestroyed(ServletRequestEvent arg0)  { 
        //服务器完成对请求的响应时调用
        System.out.println("ServletRequest对象销毁了了");
    }
}

(2)在web.xml文件中注册监听器

<listener>
    <listener-class>com.mbc.listener.MyServletRequestListener</listener-class>
</listener>

第二类:域对象的属性监听

  • 事件源:三大域
  • 事件对象:属性的增加、替换和删除
  • 监听器:实现了ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener任一接口的类。

1. ServletContext的属性监听

(1)编码

public class MyServletContextAttributeListener implements ServletContextAttributeListener {
    public void attributeAdded(ServletContextAttributeEvent arg0)  { 
        //给ServletContext对象添加属性时调用
        System.out.println("添加了属性");
    }

    public void attributeRemoved(ServletContextAttributeEvent arg0)  { 
        //给ServletContext对象移除属性时调用
        System.out.println("移除了属性");
    }

    public void attributeReplaced(ServletContextAttributeEvent arg0)  {
        //给ServletContext对象替换属性时调用
        System.out.println("替换了属性");
    }
}

(2)在web.xml文件中注册监听器

<listener>
    <listener-class>com.mbc.listener.MyServletContextAttributeListener</listener-class>
</listener>

2.HttpSession的属性监听

(1)编码

public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
    public void attributeAdded(HttpSessionBindingEvent arg0)  { 
        //给HttpSession对象添加属性时调用
        System.out.println("添加了属性");
    }

    public void attributeRemoved(HttpSessionBindingEvent arg0)  { 
        //给HttpSession对象移除属性时调用
        System.out.println("移除了属性");
    }

    public void attributeReplaced(HttpSessionBindingEvent arg0)  { 
        //给HttpSession对象替换属性时调用
        System.out.println("替换了属性");
    }
}

(2)在web.xml文件中注册监听器

<listener>
    <listener-class>com.mbc.listener.MyHttpSessionAttributeListener</listener-class>
</listener>

3. ServletRequest的属性监听

(1)编码

public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
    public void attributeRemoved(ServletRequestAttributeEvent arg0)  { 
        //给ServletRequest对象添加属性时调用
        System.out.println("添加了属性");
    }

    public void attributeAdded(ServletRequestAttributeEvent arg0)  { 
        //给ServletRequest对象移除属性时调用
        System.out.println("移除了属性");
    }

    public void attributeReplaced(ServletRequestAttributeEvent arg0)  { 
        //给ServletRequest对象替换属性时调用
        System.out.println("替换了属性");
    }
}

(2)在web.xml文件中注册监听器

<listener>
    <listener-class>com.mbc.listener.MyServletRequestAttributeListener</listener-class>
</listener>

感知监听

  • 事件源:HttpSession
  • 事件对象:
    • 对象绑定到Session域中(session.setAttribute(“bean”, JavaBean))。
    • 对象从Session域中解除绑定(session.removeAttribute(“bean”))
    • 对象随Session对象钝化到存储设备中
    • 对象随Session对象从存储设备中活化
  • 监听器:实现了HttpSessionBindingListener、HttpSessionActivationListener任一接口的JavaBean对象。即对象监听自己在Session域中的状态。

1. HttpSessionBindingListener接口

实现了HttpSessionBindingListener接口的JavaBean对象可以监听自己被绑定到Session中或从Session中解绑的事件,不需要在web.xml中注册。

public class JavaBeanDemo1 implements HttpSessionBindingListener {
    private String name;

    public JavaBeanDemo1(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void valueBound(HttpSessionBindingEvent arg0)  {
        //当前对象被绑定到Session时调用
        String name = arg0.getName();
        System.out.println(name + "对象被绑定到Session中了");
    }

    public void valueUnbound(HttpSessionBindingEvent arg0)  { 
        //当前对象从Session中解绑时调用
        String name = arg0.getName();
        System.out.println(name + "对象从Session中解绑了");
    }
}

2. HttpSessionActivationListener接口

实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己随HttpSession活化和钝化的事件,不需要在web.xml中注册。

另外JavaBean对象能随HttpSession活化和钝化的前提是需实现Serializable接口。

public class JavaBeanDemo2 implements HttpSessionActivationListener, Serializable {

    private static final long serialVersionUID = 315490107646009757L;

    private String name;

    public JavaBeanDemo2(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void sessionWillPassivate(HttpSessionEvent arg0)  { 
        //当绑定到HttpSession对象中的JavaBean对象将要随HttpSession对象被钝化之前调用
        System.out.println(name+"要随HttpSession对象钝化到硬盘了,session的id为:"+ arg0.getSession().getId());
    }

    public void sessionDidActivate(HttpSessionEvent arg0)  { 
        //当绑定到HttpSession对象中的JavaBean对象将要随HttpSession对象被活化之前调用
         System.out.println(name+"要随HttpSession对象活化到内存了,session的id为:"+ arg0.getSession().getId());
    }
}

通过Tomcat设置钝化,在当前Web项目下的WebContent/META-INF下新建context.xml文件,填入如下内容:

<Context>
    <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
        <Store className="org.apache.catalina.session.FileStore" directory="test"/>
    </Manager>
</Context>    

maxIdleSwap="1":表示当用户超过1分钟不访问当前项目的话,绑定到HttpSession对象中的JavaBean对象会随HttpSession对象钝化到硬盘上

directory="test":表示钝化的文件会保存在test目录下,完整的目录为“Tomcat安装下的\work\Catalina\localhost\web项目名\test”。

猜你喜欢

转载自blog.csdn.net/MyBabyChao/article/details/82353673