丄諦啲仇魜ヤ
          如 果 敵 人 讓 你 生 氣 , 那 說 明 你 沒 有 勝 他 的 把 握!
          posts - 6,comments - 56,trackbacks - 1

          在網(wǎng)站中經(jīng)常需要進(jìn)行在線人數(shù)的統(tǒng)計(jì)。過去的一般做法是結(jié)合登錄和退出功能,即當(dāng)用戶輸入用戶名密碼進(jìn)行登錄的時(shí)候計(jì)數(shù)器加1,然后當(dāng)用戶點(diǎn)擊退出按鈕退出系統(tǒng)的時(shí)候計(jì)數(shù)器減1。這種處理方式存在一些缺點(diǎn),例如:用戶正常登錄后,可能會(huì)忘記點(diǎn)擊退出按鈕,而直接關(guān)閉瀏覽器,導(dǎo)致計(jì)數(shù)器減1的操作沒有及時(shí)執(zhí)行;網(wǎng)站上還經(jīng)常有一些內(nèi)容是不需要登錄就可以訪問的,在這種情況下也無法使用上面的方法進(jìn)行在線人數(shù)統(tǒng)計(jì)。
            我們可以利用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ù)器JBOSS中測(cè)試通過。
            首先,編寫一個(gè)簡(jiǎn)單的計(jì)數(shù)器,代碼如下:

          1.    package accp.onlinecounter;

          2.    public class OnlineCounter {

          3.        private static long online = 0;    

          4.        public static long getOnline() {

          5.            return online;

          6.        }    

          7.        public static void raise(){

          8.            online++;

          9.        } 

          10.       public static void reduce(){

          11.           online--;

          12.      }

          13.   }


            然后,編寫HttpSessionListener實(shí)現(xiàn)類,在這個(gè)實(shí)現(xiàn)類的sessionCreated方法中調(diào)用OnlineCounterraise方法,在sessionDestroyed方法中調(diào)用OnlineCounterreduce方法,代碼如下:

          1.    package accp.onlinecounter;

          2.    import javax.servlet.http.HttpSessionEvent;

          3.    import javax.servlet.http.HttpSessionListener;

          4.    public class OnlineCounterListener implements HttpSessionListener {

          5.        public void sessionCreated(HttpSessionEvent hse) {

          6.            OnlineCounter.raise();

          7.        }

          8.        public void sessionDestroyed(HttpSessionEvent hse) {

          9.            OnlineCounter.reduce();

          10.       }

          11.   }


            再然后,把這個(gè)HttpSessionListener實(shí)現(xiàn)類注冊(cè)到網(wǎng)站應(yīng)用中,也就是在網(wǎng)站應(yīng)用的web.xml中加入如下內(nèi)容:

          1.    <web-app>

          2.        ……

          3.        <listener>

          4.            <listener-class>

          5.                accp.OnlineCounterListener

          6.            </listener-class>

          7.        </listener>

          8.        ……

          9.    </web-app>


            OK,在線人數(shù)統(tǒng)計(jì)功能已經(jīng)實(shí)現(xiàn),只要在JSP頁(yè)面中加入下面這樣的腳本就能顯示但前在線人數(shù)了:

          1.    <%@ page language="java" pageEncoding="GB2312" %>

          2.    <%@ page import="accp.OnlineCounter" %>

          3.    <html>

          4.        <head><title>On Line Counert</title></head>

          5.        <body bgcolor="#FFFFFF">

          6.            On line:<%=OnlineCounter.getOnline()%>
          7.        </body>

          8.    </html>

          posted on 2007-10-10 11:10 Crying 閱讀(1887) 評(píng)論(1)  編輯  收藏 所屬分類: Jsp+Struts

          FeedBack:
          # re: 利用servlet監(jiān)聽器實(shí)現(xiàn)jsp中在線人數(shù)統(tǒng)計(jì)的方法 [未登錄]
          2010-07-27 15:18 | a
          這個(gè)方法有問題。多用戶,在一機(jī)器上登陸竟然計(jì)數(shù)為1.  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 仪陇县| 东兰县| 吴忠市| 辛集市| 莱阳市| 台江县| 青神县| 黄龙县| 黄冈市| 内乡县| 饶阳县| 永年县| 都江堰市| 遂溪县| 图木舒克市| 太保市| 玉环县| 宜兰县| 乐平市| 丹巴县| 朝阳区| 汤原县| 福贡县| 区。| 驻马店市| 古浪县| 洪泽县| 佛冈县| 万源市| 乌恰县| 大理市| 甘德县| 双柏县| 延长县| 电白县| 平原县| 安溪县| 石林| 织金县| 佳木斯市| 庆阳市|