如题,比如一个系统,用户登录后在内存中就存在一个User类的实例,现在我想通过统计User类的实例数目来知道一个系统当前有多少个用户登录,应该如何实现。

解决方案 »

  1.   

    这样来统计有多少个用户登录不是一个好办法;
    你可以用一个Map来管理所有用户,  用户登录就put到Map中, 用户退出登录就remove掉;
    当然最好的办法还是把用户登录状态记录到数据库中, 这样服务器重启才不会导致所有用户的登录状态都丢失
      

  2.   

    用一個 List 存放 User。
    登入就產生一個 User然後加入,登出或timeout就移出。
      

  3.   

    如果做的是j2ee的话,可以用监听器---httpsessionlistener如果一个用户进来就创建一个session定义一个变量i自加。如果注销就减1
      

  4.   

    拦截器来完成就是了,要取得当前在线的人数无非就是获得数据库中用户的状态,拦截器拦截到有人登录,就装一个人道list里,用户退出,session失效就把list里的人remove掉。
      

  5.   

    后台代码可以这么写,就是用监听器了。
    public class OnLineDemo implements ServletContextListener,HttpSessionListener,HttpSessionAttributeListener
    {
    // 声明一个ServletContext对象
    private ServletContext application = null ;
    public void contextInitialized(ServletContextEvent sce)
    {
    // 容器初始化时,向application中存放一个空的容器
    this.application = sce.getServletContext() ;
    this.application.setAttribute("alluser",new ArrayList()) ;
    } public void contextDestroyed(ServletContextEvent sce)
    {} public void sessionCreated(HttpSessionEvent se)
    {}
    public void sessionDestroyed(HttpSessionEvent se)
    {
    // 将用户名称从列表中删除
    List l = (List)this.application.getAttribute("alluser") ;
    String value = (String)se.getSession().getAttribute("uname") ;
    l.remove(value) ;
    this.application.setAttribute("alluser",l) ;
    } public void attributeAdded(HttpSessionBindingEvent se)
    {
    // 如果登陆成功,则将用户名保存在列表之中
    List l = (List)this.application.getAttribute("alluser") ;
    l.add(se.getValue()) ;
    this.application.setAttribute("alluser",l) ;
    }
    public void attributeRemoved(HttpSessionBindingEvent se)
    {}
    public void attributeReplaced(HttpSessionBindingEvent se)
    {}
    };
      

  6.   

    可以将登陆数量放入session或application中,然后从其获得
      

  7.   

    你可以用map然后把用户存在application的内置对象里面就可以了
    //---接口接收实例化Dao对象操作方法 
    BbsUserDao userDao = new BbsUserDaoImpl();
    User userLogin = userDao.LoginUser(uName,pass);

    if(userLogin==null)
    {
    out.print("用户名密码错误,正在返回上一页面");
    out.print("<meta http-equiv='refresh' content='2;url="+url+"'>");
    return;
    }
    session.setAttribute("USER",userLogin);

    //--创建集合 项application里面添加用户
    List<User> listUser = new ArrayList<User>();

    //----如果建为alluser的值为空 就创建一个alluser。
    if (application.getAttribute("ALLUSER")==null)
    {
    application.setAttribute("ALLUSER",listUser);
    }
    //---读出原始数据
    listUser = (List<User>)application.getAttribute("ALLUSER");

         //---查看是否有重复的用户
    boolean rs = true;
    for(User us:listUser)
    {
    if (us.getUid()==userLogin.getUid())
    {
    rs=false;
    break;
    }
    }
    if(rs){
    listUser.add(userLogin);
    //---在添加至application
    application.setAttribute("ALLUSER",listUser);
    }


      

  8.   

    感谢chenchao051及楼上的朋友,我的意思不是只实现用户统计这个功能,是想知道除了楼上各位提到的方法外,还有没有别的方法来实现,比如我提到的通过统计类的实例的个数来实现,谢谢。
      

  9.   

    放ArrayList等等里边好点吧。
    很容易就知道有多少个了
    读取也方便些
      

  10.   

    放一个ArrayList,有的话+1,没的话增加
      

  11.   

    public class User {
        private static int userCount = 0;
        public User () {
            User.addUserCount(1);
        }
        public void finalize() {
            User.addUserCount(-1);
        }
        private static synchonized void addUserCount(int sign) {
            User.userCount += sign;
        }
        public static int getCount() {
            return User.userCount;
        }
    }可以用User.getCount()取得示例个数。
      

  12.   

    User类里搞个static变量统计,构造方法里++,在finalize里--如果finalize能复活这个对象就不好说了
      

  13.   


    我记得在hashcode的h贴子里我明确指出你从来没有写过hashcode方法,你没有也无法反驳。
    现在我同样明确的指出,你没有用过finalize方法或者用过也是错的。