[300分]在jsp页面中如何有效的统计在线用户(只要浏览该网站,而且把登陆的用户的用户名显示出来,如果没有登入显示游客,当然有多
急等有一个有效的例子!!
3个100分的帖子有效的!
[解决办法]
另一帖!
http://community.csdn.net/Expert/topic/5509/5509437.xml?temp=.8490564
[解决办法]
/**
* 实现在线注册用户数量和用户名字监听
* 从而查询到在线用户的名字列表.
* 此类实例的作用域应为application
* @author lichuxiong
*/
package arch.listener;
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.Vector;
public class OnLineUser implements HttpSessionBindingListener{
private static Vector users=new Vector();
public OnLineUser(){}
/**
* 加入session时处理
*/
public void valueBound(HttpSessionBindingEvent e){
users.trimToSize();
if(!existUser(e.getName()))
users.add(e.getName());
}
/**
* 从session中移除时处理
*/
public void valueUnbound(HttpSessionBindingEvent e) {
users.trimToSize();
String userName=e.getName();
deleteUser(userName);
}
/**
* 返回注册登陆的用户数量
* @return
*/
public int getCount(){
users.trimToSize();
return users.capacity();
}
/**
* 判断用户是否已经登陆
* @param userName
* @return
*/
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;
}
/**
* 退出时删除用户
* @param userName
* @return
*/
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;
}
/**
* 获得用户向量,实现在线用户昵称查询
* @return
*/
public Vector getOnLineUser(){
return users;
}
/* public static void main(String[] args){
OnLineUser users=new OnLineUser();
System.out.println(users.getCount());
}*/
}
[解决办法]
/**
* @author lichuxiong
* 记录用户在线人数类(游客和登陆系统的用户全部统计)
*/
package arch.listener;
import javax.servlet.*;
import javax.servlet.http.*;
public class UserListener implements HttpSessionListener,ServletContextListener {
private static int count=0;
privateServletContext context=null;
public UserListener(){
count=0;
}
/**
* session创建时运行
* @param se
*/
public void sessionCreated(HttpSessionEvent se){
count++;
setContext(se);
}
/**
* session销毁时执行
* @param se
*/
public void sessionDestroyed(HttpSessionEvent se){
count--;
if(count <0)count=0;
setContext(se);
}
/**
* 把用户数保存到对所有用户共享的ServletContext中
* @param se
*/
public void setContext(HttpSessionEvent se){
se.getSession().getServletContext().setAttribute( "onLine ", new Integer(count));
}
/**
* context销毁时激发
*/
public void contextDestroyed(ServletContextEvent event){
this.context=null;
}
/**
* context初使休时激发
*/
public void contextInitialized(ServletContextEvent event){
this.context=event.getServletContext();
}
}
[解决办法]
<listener>
<listener-class> arch.listener.UserListener </listener-class>
</listener>
页第一个OnLineUser 类就不用在web-xml中配置,只要在登录时加入此对象到session中即可如:
<jsp:useBean id= "onLineUser " class= "arch.listener.OnLineUser " scope= "page "/>
第二步:
session.setAttribute(username,onLineUser);//以当前登录用户的名字加入监听对象中
其它的自己慢慢想吧
现在也没法细说,实在对不起了
[解决办法]
如果一个用户登入之后又执行其它的一些操作,也要建立session,那不是在线人数对于这个用户不就重复加了几次了吗????
[解决办法]
一般只有一个session,向session里添加属性即可.
即使如此,我发的第一个也不能达到精确计数,比如一个人关闭IE后再来此网站可能就会再记一个用户,有人提出控制session的有效时间,但这个想法实在太烂了.但不这样又很难精确计数.
所以折中处理吧,不一定要精确的。
[解决办法]
学习。
在线用户数会大于保存的用户名的数量。
[解决办法]
google 一下吧 真的很多 真的
[解决办法]
实际上 web 真的不能很精确的统计出在线人数
实践过很多种方法了
楼上给出的代码就能实现在线人数的统计
[解决办法]
用session会不会不合适啊,用读写文件试试,把用户和游客的信息记录在一个文件里,再用
lichuxiong() 提供的方法来对文件进行操作。文件其实也不合适,要是可以的话,到可以用一个数据库表来记录这些东西 ,只要一个查询就可以了。