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> > <A href= "http://www.yueddd.com/ " target=_blank> 阅读大地俱乐部 </A> > <A href= "http://www.yueddd.com/Forum/index.jsp?area_id=2 " target=_top> 游者社区 </A> > 在线名单 </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 也只需要几十秒服务器就知道客户端已离线.