在JSP中怎么能显示在线的用户人数??
怎么统计??什么方法??谢谢解答!!
seth 回复于:2003-05-01 02:28:02
用application对象。
简单描述如下:
当用户登录时维护一个会话对象:UserInfo类的实例,同时UserInfo类实现javax.servlet.http.HttpSessionBindingListener接口:
import java.util.Map;
import java.util.HashMap;
import javax.servlet.http.*;
import javax.servlet.ServletContext;
public class UserInfo implements HttpSessionBindingListener {
// 用户信息
int userId;
String userName;
......
/**
* 当UserInfo类被绑定到session中时触发这个事件
* 具体信息请参见Servlet/JSPs的规范
*/
public void valueBound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession ();
ServletContext ctx = session.getServletContext ();
Map map = (Map)ctx.getAttribute ("users");
if (map == null) { // 如果是服务器启动后的第一个登录用户,新建一个容器
map = new HashMap ();
ctx.setAttribute ("users", map);
}
map.put (userName, this); // 把自己加入容器中
}
/**
* 当UserInfo类从session中删除时触发这个事件
* 具体信息请参见Servlet/JSPs的规范
*/
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession ();
ServletContext ctx = session.getServletContext ();
Map map = (Map)ctx.getAttribute ("users");
map.remove (this); // 把自己从容器中删除
}
......
}
以后在JSP中就可以这样显示在线用户数了:
<%
int userCount = 0;
java.util.Map map = (java.util.Map)application.getAttribute ("users");
if (map == 0) userCount = 0;
else userCount = map.size ();
%>
当然你也可以不实现javax.servlet.http.HttpSessoinBindLisenter接口,而用自己的程序来实现这个功能,但这种方法最保险,也最简单
zhangv 回复于:2003-05-03 20:18:02
还有一个问题
如果用户是关掉浏览器离开的
这个事件怎么处理?
seth 回复于:2003-05-03 21:01:56
没关系的,如果用户关掉浏览器,过一段时间后session就会超时,这时发触发valueUnbound事件
zhangv 回复于:2003-05-03 22:06:46
[quote:f0bab42ada="seth"]没关系的,如果用户关掉浏览器,过一段时间后session就会超时,这时发触发valueUnbound事件[/quote:f0bab42ada]
哦~~~~知道了
但是我现在,removeAttribute("users")之后为什么对象还在列表里?
seth 回复于:2003-05-03 22:08:52
不太明白你所指的是什么。能不能说的更详细一些?
zhangv 回复于:2003-05-03 22:24:33
[quote:fa4b28d39b="seth"]不太明白你所指的是什么。能不能说的更详细一些?[/quote:fa4b28d39b]
是这样的:
我想做一个在线用户列表.
登录成功后,我把这个实现了sessionbindinglistener的user(类似你上面写的那个userInfo)加入倒session里.(现在这个用户被加入了列表)
但是有两个问题:(关于如何把用户从列表中删除)
1.我的注销操作是这样的:session.removeAttribute("user"),但是显示列表是这个用户仍然存在....奇怪
2.你说的session的失效时间,session是失效了,但是用户也没有从列表中删除.
(说完)
不如在qq上说吧.66315033
seth 回复于:2003-05-04 20:09:21
不好意思,在valueUnbound中的
map.remove (this)
改为
map.remove (this.userName)
就行了
zhangyunpo 回复于:2003-05-06 20:04:21
请问 是什么符号??多谢!!
zhangyunpo 回复于:2003-05-06 20:05:07
是空格吗?? ?? ??
seth 回复于:2003-05-06 20:30:31
什么空格?
fatkite 回复于:2004-11-10 09:41:48
请问这位大侠,在valueBound和valueUnbound里面,用不着加入ctx.setAttribute(map);吗?
longyunfei 回复于:2004-11-16 23:23:43
如果我想关闭浏览器,就立即反映。应该怎么做啊?
moonight 回复于:2004-11-17 07:46:10
我觉得seth的意思已经说到了。但是代码有些问题,估计要运行还得再改改。
开眼界。我原来用的是HttpSessionAttributeListener。是自己生成在线列表,不是用application。意思差不多。
我总觉得直接让UserInfo这个属性类继承servlet的监听器而且影响application的属性。恐怕分层不是很清晰。
longyunfei 回复于:2004-11-21 19:24:43
我有个问题,想请教,就是怎么判断session失效,最好在session失效时,就立即作出响应.而不是等到删除session的时候再做处理.
菜鸟CC 回复于:2004-11-22 10:59:34
关掉浏览器 session的活动周期不是停止了吗
ruknow 回复于:2004-11-22 22:32:58
[quote:f1cae1aa44="longyunfei"]我有个问题,想请教,就是怎么判断session失效,最好在session失效时,就立即作出响应.而不是等到删除session的时候再做处理.[/quote:f1cae1aa44]