Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97065
  • 博文数量: 27
  • 博客积分: 97
  • 博客等级: 民兵
  • 技术积分: 458
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-02 00:11
文章分类
文章存档

2012年(10)

2011年(17)

分类:

2011-12-15 02:44:59

原文地址:在线人数统计 作者:xueliangfei

主要是利用HttpSessionBindingListener接口的对象 当这个对象被绑定到Session中或者从Session中被删除时,更新当前在线的用户名单
 
1  login.html
  1. <html>
  2.     <head>
  3.         <title>登录页面</title>
  4.     </head>
  5.     <body>
  6.         <form action="online" method="post">
  7.             <table>
  8.                 <tr>
  9.                     <td>请输入用户名:</td>
  10.                     <td><input type="text" name="user"></td>
  11.                 </tr>
  12.                 <tr>
  13.                     <td>请输入密码:</td>
  14.                     <td><input type="password" name="password"></td>
  15.                 </tr>
  16.                 <tr>
  17.                     <td><input type="reset" value="重填"></td>
  18.                     <td><input type="submit" value="登录"></td>
  19.                 </tr>
  20.             </table>
  21.         </form>
  22.     </body>
  23. </html>
 
2  UserList.java
 
  1. package org.sunxin.ch15.online;

  2. import java.util.Vector;
  3. import java.util.Enumeration;

  4. public class UserList
  5. {
  6.     private static final UserList userList=new UserList();
  7.     private Vector<String> v;
  8.     
  9.     private UserList()
  10.     {
  11.      v=new Vector<String>();
  12.     }

  13.     public static UserList getInstance()
  14.     {
  15.         return userList;
  16.     }
  17.     
  18.     public void addUser(String name)
  19.     {
  20.         if(name!=null)
  21.             v.addElement(name);
  22.     }
  23.     
  24.     public void removeUser(String name)
  25.     {
  26.         if(name!=null)
  27.             v.remove(name);
  28.     }
  29.     
  30.     public Enumeration<String> getUserList()
  31.     {
  32.         return v.elements();
  33.     }
  34.     
  35.     public int getUserCount()
  36.     {
  37.         return v.size();
  38.     }
  39. }

在这个类的设计上 运用了单例的设计模式

[1]  UserList是一个单例类 所谓单例类,是指一个类只有一个实例 而且zixing实例化并向整个系统提供这个实例  单例类的一个最重要的特点就是构造方法是私有的 从而避免了外部利用该类的构造方法直接创建多个实例 

UserList类的对象是用于存储和获取在线用户的列表 而这个用户列表对于所有的页面来说都应该是同一个 所有的类访问的就是同一个userList对象了

[2]  第八行 定义一个静态的常量 userList 它表示了UserList类的一个对象 在UserList类加载的时候 这个对象就产生了

[3]  11-14行 声明UserList类的构造方法为private,这个是为了避免在外部使用UserList类的构造方法创建其对象

[4]  16-19行 定义一个静态的方法 getInstance()  这个方法 返回在类加载时创建的UserList类的对象 因为getInstance() 方法本身是静态的 所以直接可以通过类名来调用、

[5]  代码的第九行 定义了一个私有的Vector类型的变量 在UserList的构造方法中 对Vector类型的变量v进行了初始化 用于存放String类型的对象 在这个地方没有使用ArrayList  是因为UserList对象可能会被多个线程进行同时访问  因为ArrayList不是同步的 而Vector是同步的 所以采用Vector来保存用户列表

 

3  User.java

 

  1. package org.sunxin.ch15.online;

  2. import javax.servlet.http.HttpSessionBindingListener;
  3. import javax.servlet.http.HttpSessionBindingEvent;

  4. public class User implements HttpSessionBindingListener
  5. {
  6.     private String name;
  7.     private UserList ul=UserList.getInstance();
  8.     
  9.     public User()
  10.     {
  11.     }
  12.     public User(String name)
  13.     {
  14.         this.name=name;
  15.     }
  16.     public void setName(String name)
  17.     {
  18.         this.name=name;
  19.     }
  20.     public String getName()
  21.     {
  22.         return name;
  23.     }
  24.     public void valueBound(HttpSessionBindingEvent event)
  25.     {
  26.         ul.addUser(name);
  27.     }
  28.     public void valueUnbound(HttpSessionBindingEvent event)
  29.     {
  30.         ul.removeUser(name);
  31.     }
  32. }

User类实现了HttpSessionBindingListener接口 表示登录的用户

[1]  第九行 通过UserList类的静态方法 getInstance()得到UserList类的对象

[2]  26-29行 当User对象加入到Session中时 Servlet容器将调用valueBound()方法 我们将用户的名字保存到用户列表中

[3]  30-33行 当User对象从Session中被删除时,Servlet容器将调用valueUnbound()方法 我们从用户列表中删除该用户

4  OnlineUserServlet.java

 

  1. package org.sunxin.ch15.online;

  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.util.Enumeration;

  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;

  10. public class OnlineUserServlet extends HttpServlet
  11. {
  12.     public void doGet(HttpServletRequest req, HttpServletResponse resp)
  13.                throws ServletException,IOException
  14.     {
  15.         req.setCharacterEncoding("gb2312");
  16.         String name=req.getParameter("user");
  17.         String pwd=req.getParameter("password");
  18.             
  19.         if(null==name || null==pwd || name.equals("") || pwd.equals(""))
  20.         {
  21.             resp.sendRedirect("login.html");
  22.         }
  23.         else
  24.         {
  25.             HttpSession session=req.getSession();
  26.             User user=(User)session.getAttribute("user");
  27.             if(null==user || !name.equals(user.getName()))
  28.             {
  29.                 user=new User(name);
  30.                 session.setAttribute("user",user);
  31.             }
  32.             
  33.             resp.setContentType("text/html;charset=gb2312");
  34.             PrintWriter out=resp.getWriter();
  35.             
  36.             out.println("欢迎用户"+name+"登录");
  37.             UserList ul=UserList.getInstance();
  38.             out.println("
    当前在线的用户列表:
    "
    );
  39.             Enumeration<String> enums=ul.getUserList();
  40.             int i=0;
  41.             while(enums.hasMoreElements())
  42.             {
  43.                 out.println(enums.nextElement());
  44.                 out.println("    ");
  45.                 if(++i==10)
  46.                 {
  47.                     out.println("
    "
    );
  48.                 }
  49.             }
  50.             out.println("
    当前在线的用户数:"
    +i);
  51.             out.println("

    退出登录");

  52.             out.close();
  53.         }
  54.     }
  55.     
  56.     public void doPost(HttpServletRequest req, HttpServletResponse resp)
  57.                throws ServletException,IOException
  58.     {
  59.         doGet(req,resp);
  60.     }
  61. }

用于向用户显示欢迎信息 当前在线人数列表和在线用户数

[1]  代码的第24-29行 首先从Session中获取名为user的属性对象 通过判断它是否为空来判断在此次对话中用户是否已经登录   如果user对象不为null 那么接着判断在同一个会话中 用户是否更换了一个用户名登录 如果user对象为空或者当前登录的用户名和先前登录的用户名不同 则以当前登录的用户名创建一个User对象 将这个对象绑定到Session 这个时候  Servlet容器就会调用User对象的valueBound()方法 将这个用户的名字保存在用户列表中

[2]  35行 得到UserList类的对象

[3]  37行 得到用户列表的枚举对象

[4]  39-47行 循环取出在线用户的名字并输出 一旦输出超过10个用户名 就输出一个换行

[5]  48行 输出当前在线的用户数

 

5  LogoutServlet.java

 

  1. package org.sunxin.ch15.online;

  2. import java.io.IOException;
  3. import java.io.PrintWriter;

  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import javax.servlet.http.HttpSession;

  9. public class LogoutServlet extends HttpServlet
  10. {
  11.     public void doGet(HttpServletRequest req, HttpServletResponse resp)
  12.                throws ServletException,IOException
  13.     {
  14.         resp.setContentType("text/html;charset=gb2312");
  15.         
  16.         HttpSession session=req.getSession();
  17.         User user=(User)session.getAttribute("user");
  18.         session.invalidate();
  19.         
  20.         PrintWriter out=resp.getWriter();
  21.         out.println("退出登录");
  22.         out.println(user.getName()+",你已退出登录
    "
    );
  23.         out.println("重新登录");
  24.         out.println(" ");
  25.         out.close();
  26.     }
  27. }

代码第16行 调用HttpSession对象的invalidate()方法 使session失效 从而删除绑定到这个Session中的User对象 Servlet容器就会调用这个User对象的valueUnbound()方法 从用户列表中删除该用户

 

 

阅读(749) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~