我們可以利用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中測試通過。
首先,編寫一個簡單的計數器,代碼如下:
- package?gongfei.cmc.articles.onlinecounter;
- 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方法,代碼如下:
- package?gongfei.cmc.articles.onlinecounter;
- import?javax.servlet.http.HttpSessionEvent;
- import?javax.servlet.http.HttpSessionListener;
- public?class?OnlineCounterListener?implements?HttpSessionListener?{
- ????public?void?sessionCreated(HttpSessionEvent?hse)?{
- ????????OnlineCounter.raise();
- ????}
- ????public?void?sessionDestroyed(HttpSessionEvent?hse)?{
- ????????OnlineCounter.reduce();
- ????}
- }
再然后,把這個HttpSessionListener實現類注冊到網站應用中,也就是在網站應用的web.xml中加入如下內容:
- <web-app>
- ????……
- ????<listener>
- ????????<listener-class>
- ????????????gongfei.cmc.articles.example.OnlineCounterListener
- ????????</listener-class>
- ????</listener>
- ????……
- </web-app>