首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

jsp怎么编写在线统计人数的功能

2011-12-02 
jsp怎样编写在线统计人数的功能。我编写一个Online.jsp,利用HttpSessionListener实现在线人数统计MySession

jsp怎样编写在线统计人数的功能。
我编写一个Online.jsp,利用HttpSessionListener实现在线人数统计MySessionListener.java和PubFunction.java结果当直接关闭浏览器,无法显示及统计,请高手们帮个忙看看,谢谢。代码如下:
package   com.winlink.logo.util;

import   java.text.*;
import   java.util.*;
import   com.jspsmart.upload.*;
import   java.sql.Statement;
import   java.sql.ResultSet;
import   java.sql.DriverManager;

public   class   PubFunction   {
        public   PubFunction()   {
        }
       
        public   static   String   Null2Str(String   s)   {
                if   (s   ==   null)
                    s   =   " ";
                else
                    s   =   s.trim();
                return   s;
        }
       
        public   static   String   charsetConvert(String   s)
        {
              //   s=   s.replaceAll   ( " ' ", "\ " ");
                String   temp   =   null;
                try
                {
                        temp   =   new   String(s.getBytes( "ISO-8859-1 "),   "GB2312 ");
                }
                catch(Exception   e)   {   }
                    return   temp;
        }
       
        public   static   String   englishConvert(String   s)
        {
                String   temp   =   null;                
                try
                {
                        temp   =   new   String(s.getBytes( "GB2312 "),   "ISO-8859-1 ");
                }
                catch(Exception   e)   {   }
                    return   temp;
        }
       
        public   static   String   formateDate(Date   d)
        {
                SimpleDateFormat   sdf   =  
                        new   SimpleDateFormat( "yyyy-MM-dd   HH:mm:ss ");  
                return   sdf.format   (d);


        }
       
        public   static   String   formateShortDate(Date   d)
        {
                SimpleDateFormat   sdf   =  
                        new   SimpleDateFormat( "yyyy-MM-dd ");  
                return   sdf.format   (d);
        }
       
        public   static   Date   parseDate(String   date)
        {
                try{                
                        SimpleDateFormat   sdf   =  
                                new   SimpleDateFormat( "yyyy-MM-dd   HH:mm:ss ");  
                        return   sdf.parse   (date);
                }catch(Exception   e){
                        return   null;
                }
        }
       
       
        public   static   void   main(String[]   args)   throws   Exception{      
                String   s   =   "123;fewafa;faewf;123 ";
                System.out.println   (s.split   ( "; ").length);                
        }
}
package   com.winlink.logo.Forum;


import   javax.servlet.http.HttpSessionEvent;
import   javax.servlet.http.HttpSessionListener;

public   class   MySessionListener   implements   HttpSessionListener   {
public   static   java.util.HashMap   sessionl   =   new   java.util.HashMap();
        public   static   int   onlineUsers   =   0;
        public   void   sessionCreated(HttpSessionEvent   httpSessionEvent)   {
        onlineUsers++;
        sessionl.put(httpSessionEvent.getSession().getId(),httpSessionEvent.getSession());
        }
        public   void   sessionDestroyed(HttpSessionEvent   httpSessionEvent)   {
        onlineUsers--;
        sessionl.remove(httpSessionEvent.getSession());  
        }
}

web.xml   加入

    <listener>
        <listener-class> com.winlink.logo.Forum.MySessionListener </listener-class>
    </listener>


<%@   page   contentType= "text/html;charset=gb2312 "%>      
<%@   page   import= "com.winlink.logo.Forum.MySessionListener "%>  


<%@   page   import= "com.winlink.logo.Forum.* "%>
<%@   page   import= "com.winlink.logo.util.* "%>
<%   int   onlineuser   =   com.winlink.logo.Forum.MySessionListener.onlineUsers;%>
<!DOCTYPE   HTML   PUBLIC   "-//W3C//DTD   HTML   4.0   Transitional//EN ">
<HTML>
<HEAD>
<TITLE> 在线名单_阅读大地俱乐部 </TITLE>
<META   http-equiv=Content-Type   content= "text/html;   charset=gb2312 ">
<META   http-equiv=Content-Language   content=zh-cn>
<META   content=JavaScript   name=vs_defaultClientScript>
<META   content=http://schemas.microsoft.com/intellisense/ie5   name=vs_targetSchema>
<LINK   href= "css/css.css "   type=text/css   rel=stylesheet>
</head>      
    <body       bgcolor= "#ffffff ">      
            <DIV   style= "PADDING-TOP:   10px ">
                <p> <FONT   face=宋体> 导航: <A   href= "http://www.yueddd.com/ "   target=_blank> YUEDDD.COM </A> &gt; <A   href= "http://www.yueddd.com/ "   target=_blank> 阅读大地俱乐部 </A> &gt; <A   href= "http://www.yueddd.com/Forum/index.jsp?area_id=2 "   target=_top> 游者社区 </A>   &gt;   在线名单 </FONT> </p>
                <p> 前在总线人数: <font   color= "#FF0000 "> <%=onlineuser%> </font> <br>
                </p>
                <p> 已经登录的有: <br>      
                </p>
            </DIV>
    <table   width= "100% "     border= "0 ">
        <tr>
            <%      
    java.util.HashMap   qq=com.winlink.logo.Forum.MySessionListener.sessionl;      
    int   j=0;
    if   (qq.size()> 0){      
        java.util.Collection   cc=qq.values();      
            Object   aa[]   =cc.toArray();      
            for(int   i   =   0;i <aa.length;i++){      
            if   (((javax.servlet.http.HttpSession)aa[i]).getAttribute( "user ")!=null){  

ForumUser   fu=(ForumUser)((javax.servlet.http.HttpSession)aa[i]).getAttribute( "user ");  
                        if(j%3==0){
                                if(i==0){
                                        out.println   ( " <tr> ");                                        


                                }
                                else{
                                        out.println   ( " </tr> ");
                                        out.println   ( " <tr> ");
                                }
                        }
                        out.println   ( " <TD> ");
out.print   ( " <DIV   style=\ "WIDTH:   120px;   HEIGHT:   9px\ "> <font   color=\ "blue\ "> ");    
if   (fu.getUser_role()> 1){
out.print   (PubFunction.charsetConvert(fu.getName()));
out.print( " <font   color=\ "#FF0000\ "> 社区管理员 </font> ");
}else{
out.print   (PubFunction.charsetConvert(fu.getName()));
}
out.print   ( " </font> </div> </td> ");            
j++;                        
            }
    }    
    }  
    %>
        </tr>
    </table>
    </body>      
    </html>    


[解决办法]
怎么无法显示?页面上根本就没有在线人数还是当关闭浏览器的时候不能及时显示当前人数?关闭浏览器后要等到session过期了才能及时显示当前真正的人数~
[解决办法]
嗯,顶一下,我也有类似的问题!
[解决办法]
设置一个全局的count数,然后,设置一个全局的ArrayList,每进来一个人,就在ArrayList里面加上此人的用户名以及密码,每次进来一个人,就先验证,验证通过啦,然后在ArrayList里面查看下,如果没有的话,就把这个人的信息加进ArrayList里面去,同时count++。这样你不就可以随时知道count的数量,也就知道有多少人在线了吗?
[解决办法]
这个直接关闭IE的做法没有非常准确统计人数. 只有等session过期才准
[解决办法]
对,只有session判断过期没有才可以,不过IE关闭自动关闭session
[解决办法]
web程序是基于http协议的,而http协议是无状态的协议,也就是说服务器不用维护客户端的信息,只是简单的对客户端发出的请求做出应答,却并不知道客户端是那里,基于此,所以服务器没法精确的知道在线人数的,
[解决办法]
可以在body的onload事件里触发一个请求(比如:在onload的处理方法里window.location= "logout.do "),表示IE关闭。
[解决办法]
zjf405(疯狂的石头:如果答错了,请您原谅 < <)
怎么无法显示?页面上根本就没有在线人数还是当关闭浏览器的时候不能及时显示当前人数?关闭浏览器后要等到session过期了才能及时显示当前真正的人数~

实际测试中,此话是正确的。
[解决办法]
俺的解决方案 : 准备点AJAX知识, 让程序循环在 30秒内向服务器提取一些 系统动态信息.这不仅能将服务器上的一些动态信息在最短时间内反应出来,而且可以动态的向服务器延长SESSION时间,然后在登陆系统时将SESSION 有效期设置为 40秒, 这样即使关闭IE 也只需要几十秒服务器就知道客户端已离线.

热点排行