Servlet监听器

来源:互联网 发布:ugui drawcall 优化 编辑:程序博客网 时间:2024/06/07 02:44

一.监听器的概念

Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。

监听对象:

1、ServletContext:application,整个应用只存在一个

2、HttpSession:session,针对每一个对话

3、ServletRequest:request,针对每一个客户请求

监听内容:创建、销毁、属性改变事件

监听作用:可以在事件发生前、发生后进行一些处理,一般可以用来统计在线人数和在线用户、统计网站访问量、系统启动时初始化信息等。


二.监听器的基本使用

创建步骤:

1、创建一个实现监听器接口的类

2、配置web.xml文件,注册监听器

<listener>

   <listener-class>完整类名</listener-class>

</listener>

监听器的启动顺序:按照web.xml的配置顺序来启动

加载顺序:监听器 >过滤器>servlet


三.监听器的分类

1、按照监听的对象划分

1)用于监听应用程序环境对象(ServletContext)的事件监听器

    实现ServletContextListener、ServletContextAttributeListener接口

2)用于监听用户会话对象(HttpSeesion)的事件监听器

   实现HttpSessionListener、HttpSessionAttributeListener接口

3)用于监听请求消息对象(ServletRequest)的事件监听器

   实现ServletRequestListener、ServletRequestAttributeListener接口

2、按照监听事件划分

1、监听域对象自身的创建和销毁的事件监听器

根据监听对象不同分别实现ServletContextListener、HttpSessionListener、ServletRequestListener接口。

①ServletContext的创建和销毁:contextInitialized方法和contextDestroyed方法

publicvoid contextInitialized(ServletContextEvent sce)//ServletContext创建时调用

publicvoid contextDestroyed(ServletContextEvent sce)//ServletContext销毁时调用

主要用途:作为定时器、加载全局属性对象、创建全局数据库连接、加载缓存信息等

实例:

在web.xml中可以配置项目初始化信息,在contextInitialized方法中进行启动

<context-param>

    <param-name>属性名</param-name>

    <param-value>属性值</param-value>

</context-param>


自定义监听器:

public class MyFirstListenerimplements ServletContextListener{

   public void contextInitialized(ServletContextEvent sce){

        //获取web.xml中配置的属性

        Stringvalue=sce.getServletContext().getInitParameter("属性名");

        System.out.println(value);

  }

   public void contextDestroyed(ServletContextEvent sce){

        //关闭时操作

  }

}


②HttpSession的创建和销毁:sessionCreated和sessionDestroyed方法

public voidsessionCreated(HttpSessionEvent se)//session创建时调用

public voidsessionDestroyed(HttpSessionEvent se)//session销毁时调用

主要用途:统计在线人数、记录访问日志等

【注】

 web.xml配置session超时参数,单位:分,session超时的时间并不是精确的

<session-config>

   <session-timeout>10</session-timeout>

</session-config>


 ③ServletRequest的创建和销毁:requestInitialized和requestDestroyed方法

public voidrequestInitialized(ServletRequestEvent sre)//request创建时调用

public voidrequestDestroyed(ServletRequestEvent sre)//request销毁时调用

主要用途:读取request参数,记录访问历史


2、监听域对象中的属性的增加和删除的事件监听器

  根据监听对象不同分别实现ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener接口。

  实现方法:attributeAdded、attributeRemoved、attributeReplaced


3、监听绑定到HttpSeesion域中的某个对象的状态的事件监听器(创建普通JavaBean)

  HttpSession中的对象状态:绑定→解除绑定;钝化→活化

  实现接口及方法:HttpSessionBindingListener接口(valueBound和valueUnbound方法)、HttpSessionActivationListener接口(sessionWillPassivate和sessionDidActivate方法)

【注1】①要实现钝化和活化必须实现Serializable接口

             ②不需要在web.xml中注册

【注2】

  绑定:    通过setAttribute保存到session对象当中

  解除绑定:  通过removeAttribue去除

  钝化:    将session对象持久化到存储设备上

  活化:    将session对象从存储设备上进行恢复

  session钝化机制:

    ①把服务器不常使用的session对象暂时序列化到系统文件或者是数据库中,当使用时反序列化到内存中,整个过程由服务器自动完成;

    ②session的钝化机制由SessionManager管理,创建一个普通的JavaBean绑定和解除需要实现HttpSessionBindingListener接口

                                   MyListener implementsHttpSessionAttributeListener

                                             {

                                                        attributeAdded(HttpSessionBindingEvenet event)

                                                              {

                                                                        System.out.println("有对象加入session中");

                                                              }

                                                         attributeRemoved(HttpSessionBindingEvent event)

                                                              {

                                                                        System.out.println("有对象从session中移除");

                                                               }

                                                          attributeReplaced(HttpSessionBindingEvent event)

                                                               {

                                                                         System.out.println("属性值改变");

                                                               }

                                             }


当有对象添加到session中时,session.setAttribute("object",other)触发attributeAdded事件,

     当该对象从session移除时,session.removeAttribute("object")触发attriubteRemoved事件,

      当该属性的值发生变化时, session.replaceAttribute("object",another)触发attributeRepalced事件。

注意:只要有对象保存到session中或从session中移除或改变属性的值都会触发相应事件,不论该对象是否实现了AttributeListener。


HttpSessionBindingListener:当一个对象实现了该接口,且该对象被绑定到session中或从session中删除时,Servlet容器会通知该对象,该对象在接收到通知后做初始化操作或清除状态操作;

该接口提供了如下方法:

1,public void valueBound(HttpSessionBindingEventevent):当对象正在被绑定到session中时,Servlet容器通知对象它将被绑定到某个对话并标识该对话;

2,public void valueUnBound(HttpSessionBindingEventevent):当从session中删除该对象时,Servlet容器通知对象要从某个会话中取消对它的绑定并标识该对话;

所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中。我们在LoginServlet.java中进行这一步。即HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。

publicclass UserObject implements HttpSessionBindingListener

{

    public voidvalueBound(HttpSessionBindingEvent event)

    {

       System.out.println("触发绑定事件!");

    }

    public voidvalueUnbound(HttpSessionBindingEvent event)

    {

       System.out.println("解除和session的绑定");

    }

}

UserObject user = new UserObject();

     当把该监听器保存到session中,session.setAttribute("user",user)时就会触发valueBound事件.

当该监听器从session中移除时即session.removeAttribute("user"),触发valueUnbound事件;session失效或超时

时也会触发valueUnbound事件。

     注意:只有当该监听器(UserObject)保存到session中或从session移除时才会触发事件,其他没有实现该listener对象保存到session时不会触发该事件。


四、Servlet3.0下监听器的使用

servlet3.0下监听器的用法

使用注解@WebListener 即可,无法去定义监听器的顺序

@WebListener的常用属性

属性名  类型  是否可选  描述

value  String  是  该监听器的描述信息

@WebListener("Thisis a listener")

publicclass FirstListener impliements ServletRequestListener{}


1 0