关于JSP在线显示的????

王朝厨房·作者佚名  2007-01-04
宽屏版  字体: |||超大  

在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]

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有