ListenerServlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时,就激发sessionCreated(HttpSessionEvent se)方法,这样就可以给在线人数加1。常用的监听接口有以下几个:

ServletContextListener监听ServletContext。当创建ServletContext时,激发 contextInitialized(ServletContextEvent sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。

ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。

HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。

HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发 attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。

下面我们开发一个具体的例子,这个监听器能够统计在线的人数。

程序源代码:

package com.dr.web.listener;

import javax.servlet.ServletContext;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

publicclass UserCountListener implements ServletContextListener,

       HttpSessionListener {

    //每个web应用都有且仅有一个ServletContext对象,这个对象在所有的Servlet都可以使用。

    /**

     * 因为一个web应用就一个ServletContext 对象,因此可以使用ServletContext 来做一些全局性的属性设置等。

     * 比如网站访问计数器等等

     *

     *

     * ServletContext 是一个应用程序与Web容器(tomcat之类)交互的接口,同时它也是管理应用程序资源的对象,

                                                   通过它可以读取web.xml中一些配置,如<context-param>中的信息,读取应用中的资源等。

       Session 是一个会话对象,也就是说当客户端访问服务器页面时,它才产生,

                                        原理是服务器对每个客户端产生一个sessionid,并把它也保存在客户端,

                                        每次请求时验证这个sessionid是否是创建了sessionid的客户端,在服务器端对应这个sessionid会创建一个缓存区,

                                        存储一些相关信息,程序员可以操作,如被用于购物车,存储用户信息等,这个区域只有对特定用户有访问权限,对其他客户是拒绝访问的,这就是一个会话。

       Request 是一个请求对象,也就是说它的生命很短暂,只在一个请求中存在,如一个页面到另一个页面,

                                     一个页面到servletaction,一个servletactionjsp页面等,你可以用它的setAttribute方法传递需要的信息(对象),验证请求方的信息,获得请求方发过来的文件内容等。

     */

    private ServletContext sc;

    publicvoid contextDestroyed(ServletContextEvent arg0) {

   

    }

    publicvoid contextInitialized(ServletContextEvent event) {

      

       ServletContext sc = event.getServletContext();

       sc.setAttribute("Users", new Integer(0));

       this.sc = sc;

    }

    publicvoid sessionCreated(HttpSessionEvent event) {//在线

       System.out.println("new user login our web site");

       Integer users = (Integer)sc.getAttribute("Users");

       sc.setAttribute("Users", ++users);

    }

    publicvoid sessionDestroyed(HttpSessionEvent event) {

       Integer users = (Integer)sc.getAttribute("Users");

       sc.setAttribute("Users", --users);

    }

}

Web.xml中配置如下:

    <listener>

       <listener-class>com.dr.web.listener.UserCountListener</listener-class>

    </listener>

UserCountListener里,用users代表当前在线的人数,UserCountListener将在Web服务器启动时自动执行。当UserCountListener构造好后,把users设置为 0。每增加一个SessionUserCountListener会自动调用sessionCreated(HttpSessionEvent event)方法;每销毁一个SessionUserCountListener会自动调用 sessionDestroyed(HttpSessionEvent se)方法。当调用sessionCreated(HttpSessionEvent event)方法时,说明又有一个客户在请求,此时使在线的人数(users)加1,并且把user写到ServletContext中。 ServletContext的信息是所有客户端共享的,这样,每个客户端都可以读取到当前在线的人数。

运行结果: