Oracle神諭

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            284 隨筆 :: 9 文章 :: 106 評論 :: 0 Trackbacks
           在網(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ì)功能。對每一個(gè)正在訪問的用戶,J2EE應(yīng)用服務(wù)器會(huì)為其建立一個(gè)對應(yīng)的HttpSession對象。當(dāng)一個(gè)瀏覽器第一次訪問網(wǎng)站的時(shí)候,J2EE應(yīng)用服務(wù)器會(huì)新建一個(gè)HttpSession對象,并觸發(fā)HttpSession創(chuàng)建事件,如果注冊了HttpSessionListener事件監(jiān)聽器,則會(huì)調(diào)用HttpSessionListener事件監(jiān)聽器的sessionCreated方法。相反,當(dāng)這個(gè)瀏覽器訪問結(jié)束超時(shí)的時(shí)候,J2EE應(yīng)用服務(wù)器會(huì)銷毀相應(yīng)的HttpSession對象,觸發(fā)HttpSession銷毀事件,同時(shí)調(diào)用所注冊HttpSessionListener事件監(jiān)聽器的sessionDestroyed方法。
            可見,對應(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中測試通過。
            首先,編寫一個(gè)簡單的計(jì)數(shù)器,代碼如下:
          1. package gongfei.cmc.articles.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)用OnlineCounter的raise方法,在sessionDestroyed方法中調(diào)用OnlineCounter的reduce方法,代碼如下:
          1. package gongfei.cmc.articles.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)類注冊到網(wǎng)站應(yīng)用中,也就是在網(wǎng)站應(yīng)用的web.xml中加入如下內(nèi)容:
          1. <web-app>
          2.     ……
          3.     <listener>
          4.         <listener-class>
          5.             gongfei.cmc.articles.example.OnlineCounterListener
          6.         </listener-class>
          7.     </listener>
          8.     ……
          9. </web-app>


          原文地址:http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=18541

          posted on 2005-09-12 16:06 java世界暢談 閱讀(1018) 評論(1)  編輯  收藏 所屬分類: JAVA

          評論

          # re: 利用HttpSessionListener實(shí)現(xiàn)網(wǎng)站在線人數(shù)統(tǒng)計(jì)功能 2007-10-24 21:29 ddsa
          --不行
          有能臨聽到用戶關(guān)閉時(shí)的動(dòng)作
            回復(fù)  更多評論
            

          主站蜘蛛池模板: 成都市| 时尚| 保靖县| 光山县| 来凤县| 嘉荫县| 红桥区| 利辛县| 蚌埠市| 秭归县| 青铜峡市| 岳普湖县| 都昌县| 延边| 沙洋县| 耿马| 紫云| 敦化市| 靖边县| 汉源县| 广河县| 靖州| 丁青县| 延长县| 平凉市| 韩城市| 库车县| 沐川县| 栖霞市| 望江县| 克拉玛依市| 南开区| 丹凤县| 色达县| 犍为县| 泗水县| 阿拉善左旗| 陆良县| 大丰市| 锦屏县| 南京市|