天天看點

servlet監聽器實作線上人數統計

一.準備知識

  1. servlet:servlet是一種運作伺服器端的java應用程式,具有獨立于平台和協定的特性,并且可以動态的生成web頁面,它工作在用戶端請求與伺服器響應的中間層。
  2. filter:filter是一個可以複用的代碼片段,可以用來轉換HTTP請求、響應和頭資訊。Filter不像Servlet,它不能産生一個請求或者響應,它隻是修改對某一資源的請求,或者修改從某一的響應。
  3. listener:監聽器,從字面上可以看出listener主要用來監聽隻用。通過listener可以監聽web伺服器中某一個執行動作,并根據其要求作出相應的響應。通俗的語言說就是在application,session,request三個對象建立消亡或者往其中添加修改删除屬性時自動執行代碼的功能元件。
  4. servlet:servlet的生命周期始于它被裝入web伺服器的記憶體時,并在web伺服器終止或重新裝入servlet時結束。servlet一旦被裝入web伺服器,一般不會從web伺服器記憶體中删除,直至web伺服器關閉或重新結束。

    (1)、裝入:啟動伺服器時加載Servlet的執行個體;

    (2)、初始化:web伺服器啟動時或web伺服器接收到請求時,或者兩者之間的某個時刻啟動。初始化工作有init()方法負責執行完成;

    (3)、調用:從第一次到以後的多次通路,都是隻調用doGet()或doPost()方法;

    (4)、銷毀:停止伺服器時調用destroy()方法,銷毀執行個體。

  5. filter:(一定要實作javax.servlet包的Filter接口的三個方法init()、doFilter()、destroy(),空實作也行)。

    (1)、啟動伺服器時加載過濾器的執行個體,并調用init()方法來初始化執行個體;

    (2)、每一次請求時都隻調用方法doFilter()進行處理;

    (3)、停止伺服器時調用destroy()方法,銷毀執行個體。

  6. listener:類似于servlet和filter

    web.xml 的加載順序是:context- param -> listener -> filter –> servlet

二.預備知識 

       通過ServletContext 的執行個體可以存取應用程式的全局對象以及初始化階段的變量。 在JSP檔案中,application 是 ServletContext 的執行個體,由JSP容器預設建立。Servlet 中調用 getServletContext()方法得到 ServletContext 的執行個體。

       注意:全局對象即Application範圍對象,初始化階段的變量指在web.xml中,經由<context-param>元素所設定的變量,它的範圍也是Application範圍,例如:

<context-param>      
<param-name>Name</param-name>      
<param-value>browser</param-value>      
</context-param>      

        當容器啟動時,會建立一個Application範圍的對象,若要在JSP網頁中取得此變量時:

String name = (String)application.getInitParameter("Name");      
${initPara.name}      
//若是在Servlet中,取得Name的值方法:      
String name = (String)ServletContext.getInitParameter("Name");      

          目前Servlet2.4和JSP2.0總共有8個監聽器接口和6個Event類,如下:

           突然不支援圖檔釋出, 筆者也很郁悶,需要的讀者自己查吧。。。

三.統計線上人數

       1.第一種方式

package webbook.chapter14;      
import javax.servlet.http.HttpSessionEvent;      
import javax.servlet.http.HttpSessionListener;      
public class CounterListener implements HttpSessionListener {      
private static long onlineNumber = 0;      
public static long getOnlineNumber() {      
return onlineNumber;      
}      
public void sessionCreated(HttpSessionEvent se) {      
onlineNumber++;      
}      
public void sessionDestroyed(HttpSessionEvent se) {      
onlineNumber--;      
}      
}      
目前應用中一共有<%=CounterListener.getOnlineNumber()%>人線上<br>      

        統計的數字并不完全準确,因為可能使用者下線了,session還沒失效,怎麼辦呢?俺也不知道。。

        2.第二種方式

            顯示誰線上,使用ArrayList,建立session時加入,銷毀時删除(remove)。

四.結束語

        好好學習,天天向上。。。。。