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。每增加一個Session,UserCountListener會自動調用sessionCreated(HttpSessionEvent event)方法;每銷毀一個Session,UserCountListener會自動調用 sessionDestroyed(HttpSessionEvent se)方法。當調用sessionCreated(HttpSessionEvent event)方法時,說明又有一個客戶在請求,此時使在線的人數(users)加1,并且把user寫到ServletContext中。 ServletContext的信息是所有客戶端共享的,這樣,每個客戶端都可以讀取到當前在線的人數。

運行結果: