一.監聽器Listener
1.1 Listener的作用
Listener是一個功能元件,在建立、銷毀或添加、修改或删除應用程式、會話和請求對象的屬性時自動執行代碼。
監聽器是servlet的監聽器,它可以監聽用戶端的請求和伺服器的操作。
可以使用application,session,request這三個對象
1.2 小demo之統計線上人數
1.建立omline,繼承類HttpSessionListener,重寫sessionCreated和sessionDestroyed方法:
public class omline implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
}
public void sessionDestroyed(HttpSessionEvent se) {
}
}
2.對于sessionCreated方法:
建立Session監聽,可以檢視使用者的一舉一動。一旦建立Session就會觸發這個方法!
對于sessionDestroyed方法:
銷毀session監聽。一旦銷毀Session就會觸發這個方法!
3.建立servletContext對象,建立OnlineCount鍵值對。
ServletContext servletContext = se.getSession().getServletContext();
Integer omlinecount = (Integer) servletContext.getAttribute("OnlineCount");
判斷目前線上人數,如果omlinecount為空的話,更新目前的線上人數為1。
if(omlinecount==null){
omlinecount=new Integer(1);
}
如果現在人數不為空的話,将目前的人數加一。
else{
int count = omlinecount.intValue();
omlinecount=new Integer(count+1);
}
将目前人數存入鍵值對:
servletContext.setAttribute("OnlineCount",omlinecount);
4.銷毀session監聽:
前面的代碼基本一樣,唯一不同的是,對于空值的判斷和非空的人數計算。
對于目前對象為空時,将其指派為0。
if(omlinecount==null){
omlinecount=new Integer(0);
}
當其不為0時,将其人數減一:
else{
int count = omlinecount.intValue();
omlinecount=new Integer(count-1);
}
5.注冊監聽器,注冊監聽器隻需要一句話,如下:
<listener>
<listener-class>main.java.omline</listener-class>
</listener>
6.在通路的首頁面寫下jsp語句,引入java對象的值,實作輸出目前的線上人數。
目前有<span><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%>人線上</span>
7.啟動伺服器,通路首頁,得到結果如下:

1.3 統計結果錯誤原因分析
尋找原因,找到omline裡的sessionCreated方法,寫一下輸出所有Session的ID
System.out.println(se.getSession().getId());
運作項目,觀察輸出台:
9DF74823455F36EDA429B31938B5EEE5
2D248509C732D5C448DA1E57BE539E97
打開F12,網絡檢視該使用者的Session:
可以看到,現在的Session是控制台輸出的最後一個,說明第一個連結失敗,已經被銷毀了。
如果我們重新釋出改頁面:
重新整理改頁面,繼續打開Session觀察如下:現在就變為了一人!
注意:
如果我們使用一個遊覽器兩個頁面都通路該路徑,還是屬于一個任務的,線上人數算做一人。
如果我們打開不同的遊覽器來通路該url,這個這時候就會算做不同的使用者,配置設定不同的Sessionid給使用者。