我們可以利用Servlet規(guī)范中定義的事件監(jiān)聽器(Listener)來解決這個(gè)問題,實(shí)現(xiàn)更準(zhǔn)確的在線人數(shù)統(tǒng)計(jì)功能。對(duì)每一個(gè)正在訪問的用戶,J2EE應(yīng)用服務(wù)器會(huì)為其建立一個(gè)對(duì)應(yīng)的HttpSession對(duì)象。當(dāng)一個(gè)瀏覽器第一次訪問網(wǎng)站的時(shí)候,J2EE應(yīng)用服務(wù)器會(huì)新建一個(gè)HttpSession對(duì)象,并觸發(fā)HttpSession創(chuàng)建事件,如果注冊(cè)了HttpSessionListener事件監(jiān)聽器,則會(huì)調(diào)用HttpSessionListener事件監(jiān)聽器的sessionCreated方法。相反,當(dāng)這個(gè)瀏覽器訪問結(jié)束超時(shí)的時(shí)候,J2EE應(yīng)用服務(wù)器會(huì)銷毀相應(yīng)的HttpSession對(duì)象,觸發(fā)HttpSession銷毀事件,同時(shí)調(diào)用所注冊(cè)HttpSessionListener事件監(jiān)聽器的sessionDestroyed方法。
可見,對(duì)應(yīng)于一個(gè)用戶訪問的開始和結(jié)束,相應(yīng)的有sessionCreated方法和sessionDestroyed方法執(zhí)行。這樣,我們只需要在HttpSessionListener實(shí)現(xiàn)類的sessionCreated方法中讓計(jì)數(shù)器加1,在sessionDestroyed方法中讓計(jì)數(shù)器減1,就輕松實(shí)現(xiàn)了網(wǎng)站在線人數(shù)的統(tǒng)計(jì)功能。
下面就是利用HttpSessionListener實(shí)現(xiàn)在線人數(shù)統(tǒng)計(jì)的一個(gè)例子,這個(gè)例子已經(jīng)在中創(chuàng)軟件的J2EE應(yīng)用服務(wù)器InforWeb中測(cè)試通過。
首先,編寫一個(gè)簡(jiǎn)單的計(jì)數(shù)器,代碼如下:
- 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實(shí)現(xiàn)類,在這個(gè)實(shí)現(xiàn)類的sessionCreated方法中調(diào)用OnlineCounter的raise方法,在sessionDestroyed方法中調(diào)用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();
- ????}
- }
再然后,把這個(gè)HttpSessionListener實(shí)現(xiàn)類注冊(cè)到網(wǎng)站應(yīng)用中,也就是在網(wǎng)站應(yīng)用的web.xml中加入如下內(nèi)容:
- <web-app>
- ????……
- ????<listener>
- ????????<listener-class>
- ????????????gongfei.cmc.articles.example.OnlineCounterListener
- ????????</listener-class>
- ????</listener>
- ????……
- </web-app>