急等有一个有效的例子!!
3个100分的帖子有效的!

解决方案 »

  1.   

    另一帖!
    http://community.csdn.net/Expert/topic/5509/5509437.xml?temp=.8490564
      

  2.   

    /**
     * 实现在线注册用户数量和用户名字监听
     * 从而查询到在线用户的名字列表.
     * 此类实例的作用域应为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());
     }*/
    }
      

  3.   

    /**
     * @author lichuxiong
     * 记录用户在线人数类(游客和登陆系统的用户全部统计)
     */
    package arch.listener;import javax.servlet.*;
    import javax.servlet.http.*;public class UserListener implements HttpSessionListener,ServletContextListener {
    private static int count=0;
    private ServletContext 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();
    }
    }
      

  4.   

    <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);//以当前登录用户的名字加入监听对象中
    其它的自己慢慢想吧
    现在也没法细说,实在对不起了
      

  5.   

    如果一个用户登入之后又执行其它的一些操作,也要建立session,那不是在线人数对于这个用户不就重复加了几次了吗????
      

  6.   

    一般只有一个session,向session里添加属性即可.
    即使如此,我发的第一个也不能达到精确计数,比如一个人关闭IE后再来此网站可能就会再记一个用户,有人提出控制session的有效时间,但这个想法实在太烂了.但不这样又很难精确计数.
    所以折中处理吧,不一定要精确的。
      

  7.   

    google 一下吧 真的很多 真的
      

  8.   

    实际上 web 真的不能很精确的统计出在线人数实践过很多种方法了 楼上给出的代码就能实现在线人数的统计
      

  9.   

    用session会不会不合适啊,用读写文件试试,把用户和游客的信息记录在一个文件里,再用
    lichuxiong() 提供的方法来对文件进行操作。文件其实也不合适,要是可以的话,到可以用一个数据库表来记录这些东西 ,只要一个查询就可以了。