- <html>
- <head>
- <title>登录页面</title>
- </head>
- <body>
- <form action="online" method="post">
- <table>
- <tr>
- <td>请输入用户名:</td>
- <td><input type="text" name="user"></td>
- </tr>
- <tr>
- <td>请输入密码:</td>
- <td><input type="password" name="password"></td>
- </tr>
- <tr>
- <td><input type="reset" value="重填"></td>
- <td><input type="submit" value="登录"></td>
- </tr>
- </table>
- </form>
- </body>
- </html>
- package org.sunxin.ch15.online;
-
- import java.util.Vector;
- import java.util.Enumeration;
-
- public class UserList
- {
- private static final UserList userList=new UserList();
- private Vector<String> v;
-
- private UserList()
- {
- v=new Vector<String>();
- }
-
- public static UserList getInstance()
- {
- return userList;
- }
-
- public void addUser(String name)
- {
- if(name!=null)
- v.addElement(name);
- }
-
- public void removeUser(String name)
- {
- if(name!=null)
- v.remove(name);
- }
-
- public Enumeration<String> getUserList()
- {
- return v.elements();
- }
-
- public int getUserCount()
- {
- return v.size();
- }
- }
在这个类的设计上 运用了单例的设计模式
[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
- package org.sunxin.ch15.online;
-
- import javax.servlet.http.HttpSessionBindingListener;
- import javax.servlet.http.HttpSessionBindingEvent;
-
- public class User implements HttpSessionBindingListener
- {
- private String name;
- private UserList ul=UserList.getInstance();
-
- public User()
- {
- }
- public User(String name)
- {
- this.name=name;
- }
- public void setName(String name)
- {
- this.name=name;
- }
- public String getName()
- {
- return name;
- }
- public void valueBound(HttpSessionBindingEvent event)
- {
- ul.addUser(name);
- }
- public void valueUnbound(HttpSessionBindingEvent event)
- {
- ul.removeUser(name);
- }
- }
User类实现了HttpSessionBindingListener接口 表示登录的用户
[1] 第九行 通过UserList类的静态方法 getInstance()得到UserList类的对象
[2] 26-29行 当User对象加入到Session中时 Servlet容器将调用valueBound()方法 我们将用户的名字保存到用户列表中
[3] 30-33行 当User对象从Session中被删除时,Servlet容器将调用valueUnbound()方法 我们从用户列表中删除该用户
4 OnlineUserServlet.java
- package org.sunxin.ch15.online;
-
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Enumeration;
-
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
-
- public class OnlineUserServlet extends HttpServlet
- {
- public void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException,IOException
- {
- req.setCharacterEncoding("gb2312");
- String name=req.getParameter("user");
- String pwd=req.getParameter("password");
-
- if(null==name || null==pwd || name.equals("") || pwd.equals(""))
- {
- resp.sendRedirect("login.html");
- }
- else
- {
- HttpSession session=req.getSession();
- User user=(User)session.getAttribute("user");
- if(null==user || !name.equals(user.getName()))
- {
- user=new User(name);
- session.setAttribute("user",user);
- }
-
- resp.setContentType("text/html;charset=gb2312");
- PrintWriter out=resp.getWriter();
-
- out.println("欢迎用户"+name+"登录");
- UserList ul=UserList.getInstance();
- out.println("
当前在线的用户列表:
");
- Enumeration<String> enums=ul.getUserList();
- int i=0;
- while(enums.hasMoreElements())
- {
- out.println(enums.nextElement());
- out.println(" ");
- if(++i==10)
- {
- out.println("
");
- }
- }
- out.println("
当前在线的用户数:"+i);
- out.println("
退出登录");
- out.close();
- }
- }
-
- public void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException,IOException
- {
- doGet(req,resp);
- }
- }
用于向用户显示欢迎信息 当前在线人数列表和在线用户数
[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
- package org.sunxin.ch15.online;
-
- import java.io.IOException;
- import java.io.PrintWriter;
-
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
-
- public class LogoutServlet extends HttpServlet
- {
- public void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException,IOException
- {
- resp.setContentType("text/html;charset=gb2312");
-
- HttpSession session=req.getSession();
- User user=(User)session.getAttribute("user");
- session.invalidate();
-
- PrintWriter out=resp.getWriter();
- out.println("");
- out.println(user.getName()+",你已退出登录
");
- out.println("重新登录");
- out.println(" ");
- out.close();
- }
- }
代码第16行 调用HttpSession对象的invalidate()方法 使session失效 从而删除绑定到这个Session中的User对象 Servlet容器就会调用这个User对象的valueUnbound()方法 从用户列表中删除该用户
原文:http://blog.chinaunix.net/uid-26284395-id-3040474.html?bsh_bid=409601823