Chinaunix

标题: 关于JSP在线显示的???? [打印本页]

作者: zhangyunpo    时间: 2003-04-26 10:00
标题: 关于JSP在线显示的????
在JSP中怎么能显示在线的用户人数??
怎么统计??什么方法??谢谢解答!!
作者: seth    时间: 2003-05-01 02:28
标题: 关于JSP在线显示的????
用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
标题: 关于JSP在线显示的????
还有一个问题
如果用户是关掉浏览器离开的
这个事件怎么处理?
作者: seth    时间: 2003-05-03 21:01
标题: 关于JSP在线显示的????
没关系的,如果用户关掉浏览器,过一段时间后session就会超时,这时发触发valueUnbound事件
作者: zhangv    时间: 2003-05-03 22:06
标题: 关于JSP在线显示的????
[quote]原帖由 "seth"]没关系的,如果用户关掉浏览器,过一段时间后session就会超时,这时发触发valueUnbound事件[/quote 发表:


哦~~~~知道了

但是我现在,removeAttribute("users"之后为什么对象还在列表里?
作者: seth    时间: 2003-05-03 22:08
标题: 关于JSP在线显示的????
不太明白你所指的是什么。能不能说的更详细一些?
作者: zhangv    时间: 2003-05-03 22:24
标题: 关于JSP在线显示的????
[quote]原帖由 "seth"]不太明白你所指的是什么。能不能说的更详细一些?[/quote 发表:


是这样的:
我想做一个在线用户列表.
登录成功后,我把这个实现了sessionbindinglistener的user(类似你上面写的那个userInfo)加入倒session里.(现在这个用户被加入了列表)

但是有两个问题关于如何把用户从列表中删除)
1.我的注销操作是这样的:session.removeAttribute("user",但是显示列表是这个用户仍然存在....奇怪

2.你说的session的失效时间,session是失效了,但是用户也没有从列表中删除.

(说完)
不如在qq上说吧.66315033
作者: seth    时间: 2003-05-04 20:09
标题: 关于JSP在线显示的????
不好意思,在valueUnbound中的
map.remove (this)
改为
map.remove (this.userName)
就行了
作者: zhangyunpo    时间: 2003-05-06 20:04
标题: 关于JSP在线显示的????
请问   是什么符号??多谢!!
作者: zhangyunpo    时间: 2003-05-06 20:05
标题: 关于JSP在线显示的????
是空格吗??  ??  ??
作者: seth    时间: 2003-05-06 20:30
标题: 关于JSP在线显示的????
什么空格?
作者: fatkite    时间: 2004-11-10 09:41
标题: 关于JSP在线显示的????
请问这位大侠,在valueBound和valueUnbound里面,用不着加入ctx.setAttribute(map);吗?
作者: longyunfei    时间: 2004-11-16 23:23
标题: 关于JSP在线显示的????
如果我想关闭浏览器,就立即反映。应该怎么做啊?
作者: moonight    时间: 2004-11-17 07:46
标题: 关于JSP在线显示的????
我觉得seth的意思已经说到了。但是代码有些问题,估计要运行还得再改改。

开眼界。我原来用的是HttpSessionAttributeListener。是自己生成在线列表,不是用application。意思差不多。

我总觉得直接让UserInfo这个属性类继承servlet的监听器而且影响application的属性。恐怕分层不是很清晰。
作者: longyunfei    时间: 2004-11-21 19:24
标题: 关于JSP在线显示的????
我有个问题,想请教,就是怎么判断session失效,最好在session失效时,就立即作出响应.而不是等到删除session的时候再做处理.
作者: 菜鸟CC    时间: 2004-11-22 10:59
标题: 关于JSP在线显示的????
关掉浏览器 session的活动周期不是停止了吗
作者: ruknow    时间: 2004-11-22 22:32
标题: 关于JSP在线显示的????
[quote]原帖由 "longyunfei"]我有个问题,想请教,就是怎么判断session失效,最好在session失效时,就立即作出响应.而不是等到删除session的时候再做处理.[/quote 发表:


--------------------------------------------------------------
<session-config>;
     <session-timeout>;30</session-timeout>;
</session-config>;
把这个数改小,但也有不好之处

立即作出响应 目前可能还没有办法,要知道这是request/response机制




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2