在线人数统计
2015-08-28 15:19
351 查看
在线人数统计
分类: 系统运维
主要是利用HttpSessionBindingListener接口的对象 当这个对象被绑定到Session中或者从Session中被删除时,更新当前在线的用户名单
1 login.html
<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>
2 UserList.java
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
分类: 系统运维
主要是利用HttpSessionBindingListener接口的对象 当这个对象被绑定到Session中或者从Session中被删除时,更新当前在线的用户名单
1 login.html
<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>
2 UserList.java
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
相关文章推荐
- Android Fragment——处理Fragment生命周期
- 单例之懒汉式和饿汉式
- 4.容器中管理数据
- python监控windows的CPU,Memory,Disk
- 常用的OpenCV函数速查
- [刷题]Nth to Last Node in List
- linux shell if 参数
- 利用redis + lua解决抢红包高并发的问题
- hackerrank:Palindrome Index(hash)
- java源码查看工具之Source Insight
- CSS3:固定textarea文本域宽度
- 手机网站和电脑网站设计是需注意的区别
- 3.仓库
- Qt Creator编译器设置:添加C++11支持
- Activiti值活动节点,排他网关(ExclusiveGateWay)and并行网关(parallelGateWay) (八)
- 匈牙利算法
- 最长递增子序列 O nlgn时间复杂度
- Entity Framework Extended Library
- CSS样式表
- GridView使用CommandField删除列实现删除时提示确认框