DZM.528
Life is a voyage, not a destination.
用Session實現在線統計的功能(HttpSessionListener)
如何用Session實現在線統計的功能,其實只要對Servlet規范詳細了解一下,明白其基本原理,編寫一個類似的功能并不是一件很復雜的事情。這個例子是基于2.3以上的規范編寫的,最主要功能就是提供在線用戶列表顯示(既然用戶列表都可以顯示了,那人數統計自然也不在話下了)。
在給出代碼之前,先簡單說一下監聽器的常識。
HttpSessionListener:這是2.3以上規范所提供的一個新功能,也就是可以定義監聽器監聽HttpSession對象的創建和銷毀。每當有新的用 戶訪問網站,應用服務器會創建一個HttpSession對象,每當Session超時,應用服務器則會銷毀這個對象。
HttpSessionBindingListener:每當往Session中存入一個對象(setAttribute)或從Session中刪除一個對象的時候,如果這個對象實現了此監聽器接口,應用服務器將會自動調用接口相應的方法。
需要注意的一點就是,在sessionDestroyed方法和valueUnbound方法中,你可以得到HttpSession對象的實例,但是其getAttribute方法不再可用,也就是在這兩個方法中,你不能再次得到存入session中的對象。
基于以上這些粗淺的認識,再簡單介紹一下提供的測試例子的情況:
測試例子總共包含如下文件:
OnlineUserListener.java:它實現了HttpSessionListener接口
OnlineUsers.java:它包含了所有正在訪問網站的用戶信息,為了方便起見,它也實現了HttpSessionBindingListener接口(實際中你最好把他們分開吧)
User.java:這是用戶的信息
test.jsp:為了方便,把登錄,退出,顯示在線用戶列表等功能都做在同一個jsp文件里了。
下面是具體的代碼:
/**?*/
/**
?
*?OnlineUserListener.java?
*?Created?on?2004-11-19?
*/
?
package
?com.ccctc.view.web;?
import
?javax.servlet.http.HttpSessionEvent;?
import
?javax.servlet.http.HttpSessionListener;?
/**?*/
/**
?
*?
@author
?litf?
*?
*/
?
public
?
class
?OnlineUserListener?
?
implements
?HttpSessionListener?
{?
?
/**?*/
/**
?
??*?瀏覽器第一次訪問的時候,調用本方法?
??*?
@see
?javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)?
??
*/
?
?
public
?
void
?sessionCreated(HttpSessionEvent?event)?
{?
??User?u?
=
?
new
?User();?
??u.setName(
"
guest
"
);?
??u.setId(event.getSession().getId());?
??event.getSession().setAttribute(
"
currentUser
"
,u);?
??OnlineUsers.getInstance().addUser(u);?
?}
?
?
/**?*/
/**
?
??*?Session超時的時候,調用本方法?
??*?
@see
?javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)?
??
*/
?
?
public
?
void
?sessionDestroyed(HttpSessionEvent?event)?
{?
??OnlineUsers.getInstance().removeUser(event.getSession().getId());?
?}
?
}
?
/**?*/
/**
?
*?OnlineUsers.java?
*?Created?on?2004-11-19?
*/
?
package
?com.ccctc.view.web;?
import
?java.util.Collection;?
import
?java.util.HashMap;?
import
?java.util.Map;?
import
?javax.servlet.http.HttpSession;?
import
?javax.servlet.http.HttpSessionBindingEvent;?
import
?javax.servlet.http.HttpSessionBindingListener;?
/**?*/
/**
?
*?
@author
?litf?
*?在線用戶統計?
*/
?
public
?
class
?OnlineUsers?
implements
?HttpSessionBindingListener
{?
?
private
?Map?users?
=
?
new
?HashMap();?
??
?
private
?
static
?OnlineUsers?onlineUsers?
=
?
new
?OnlineUsers();?
??
?
public
?
static
?OnlineUsers?getInstance()
{?
??
return
?onlineUsers;?
?}
?
??
?
/**?*/
/**
?
??*?
@return
?
??
*/
?
?
public
?Collection?getUsers()?
{?
??
return
?users.values();?
?}
?
??
?
public
?
void
?addUser(User?user)?
{?
??users.put(user.getId(),user);?
?}
?
??
?
public
?
void
?removeUser(String?userId)
{?
??users.remove(userId);?
?}
?
??
?
/**?*/
/**
?
??*?對象實例(即OnlineUserListener的實例)作為一個屬性被設置到session的?
??*?時候,會調用本方法,這種情況一般發生在點擊登錄按鈕以后的處理過程中?
??*?設置?
??*?
@see
?javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)?
??
*/
?
?
public
?
void
?valueBound(HttpSessionBindingEvent?event)?
{?
??
//
現在暫時不需要額外處理,你可以在這里記錄日志等?
?}
?
?
/**?*/
/**
?
??*?當Session超時,或本實例被從session中移除的時候被調用,這種情況一般?
??*?發生在注銷方法的處理過程中?
??*?
@see
?javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)?
??
*/
?
?
public
?
void
?valueUnbound(HttpSessionBindingEvent?event)?
{?
??
try
?
{?
???HttpSession?session?
=
?event.getSession();?
???User?u?
=
?(User)session.getAttribute(
"
currentUser
"
);?
???u.setName(
"
guest
"
);?
??}
?
catch
?(RuntimeException?e)?
{?
???
//
e.printStackTrace();?
??}
?
?}
?
??
}
?
/**?*/
/**
?
*?User.java?
*?Created?on?2004-11-19?
*/
?
package
?com.ccctc.view.web;?
/**?*/
/**
?
*?
@author
?litf?
*?
*/
?
public
?
class
?User
{?
?
private
?String?address;?
?
private
?String?id;?
?
private
?String?name;?
?
/**?*/
/**
?
??*?
@see
?java.lang.Object#equals(java.lang.Object)?
??
*/
?
?
public
?
boolean
?equals(Object?obj)?
{?
??
if
?(obj?
==
?
null
?
||
?
!
(obj?
instanceof
?User))?
{?
???
return
?
false
;?
??}
?
??
if
(
this
.id?
!=
null
?
&&
?
this
.id.equals(((User)obj).getId()))
{?
???
return
?
true
;?
??}
?
??
return
?
false
;?
?}
?
?
/**?*/
/**
?
??*?
@return
?
??
*/
?
?
public
?String?getAddress()?
{?
??
return
?address;?
?}
?
?
/**?*/
/**
?
??*?
@return
?
??
*/
?
?
public
?String?getId()?
{?
??
return
?id;?
?}
?
?
/**?*/
/**
?
??*?
@return
?
??
*/
?
?
public
?String?getName()?
{?
??
return
?name;?
?}
?
?
/**?*/
/**
?
??*?
@param
?string?
??
*/
?
?
public
?
void
?setAddress(String?string)?
{?
??address?
=
?string;?
?}
?
?
/**?*/
/**
?
??*?
@param
?string?
??
*/
?
?
public
?
void
?setId(String?string)?
{?
??id?
=
?string;?
?}
?
?
/**?*/
/**
?
??*?
@param
?string?
??
*/
?
?
public
?
void
?setName(String?string)?
{?
??name?
=
?string;?
?}
?
??
?
/**?*/
/**
?
??*?
@see
?java.lang.Object#toString()?
??
*/
?
?
public
?String?toString()?
{?
??
return
?
"
name:
"
+
name?
+
?
"
,id:
"
?
+
?id?
+
?
"
,address:
"
+
address;?
?}
?
}
?
test.jsp
<%
@?page?
import
=
"
com.ccctc.view.web.*
"
?
%>
?
<%
?
User?u?
=
?(User)session.getAttribute(
"
currentUser
"
);?
String?name?
=
?request.getParameter(
"
user
"
);?
if
(u?
!=
?
null
)
{?
?String?remote?
=
?request.getRemoteAddr();?
?u.setAddress(remote);?
??
}
?
//
User?Login?
if
(name?
!=
?
null
)
{?
?
if
(u?
!=
?
null
)
{?
??session.setAttribute(
"
_listener
"
,OnlineUsers.getInstance());?
??u.setName(name);?
???
?}
?
}
?
//
User?Logout?
String?logout?
=
?request.getParameter(
"
logout
"
);?
if
(logout?
!=
?
null
)
{?
?session.removeAttribute(
"
_listener
"
);?
}
?
%>
?
current?users:
<
p
>
?
<%
?
java.util.Collection?l?
=
?OnlineUsers.getInstance().getUsers();?
for
(java.util.Iterator?it?
=
?l.iterator();?it.hasNext();)?
{?
?User?tu?
=
?(User)it.next();?
?
if
(u.equals(tu))?
?
{?
%>
?
<
font?color
=
red
><%=
tu.getName()
%>
:
<%=
tu.getAddress()
%>
?
</
font
>
???
<%
?
?}
else
{?
%>
?
<%=
tu.getName()
%>
:
<%=
tu.getAddress()
%>
???
<%
?
?}
?
}
?
%>
?
<
form?action
=
"
/cctc/login.jsp
"
>
?
User?:?
<
input?name
=
"
user
"
?type
=
"
text
"
>
?
<
br
>
?
<
input?type
=
"
submit
"
?name
=
"
Submit
"
>
?
</
form
>
?
<
p
>
?
<
a?href
=
"
/cctc/login.jsp?logout=true
"
>
Logout
</
a
>
?
<
p
>
?
<
a?href
=
"
/cctc/login.jsp
"
>
refresh
</
a
>
?
web.xml文件中增加:
<
listener
>
?
??
<
listener
-
class
>
com.ccctc.view.web.OnlineUserListener
</
listener
-
class
>
?
?
</
listener
>
發表于 2010-01-18 16:52
DZM.528
閱讀(1099)
評論(0)
編輯
收藏
所屬分類:
JavaEE
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
Log4J使用完全手冊(轉)
Apache安裝設置 - Ubuntu中文
快速建立Subversion服務器
JSP容器的初始化和銷毀 - ServletContext(轉)
Java讀寫cookie
Ubuntu下安裝和配置Apache2
struts2:利用標簽顯示List嵌套Map
用Session實現在線統計的功能(HttpSessionListener)
JSP防止重復提交,重復刷新,后退
struts2.0標簽應用–for循環的實現
<
2010年1月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
導航
BlogJava
首頁
發新隨筆
發新文章
聚合
管理
統計
隨筆: 92
文章: 0
評論: 18
引用: 0
隨筆分類
(70)
IDE/Tools(9)
(rss)
IM(7)
(rss)
Java Security(5)
(rss)
JavaEE(16)
(rss)
JS/jQuery(12)
(rss)
Linux(10)
(rss)
XHtml/CSS(3)
(rss)
人生規劃(2)
(rss)
性能測試(2)
(rss)
數據庫(2)
(rss)
網絡編程(2)
(rss)
收藏夾
(4)
JavaSE學習系列(4)
(rss)
左鄰右舍
1-2-3.cnblogs
DANCE WITH JAVA
downpour博客
fangang
java加密解密/壓縮
Ken Wu`s Blog
Max On Java
Openfire研究小組
robbin的自言自語
zwt2001267
不朽的飛翔
大鵬的工作筆記
繆小東博客
股海e程
都市淘沙者
我的鏈接
Apache Mina學習
apache2 安裝與配置
blogjava-google搜索
Core Java學習
Dom4j 學習筆記
Epoch Converter
Hibernate annotations reference[zh_cn]
httpclient入門
Java1.5泛型指南
java開源大全
Java性能優化技巧集錦
Java數字證書實例
java知識點
Java程序員應該好好看看的書籍
Java編程實現支持中文的Base64編碼轉換
Java網絡編程從入門到精通
Java網絡編程-清華java教程筆記
jQuery api
jQuery1.1 API 中文版
jQuery中文社區
jQuery官方網站
Js-FAQ貼
jsonlint-測驗json
json介紹
Maven權威指南
PostgreSQL 8.0.0 中文文檔
struts2.0系列
thickbox-對話框插件
Ubuntu中文
亞當學院
基于 SSH 的遠程操作以及安全,快捷的數據傳輸
播布客
滿江紅-RedsagaTeam
精通JS正則表達式
最新評論
1.?re: 用Keytool和OpenSSL生成和簽發數字證書
@wyh
index.txt刪掉再新建一個就可以了
--silence.lc
2.?rewq
但是而且我日
--黃山
3.?re: Ubuntu下安裝和配置Apache2
受益!
--王老五
4.?re: JSP防止重復提交,重復刷新,后退
頂頂頂
--搜索
5.?re: JSP防止重復提交,重復刷新,后退
sss
--搜索
閱讀排行榜
1.?Ubuntu下安裝和配置Apache2(65528)
2.?用Keytool和OpenSSL生成和簽發數字證書(12939)
3.?Ubuntu中安裝Chrome小記[解決 錯誤:依賴關系沒有滿足:libnss3-1d (>= 3.12.3)](12334)
4.?REFERER及jsp中request.getHeader() 相關詳細(11730)
5.?Tsung安裝與使用(7295)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 DZM.528
主站蜘蛛池模板:
在线a毛片免费视频观看
|
亚洲AV无码成人精品区蜜桃
|
永久免费无码日韩视频
|
在线观看免费中文视频
|
亚洲综合一区国产精品
|
亚洲色一色噜一噜噜噜
|
91久久精品国产免费直播
|
亚洲爆乳少妇无码激情
|
亚洲综合伊人久久大杳蕉
|
一级女性全黄久久生活片免费
|
亚洲AV无码乱码国产麻豆穿越
|
日本红怡院亚洲红怡院最新
|
114级毛片免费观看
|
mm1313亚洲国产精品无码试看
|
亚洲av无码一区二区三区不卡
|
亚洲免费二区三区
|
亚洲无码日韩精品第一页
|
999国内精品永久免费观看
|
成人国产精品免费视频
|
亚洲人成www在线播放
|
日本XXX黄区免费看
|
中国国语毛片免费观看视频
|
亚洲日本一线产区和二线产区对比
|
国产免费啪嗒啪嗒视频看看
|
色噜噜噜噜亚洲第一
|
亚洲黄色网站视频
|
免费人成视频在线
|
青青操免费在线观看
|
免费国产在线精品一区
|
亚洲综合中文字幕无线码
|
久久夜色精品国产噜噜噜亚洲AV
|
亚洲AV永久无码精品一区二区国产
|
97性无码区免费
|
中国xxxxx高清免费看视频
|
成在线人免费无码高潮喷水
|
精品国产亚洲AV麻豆
|
亚洲最大天堂无码精品区
|
亚洲综合图片小说区热久久
|
久久91亚洲精品中文字幕
|
亚洲精品久久久www
|
免费一区二区视频
|