? servlet里不得不說一下監(jiān)聽器,因?yàn)閟ervlet里對(duì)象眾多轩猩,比如:HttpRequestServlet、 HttpResponseServlet、HttpSession税娜、ServletConfig魄藕、ServletContext等基本每一個(gè)都有其對(duì)應(yīng)的Listener(監(jiān)聽器)而監(jiān)聽器顧名思義是作為輔助類讓我們更好的觀察Servlet的各個(gè)對(duì)象日麸,它能幫我們從第三方角度(第一角度客戶端颤专,第二角度servlet容器)獲取一個(gè)web服務(wù)器小程序的矢量考究纽哥。
這里舉個(gè)例子:監(jiān)聽session,計(jì)算訪問在線的用戶量栖秕。session學(xué)過javaweb的都應(yīng)該知道春塌,這里不再做詳細(xì)解釋,如果有興趣可以看我隨筆簇捍,后面我會(huì)慢慢整理只壳,由于今天是第一次編撰,還是以監(jiān)聽器為主暑塑。言歸正傳吼句,session屬于狀態(tài)管理,記錄用戶狀態(tài)事格,為了統(tǒng)計(jì)有多少個(gè)用戶在線我們需要Session監(jiān)聽器惕艳,步驟如下:
? 1)創(chuàng)建一個(gè)war包的Maven工程(Maven如何管理后續(xù)會(huì)整理)注意: groupId 域名反寫
artifactId:webapp應(yīng)用名
? ? 注:創(chuàng)建完報(bào)錯(cuò)需要右鍵generate...stub最長的那個(gè)自動(dòng)生成webapp下的web.xml映射文件
2)將項(xiàng)目部署到Tomcat服務(wù)器上,以eclipse為例 右鍵properties––>Targeted Runtimes選中已經(jīng)配置好的Tomcat服務(wù)器––>Finish
3)創(chuàng)建一個(gè)java類實(shí)現(xiàn)HttpSessionListener接口
注:會(huì)讓重寫兩個(gè)方法sessionCreated(HttpSessionEvent se)
sessionDestroyed(HttpSessionEvent se)
一個(gè)是寫session創(chuàng)建時(shí)產(chǎn)生的事件監(jiān)聽處理邏輯
一個(gè)是session銷毀時(shí)監(jiān)聽事件的處理邏輯
4)在session創(chuàng)建監(jiān)聽方法里 進(jìn)行邏輯判斷
首先定義一個(gè)全局的計(jì)數(shù)對(duì)象count 然后獲取session對(duì)象用session獲取Servlet上下文用上下文監(jiān)聽 (ps:因?yàn)楸O(jiān)聽session驹愚,而session本身只能監(jiān)聽自己即只能看見自己远搪,直接用session綁定數(shù)據(jù),統(tǒng)計(jì)用戶時(shí)一直都為一個(gè))
ServletContext ctx = event.getSession( ).getServletContext();
ctx.getAttribute("count");//假設(shè)count為綁定的
//在線用戶數(shù)量
獲取后應(yīng)該考慮是否為空逢捺,有可能用戶未訪問 此時(shí)應(yīng)該將count賦值一 并且綁定數(shù)據(jù)
ctx.setAttribute("count",count);
如果有值count++
在銷毀session監(jiān)聽方法里 寫計(jì)數(shù)減減邏輯
第一步同樣獲取servlet上下文 不用判斷session因?yàn)橐N毀肯定曾經(jīng)擁有
接著ctx.setAttribute("count",--count);
5)在web.xml里配置
<listener>?
? ? <listener-class>
? ? ? ? ? ? web.listener.SessionCounter
? </listener-class>?
</listener>?
6)考慮用戶及時(shí)下線處理谁鳍,如果用戶下線則立即統(tǒng)計(jì)用戶下線量,減去并重新計(jì)算蒸甜。因?yàn)閟ession保存在服務(wù)器端,默認(rèn)配置超時(shí)30分鐘(session-timeout 超時(shí)可以設(shè)置 需要配置)正因?yàn)槿绱擞喾穑绻蛔鎏幚砟拢枰?0分鐘后才會(huì)重新統(tǒng)計(jì),這時(shí)候可以使用session提供的失效方法
// 銷毀session?
? ? request.getSession().invalidate();
此代碼可以在Servlet類service(..,..)里或者doGet()辉巡、doPost()方法里
因?yàn)檎{(diào)用此方法會(huì)觸發(fā)sessionDestroyed方法可以做到迅速重新統(tǒng)計(jì)在線用戶列表人數(shù)
7)寫一個(gè)jsp頁面 用application內(nèi)置對(duì)象獲取綁定的數(shù)據(jù)count即統(tǒng)計(jì)值然后運(yùn)行 最后觀察結(jié)果(可以使用多個(gè)瀏覽器測(cè)試 一個(gè)瀏覽器可以當(dāng)做一個(gè)用戶 瀏覽器本身就是一個(gè)代理用戶)
application.getAttribute("count");
? ? –WriteByJson(純手打 新手上路 不喜勿噴)