JavaWeb?Listener?利用Session統(tǒng)計(jì)在線人數(shù)
一.監(jiān)聽(tīng)器Listener
1.1 Listener的作用
Listener是一個(gè)功能組件,在創(chuàng)建、銷毀或添加、修改或刪除應(yīng)用程序、會(huì)話和請(qǐng)求對(duì)象的屬性時(shí)自動(dòng)執(zhí)行代碼。
監(jiān)聽(tīng)器是servlet的監(jiān)聽(tīng)器,它可以監(jiān)聽(tīng)客戶端的請(qǐng)求和服務(wù)器的操作。
可以使用application,session,request這三個(gè)對(duì)象
1.2 小demo之統(tǒng)計(jì)在線人數(shù)
1.新建omline,繼承類HttpSessionListener,重寫sessionCreated和sessionDestroyed方法:
public class omline implements HttpSessionListener { public void sessionCreated(HttpSessionEvent se) { } public void sessionDestroyed(HttpSessionEvent se) { } }
2.對(duì)于sessionCreated方法:
創(chuàng)建Session監(jiān)聽(tīng),可以查看用戶的一舉一動(dòng)。一旦創(chuàng)建Session就會(huì)觸發(fā)這個(gè)方法!
對(duì)于sessionDestroyed方法:
銷毀session監(jiān)聽(tīng)。一旦銷毀Session就會(huì)觸發(fā)這個(gè)方法!
3.創(chuàng)建servletContext對(duì)象,新建OnlineCount鍵值對(duì)。
ServletContext servletContext = se.getSession().getServletContext(); Integer omlinecount = (Integer) servletContext.getAttribute("OnlineCount");
判斷當(dāng)前在線人數(shù),如果omlinecount為空的話,更新當(dāng)前的在線人數(shù)為1。
if(omlinecount==null){ omlinecount=new Integer(1); }
如果現(xiàn)在人數(shù)不為空的話,將當(dāng)前的人數(shù)加一。
else{ int count = omlinecount.intValue(); omlinecount=new Integer(count+1); }
將當(dāng)前人數(shù)存入鍵值對(duì):
servletContext.setAttribute("OnlineCount",omlinecount);
4.銷毀session監(jiān)聽(tīng):
前面的代碼基本一樣,唯一不同的是,對(duì)于空值的判斷和非空的人數(shù)計(jì)算。
對(duì)于當(dāng)前對(duì)象為空時(shí),將其賦值為0。
if(omlinecount==null){ omlinecount=new Integer(0); }
當(dāng)其不為0時(shí),將其人數(shù)減一:
else{ int count = omlinecount.intValue(); omlinecount=new Integer(count-1); }
5.注冊(cè)監(jiān)聽(tīng)器,注冊(cè)監(jiān)聽(tīng)器只需要一句話,如下:
<listener> <listener-class>main.java.omline</listener-class> </listener>
6.在訪問(wèn)的主頁(yè)面寫下jsp語(yǔ)句,引入java對(duì)象的值,實(shí)現(xiàn)輸出當(dāng)前的在線人數(shù)。
<h2> 當(dāng)前有<span><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%>人在線</span> </h2>
7.啟動(dòng)服務(wù)器,訪問(wèn)主頁(yè),得到結(jié)果如下:
1.3 統(tǒng)計(jì)結(jié)果錯(cuò)誤原因分析
尋找原因,找到omline里的sessionCreated方法,寫一下輸出所有Session的ID
System.out.println(se.getSession().getId());
運(yùn)行項(xiàng)目,觀察輸出臺(tái):
9DF74823455F36EDA429B31938B5EEE5
2D248509C732D5C448DA1E57BE539E97
打開(kāi)F12,網(wǎng)絡(luò)查看該用戶的Session:
可以看到,現(xiàn)在的Session是控制臺(tái)輸出的最后一個(gè),說(shuō)明第一個(gè)鏈接失敗,已經(jīng)被銷毀了。
如果我們重新發(fā)布改頁(yè)面:
刷新改頁(yè)面,繼續(xù)打開(kāi)Session觀察如下:現(xiàn)在就變?yōu)榱艘蝗耍?/p>
注意:
如果我們使用一個(gè)游覽器兩個(gè)頁(yè)面都訪問(wèn)該路徑,還是屬于一個(gè)任務(wù)的,在線人數(shù)算做一人。
如果我們打開(kāi)不同的游覽器來(lái)訪問(wèn)該url,這個(gè)這時(shí)候就會(huì)算做不同的用戶,分配不同的Sessionid給用戶。
步驟:
1.實(shí)現(xiàn)監(jiān)聽(tīng)器的接口。重寫里面的方法!
2.配置監(jiān)聽(tīng)器(xml里注冊(cè)監(jiān)聽(tīng)器)。
以上就是JavaWeb Listener 利用Session統(tǒng)計(jì)在線人數(shù)的詳細(xì)內(nèi)容,更多關(guān)于JavaWeb Listener Session統(tǒng)計(jì)在線人數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java實(shí)現(xiàn)網(wǎng)站微信掃碼支付
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)網(wǎng)站微信掃碼支付,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07windows下jar包開(kāi)機(jī)自動(dòng)重啟的步驟
這篇文章主要給大家介紹了關(guān)于windows下jar包開(kāi)機(jī)自動(dòng)重啟的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11SpringBoot的三大開(kāi)發(fā)工具小結(jié)
本文主要介紹了SpringBoot的三大開(kāi)發(fā)工具,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02java實(shí)現(xiàn)時(shí)間控制的幾種方案
這篇文章主要介紹了java實(shí)現(xiàn)時(shí)間控制的幾種方案,本文從多個(gè)方面給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Java JDBC API介紹與實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池流程
JDBC是指Java數(shù)據(jù)庫(kù)連接,是一種標(biāo)準(zhǔn)Java應(yīng)用編程接口( JAVA API),用來(lái)連接 Java 編程語(yǔ)言和廣泛的數(shù)據(jù)庫(kù)。從根本上來(lái)說(shuō),JDBC 是一種規(guī)范,它提供了一套完整的接口,允許便攜式訪問(wèn)到底層數(shù)據(jù)庫(kù),本篇文章我們來(lái)了解JDBC API及數(shù)據(jù)庫(kù)連接池2022-12-12