用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文件里了。
下面是具体的代码:

ExpandedBlockStart.gif ContractedBlock.gif /** */ /** 
InBlock.gif* OnlineUserListener.java 
InBlock.gif* Created on 2004-11-19 
ExpandedBlockEnd.gif
*/
 
None.gif
package  com.ccctc.view.web; 
None.gif
None.gif
import  javax.servlet.http.HttpSessionEvent; 
None.gif
import  javax.servlet.http.HttpSessionListener; 
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/** */ /** 
InBlock.gif
@author litf 
InBlock.gif
ExpandedBlockEnd.gif
*/
 
None.gif
public   class  OnlineUserListener 
ExpandedBlockStart.gifContractedBlock.gif 
implements  HttpSessionListener  dot.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 浏览器第一次访问的时候,调用本方法 
InBlock.gif  * 
@see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent) 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public void sessionCreated(HttpSessionEvent event) dot.gif
InBlock.gif  User u 
= new User(); 
InBlock.gif  u.setName(
"guest"); 
InBlock.gif  u.setId(event.getSession().getId()); 
InBlock.gif  event.getSession().setAttribute(
"currentUser",u); 
InBlock.gif  OnlineUsers.getInstance().addUser(u); 
ExpandedSubBlockEnd.gif }
 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * Session超时的时候,调用本方法 
InBlock.gif  * 
@see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent) 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public void sessionDestroyed(HttpSessionEvent event) dot.gif
InBlock.gif  OnlineUsers.getInstance().removeUser(event.getSession().getId()); 
ExpandedSubBlockEnd.gif }
 
InBlock.gif
ExpandedBlockEnd.gif}
 
None.gif
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/** */ /** 
InBlock.gif* OnlineUsers.java 
InBlock.gif* Created on 2004-11-19 
ExpandedBlockEnd.gif
*/
 
None.gif
package  com.ccctc.view.web; 
None.gif
None.gif
import  java.util.Collection; 
None.gif
import  java.util.HashMap; 
None.gif
import  java.util.Map; 
None.gif
None.gif
import  javax.servlet.http.HttpSession; 
None.gif
import  javax.servlet.http.HttpSessionBindingEvent; 
None.gif
import  javax.servlet.http.HttpSessionBindingListener; 
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/** */ /** 
InBlock.gif
@author litf 
InBlock.gif* 在线用户统计 
ExpandedBlockEnd.gif
*/
 
ExpandedBlockStart.gifContractedBlock.gif
public   class  OnlineUsers  implements  HttpSessionBindingListener dot.gif
InBlock.gif
InBlock.gif 
private Map users = new HashMap(); 
InBlock.gif  
InBlock.gif 
private static OnlineUsers onlineUsers = new OnlineUsers(); 
InBlock.gif  
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public static OnlineUsers getInstance()dot.gif
InBlock.gif  
return onlineUsers; 
ExpandedSubBlockEnd.gif }
 
InBlock.gif  
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 
@return 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public Collection getUsers() dot.gif
InBlock.gif  
return users.values(); 
ExpandedSubBlockEnd.gif }
 
InBlock.gif  
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public void addUser(User user) dot.gif
InBlock.gif  users.put(user.getId(),user); 
ExpandedSubBlockEnd.gif }
 
InBlock.gif  
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public void removeUser(String userId)dot.gif
InBlock.gif  users.remove(userId); 
ExpandedSubBlockEnd.gif }
 
InBlock.gif  
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 对象实例(即OnlineUserListener的实例)作为一个属性被设置到session的 
InBlock.gif  * 时候,会调用本方法,这种情况一般发生在点击登录按钮以后的处理过程中 
InBlock.gif  * 设置 
InBlock.gif  * 
@see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent) 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public void valueBound(HttpSessionBindingEvent event) dot.gif
InBlock.gif  
//现在暂时不需要额外处理,你可以在这里记录日志等 
ExpandedSubBlockEnd.gif
 }
 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 当Session超时,或本实例被从session中移除的时候被调用,这种情况一般 
InBlock.gif  * 发生在注销方法的处理过程中 
InBlock.gif  * 
@see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent) 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public void valueUnbound(HttpSessionBindingEvent event) dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif  
try dot.gif
InBlock.gif   HttpSession session 
= event.getSession(); 
InBlock.gif   User u 
= (User)session.getAttribute("currentUser"); 
InBlock.gif   u.setName(
"guest"); 
ExpandedSubBlockStart.gifContractedSubBlock.gif  }
 catch (RuntimeException e) dot.gif
InBlock.gif   
//e.printStackTrace(); 
ExpandedSubBlockEnd.gif
  }
 
ExpandedSubBlockEnd.gif }
 
InBlock.gif
InBlock.gif  
ExpandedBlockEnd.gif}
 
None.gif
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/** */ /** 
InBlock.gif* User.java 
InBlock.gif* Created on 2004-11-19 
ExpandedBlockEnd.gif
*/
 
None.gif
package  com.ccctc.view.web; 
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/** */ /** 
InBlock.gif
@author litf 
InBlock.gif
ExpandedBlockEnd.gif
*/
 
ExpandedBlockStart.gifContractedBlock.gif
public   class  User dot.gif
InBlock.gif 
private String address; 
InBlock.gif 
private String id; 
InBlock.gif 
private String name; 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 
@see java.lang.Object#equals(java.lang.Object) 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public boolean equals(Object obj) dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif  
if (obj == null || !(obj instanceof User)) dot.gif
InBlock.gif   
return false
ExpandedSubBlockEnd.gif  }
 
ExpandedSubBlockStart.gifContractedSubBlock.gif  
if(this.id !=null && this.id.equals(((User)obj).getId()))dot.gif
InBlock.gif   
return true
ExpandedSubBlockEnd.gif  }
 
InBlock.gif  
return false
ExpandedSubBlockEnd.gif }
 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 
@return 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public String getAddress() dot.gif
InBlock.gif  
return address; 
ExpandedSubBlockEnd.gif }
 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 
@return 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public String getId() dot.gif
InBlock.gif  
return id; 
ExpandedSubBlockEnd.gif }
 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 
@return 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public String getName() dot.gif
InBlock.gif  
return name; 
ExpandedSubBlockEnd.gif }
 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 
@param string 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public void setAddress(String string) dot.gif
InBlock.gif  address 
= string; 
ExpandedSubBlockEnd.gif }
 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 
@param string 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public void setId(String string) dot.gif
InBlock.gif  id 
= string; 
ExpandedSubBlockEnd.gif }
 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 
@param string 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public void setName(String string) dot.gif
InBlock.gif  name 
= string; 
ExpandedSubBlockEnd.gif }
 
InBlock.gif  
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** *//** 
InBlock.gif  * 
@see java.lang.Object#toString() 
ExpandedSubBlockEnd.gif  
*/
 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
public String toString() dot.gif
InBlock.gif  
return "name:"+name + ",id:" + id + ",address:"+address; 
ExpandedSubBlockEnd.gif }
 
InBlock.gif
ExpandedBlockEnd.gif}
 

test.jsp

None.gif <% @ page  import = " com.ccctc.view.web.* "   %>  
None.gif
None.gif
<%  
None.gifUser u 
=  (User)session.getAttribute( " currentUser " ); 
None.gifString name 
=  request.getParameter( " user " ); 
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if (u  !=   null ) dot.gif
InBlock.gif String remote 
= request.getRemoteAddr(); 
InBlock.gif u.setAddress(remote); InBlock.gif  
ExpandedBlockEnd.gif}
 
None.gif
None.gif
// User Login 
ExpandedBlockStart.gifContractedBlock.gif
if (name  !=   null ) dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
if(u != null)dot.gif
InBlock.gif  session.setAttribute(
"_listener",OnlineUsers.getInstance()); 
InBlock.gif  u.setName(name); 
InBlock.gif   
ExpandedSubBlockEnd.gif }
 
ExpandedBlockEnd.gif}
 
None.gif
None.gif
// User Logout 
None.gif
String logout  =  request.getParameter( " logout " ); 
ExpandedBlockStart.gifContractedBlock.gif
if (logout  !=   null ) dot.gif
InBlock.gif session.removeAttribute(
"_listener"); 
ExpandedBlockEnd.gif}
 
None.gif
%>  
None.gif
None.gifcurrent users:
< p >  
None.gif
None.gif
<%  
None.gifjava.util.Collection l 
=  OnlineUsers.getInstance().getUsers(); 
None.gif
for (java.util.Iterator it  =  l.iterator(); it.hasNext();) 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
InBlock.gif User tu 
= (User)it.next(); 
InBlock.gif 
if(u.equals(tu)) 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif
InBlock.gif
%> 
html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值