您的位置:首页 > 其它

在线人数统计

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: