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

统计论坛在线人数,该如何处理

2012-03-28 
统计论坛在线人数jsp做的论坛,怎样统计论坛的在线人数[解决办法]如果有新的用户登录进来。也就是新开辟了se

统计论坛在线人数
jsp做的论坛,怎样统计论坛的在线人数

[解决办法]
如果有新的用户登录进来。也就是新开辟了session,那么在application中就做+1的操作,session销毁-1
这个比较简单
[解决办法]
首先,编写一个简单的计数器,代码如下:

package gongfei.cmc.articles.onlinecounter; 
public class OnlineCounter { 
private static long online = 0;
public static long getOnline() { 
return online; 
}
public static void raise(){ 
online++; 
}
public static void reduce(){ 
online--; 



  然后,编写HttpSessionListener实现类,在这个实现类的sessionCreated方法中调用OnlineCounter的raise方法,在sessionDestroyed方法中调用OnlineCounter的reduce方法,代码如下:

package gongfei.cmc.articles.onlinecounter; 
import javax.servlet.http.HttpSessionEvent; 
import javax.servlet.http.HttpSessionListener; 
public class OnlineCounterListener implements HttpSessionListener { 
public void sessionCreated(HttpSessionEvent hse) { 
OnlineCounter.raise(); 

public void sessionDestroyed(HttpSessionEvent hse) { 
OnlineCounter.reduce(); 



  再然后,把这个HttpSessionListener实现类注册到网站应用中,也就是在网站应用的web.xml中加入如下内容:

<web-app> 
…… 
<listener> 
<listener-class> 
gongfei.cmc.articles.example.OnlineCounterListener 
</listener-class> 
</listener> 
…… 
</web-app> 

  OK,在线人数统计功能已经实现,只要在JSP页面中加入下面这样的脚本就能显示但前在线人数了:

<%@ page language="java" pageEncoding="GB2312" %> 
<%@ page import="gongfei.cmc.articles.onlinecounter.OnlineCounter" %> 
<html> 
<head><title>On Line Counert</title></head> 
<body bgcolor="#FFFFFF"> 
On line:<%=OnlineCounter.getOnline()%> 
</body> 
</html> 

[解决办法]
如果不是要求特别精确的话可以通过统计session来判断。因为浏览器访问的话你无法解决客户端突然断电之类的一些特殊情况。所以不可能有太精确的统计
[解决办法]
session监听器2楼很详细
[解决办法]
在application中声明一变量。当一个用户登录时就加一。并且要保证线程安全用synchronized关键字控制
[解决办法]
http://topic.csdn.net/u/20120313/09/5f1403a5-26ea-43f3-865b-cd9ca0fdd383.html
看我回复的
[解决办法]
这个问题,论坛里面多的是。搜一下就行啦。
[解决办法]
google下不就是有很多吗?楼主是需要思路吗?还是代码?
[解决办法]
2楼给出答案了,,
[解决办法]
下面为我的测试例子,首先建个web工程,例子中程序包括:OnLineUser.java ,login.jsp ,logout.jsp,onLineUser.jsp,closePage.jsp五个文件


  OnLineUser.java 内容如下:

  

package org.cai.servlet ;

import java.util.* ;
import javax.servlet.http.* ;
import javax.servlet.* ;

public class OnLineUser implements HttpSessionBindingListener{
 public OnLineUser(){
 }
 private Vector users = new Vector() ;
 public int getCount(){
users.trimToSize() ;
return users.capacity() ;
 }
 
 public boolean existUser(String userName){


users.trimToSize() ;
boolean existUser = false ;
for(int i = 0; i < users.capacity(); i++){
if (userName.equals((String)users.get(i))){
existUser = true ;
break ;
}
}
return existUser ;
 }
 
 public boolean deleteUser(String userName){
users.trimToSize() ;
if (existUser(userName)){
int currUserIndex = -1 ;
for (int i= 0; i< users.capacity(); i++){
if (userName.equals((String)users.get(i))){
currUserIndex = i ;
break ;
}
}
if (currUserIndex != -1 ){
users.remove(currUserIndex) ;
users.trimToSize() ;
return true ;
}
}
return false ;
 }
 
 public Vector getOnLineUser(){
return users ;
 }
 
 public void valueBound(HttpSessionBindingEvent e){
users.trimToSize() ;
if (!existUser(e.getName())){
users.add(e.getName()) ;
System.out.print(e.getName() + "\t登入到系统\t" + (new Date())) ;
System.out.println("在线用户数:" + getCount()) ;
}else{
System.out.println(e.getName() + " 系统中已经存在.") ;
}
 }
 
 public void valueUnbound(HttpSessionBindingEvent e){
users.trimToSize() ;
String userName = e.getName() ;
deleteUser(userName) ;
System.out.print(userName + "\t退出系统\t" + (new Date())) ;
System.out.println("在线用户数为:" + getCount()) ;
 }
}

 


  login.jsp 的内容如下 :


  <%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
 <head>
<title>JSP在线人数</title>
 </head>
 <body>
<form name="login" method="post" action="onLineUser.jsp">
用户名称:<input type="text" name="username" />
<input type="submit" name="submit" value="登陆" />
</form>
 </body>
</html>


 logout.jsp的内容如下 :


  <%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ page import="org.cai.servlet.OnLineUser,java.util.*" %>

 <jsp:useBean id="onlineuser" class="org.cai.servlet.OnLineUser" scope="application" />

<html>
 <head>
<title>JSP在线人数</title>
 </head>
 <body>
<center>
<p></h1>登陆成功,欢迎您访问!</h1></p>
</center>
<% 
System.out.println("----------------------- ") ;
String username = request.getParameter("username"); 
if (username != null && onlineuser.deleteUser(username)) {
out.println(username+"已经退出系统!"); 
session.removeAttribute(username) ;
if (onlineuser.getCount() >0) {
out.println("<script>window.location=\"onLineUser.jsp\";</script>") ;
}else{
out.println("<script>window.location=\"login.jsp\";</script>") ;
}
}else {
out.println(username+"没有登陆到系统!"); 
out.println("<script>window.location=\"login.jsp\";</script>") ;
}
%> 
<center> 
<p>webjx.com制作</p> 
<p>&nbsp;</p> 
<p><a href="logout.jsp">退出系统</a></p> 
</center>
 </body>
</html>


  onLineUser.jsp的内容如下:

 


  <%@ page language="java" contentType="text/html;charset=gb2312" %>


<%@ page import="org.cai.servlet.OnLineUser ,java.util.*" %>
<jsp:useBean id="onlineuser" class="org.cai.servlet.OnLineUser" scope="application" />
<html>
 <head>
<title>JSP在线人数</title>
 </head>
 <body>
<center>
<p><h3>登陆成功,欢迎访问cai.com</h3></p>
  
<%
session = request.getSession(false) ;
String username = request.getParameter("username") ;
if (username != null){
if (onlineuser.existUser(username)){
out.println("用户<font color=red>"+username+"</font> 已经登陆!") ;
}else{
session.setMaxInactiveInterval(50);//Session的有效时长,以秒为单位
session.setAttribute(username,onlineuser) ;
out.println("欢迎新用户:<font color=red>" + username + "</font> 登陆到系统!") ;
}
}
out.println("<br>当前在线用户人数:<font color=red>"+onlineuser.getCount()+ "</font></br>") ;
Vector vt = onlineuser.getOnLineUser() ;
Enumeration e = vt.elements() ; 
out.println("在线用户列表:") ;
out.println("<table border=1>") ;
out.println("<center>") ;
out.println("<tr><td>用户名</td><td>操作</td></tr>") ;
while(e.hasMoreElements()){
String uname = (String)e.nextElement() ;
out.println("<tr><td>") ;
out.println("&nbsp;&nbsp;&nbsp;" + uname + "&nbsp;&nbsp;&nbsp;") ;
out.println("</td>") ;
out.println("<td>") ;
out.println("<a href='logout.jsp?username=" + uname + "'> &nbsp;&nbsp;&nbsp;退 &nbsp;&nbsp; 出&nbsp;&nbsp;&nbsp;</a>" ) ;
out.println("</td>") ;
out.println("</tr>") ;
}
out.println("</center>") ;
out.println("</table>");
%>
<p>caiDM制作</p>
<p>&nbsp;</p>
  
<%
out.print("<p> <a href='login.jsp'>登陆</a></p>" ) ;
out.print("<p> <a href='logout.jsp?username=" + username + "'>退出系统</a></p>" ) ;
%>
</center>
 </body>
</html>


  
  closePage.jsp的内容如下:


  

<%@ page contentType="text/html;charset=gb2312"%>
<%@page import="javax.servlet.http.*"%>
<jsp:useBean id="onlineuser" class="org.lab24.servlet.OnLineUser"
scope="application" />
 
<%
//下面的方式会把所的用户赶下线,这个可以是由于没指定一个用户名给valueUnbound方法,所以当使用invalidate方法时,会将所有的用户都赶下线了
//HttpSession session2 = request.getSession(false);//变量名要是最为session会抛异常的。
//HttpSession session = request.getSession();
//session2.invalidate();
 
String username = request.getParameter("username");
if (username != null && onlineuser.deleteUser(username)) {
out.println(username + "已经退出系统!");
session.removeAttribute(username);
out.println("<script>window.location=\"login.jsp\";</script>");
} else {
out.println(username + "已经退出系统!");
out.println("<script>window.location=\"login.jsp\";</script>");
}
%>
web.xml

 


<?xml version="1.0" encoding="UTF-8"?>


<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee ;
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
<listener>
<listener-class>org.lab24.servlet.OnLineUser</listener-class>
</listener>
 
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


URL:http://user.qzone.qq.com/55979071/infocenter#!app=2
[解决办法]
application
[解决办法]
application中存放的数据是所有在线用户都可以访问和修改的。所以可以在application中设置计数器。
当然也会出现线程安全的问题。所以要用synchronized关键字控制。
 

热点排行