在網站中經常需要進行在線人數的統計。過去的一般做法是結合登錄和退出功能,即當用戶輸入用戶名密碼進行登錄的時候計數器加1,然后當用戶點擊退出按鈕退出系統的時候計數器減1。這種處理方式存在一些缺點,例如:用戶正常登錄后,可能會忘記點擊退出按鈕,而直接關閉瀏覽器,導致計數器減1的操作沒有及時執行;網站上還經常有一些內容是不需要登錄就可以訪問的,在這種情況下也無法使用上面的方法進行在線人數統計。
  我們可以利用Servlet規范中定義的事件監聽器(Listener)來解決這個問題,實現更準確的在線人數統計功能。對每一個正在訪問的用戶,J2EE應用服務器會為其建立一個對應的HttpSession對象。當一個瀏覽器第一次訪問網站的時候,J2EE應用服務器會新建一個HttpSession對象,并觸發HttpSession創建事件,如果注冊了HttpSessionListener事件監聽器,則會調用HttpSessionListener事件監聽器的sessionCreated方法。相反,當這個瀏覽器訪問結束超時的時候,J2EE應用服務器會銷毀相應的HttpSession對象,觸發HttpSession銷毀事件,同時調用所注冊HttpSessionListener事件監聽器的sessionDestroyed方法。
  可見,對應于一個用戶訪問的開始和結束,相應的有sessionCreated方法和sessionDestroyed方法執行。這樣,我們只需要在HttpSessionListener實現類的sessionCreated方法中讓計數器加1,在sessionDestroyed方法中讓計數器減1,就輕松實現了網站在線人數的統計功能。
  下面就是利用HttpSessionListener實現在線人數統計的一個例子,這個例子已經在中創軟件的J2EE應用服務器InforWeb中測試通過。
  首先,編寫一個簡單的計數器,代碼如下:

public?class?OnlineCounter?{?
????
private?static?long?online?=?0;?????
????
public?static?long?getOnline()?{?
????????
return?online;?
????}
?????
????
public?static?void?raise(){?
????????online
++;?
????}
??
????
public?static?void?reduce(){?
????????online
--;?
???}
?
}
?

  然后,編寫HttpSessionListener實現類,在這個實現類的sessionCreated方法中調用OnlineCounter的raise方法,在sessionDestroyed方法中調用OnlineCounter的reduce方法,代碼如下:
?
import?javax.servlet.http.javax/servlet/http/HttpSessionEvent.java.html"?target="_blank">HttpSessionEvent;?
import?javax.servlet.http.javax/servlet/http/HttpSessionListener.java.html"?target="_blank">HttpSessionListener;?
public?class?OnlineCounterListener?implements?javax/servlet/http/HttpSessionListener.java.html"?target="_blank">HttpSessionListener?{?
????public?void?sessionCreated(javax/servlet/http/HttpSessionEvent.java.html"?target="_blank">HttpSessionEvent?hse)?{?
????????OnlineCounter.raise();?
????}?
????
public?void?sessionDestroyed(javax/servlet/http/HttpSessionEvent.java.html"?target="_blank">HttpSessionEvent?hse)?{?
????????OnlineCounter.reduce();?
????}?
}?

  再然后,把這個HttpSessionListener實現類注冊到網站應用中,也就是在網站應用的web.xml中加入如下內容:
<web-app>?
????……?
????
<listener>?
????????
<listener-class>?
????????????gongfei.cmc.articles.example.OnlineCounterListener?
????????
</listener-class>?
????
</listener>?
????……?
</web-app>?

  OK,在線人數統計功能已經實現,只要在JSP頁面中加入下面這樣的腳本就能顯示但前在線人數了:
  1. <%@?page?language="java"?pageEncoding="GB2312"?%>
  2. <%@?page?import="gongfei.cmc.articles.onlinecounter.OnlineCounter"?%>
  3. <html>
  4. ????<head><title>On?Line?Counert</title></head>
  5. ????<body?bgcolor="#FFFFFF">
  6. ????????On?line:<%=OnlineCounter.getOnline()%>
  7. ????</body>
  8. </html>