统计在线用户列表:
1,写一个单例类,增加一个类型为ArrayList的属性,用来存储所有在线的用户(也可以用数据库进行操作)
2,利用session绑定的事件监听器对正常退出系统的用户进行监听
3,考虑用户以浏览器的关闭按钮关闭或以Alt+F4进行关闭(这可以用javascript对用户的操作进行捕捉,网上这方面够多)
4,当非正常关闭,如电脑突然断电,用户直接关闭电脑等,这需要等到session失效后,用户列表中的用户才能清除
共用到了7个文件:
UserList.java
/**
* 用于存储用户列表的容器
* 这是一个单例类
*/
package com.session;
import java.util.ArrayList;
import java.util.List;
public class UserList
{
private List list;
private static UserList instance = null;
// 以private的方式来声明构造方法,使得其他的类对象无法调用此类的构造函数
private UserList()
{
list = new ArrayList();
}
public static synchronized UserList getInstance()
{
if (instance == null)
{
instance = new UserList();
}
return instance;
}
public void addUser(String userName)
{
if (userName != null)
{
list.add(userName);
}
}
public void removeUser(String userName)
{
if (userName != null)
list.remove(userName);
}
public List getList()
{
return list;
}
}
UserBinding.java/**
* 实现了HttpSessionBindingListener接口,
* 以对用户监听,我们必须实现valueBound和
* UnvalueBound方法
*/
package com.session;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class UserBinding implements HttpSessionBindingListener
{
private String userName;
private UserList userList = UserList.getInstance();
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
public void valueBound(HttpSessionBindingEvent e)
{
System.out.println(userName);
userList.addUser(userName);
System.out.println(userList.getList());
}
public void valueUnbound(HttpSessionBindingEvent e)
{
userList.removeUser(userName);
}
}
UserListServlet.java
/**
* 对登录用户进行逻辑处理的Servlet程序
*/
package com.session;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 UserListServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
doPost(request,response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
HttpSession session=request.getSession();
System.out.println(session.getId());
UserBinding user=new UserBinding();
String userName=request.getParameter("userName");
if(null==userName||"".equals(userName))
{
return;
}
//用户名不为空
user.setUserName(userName);
session.setAttribute("user", user);
// UserList userList=UserList.getInstance();
// //System.out.println(userList.getList());
// request.setAttribute("userList",userList);
//
// RequestDispatcher rd=request.getRequestDispatcher("../userlist.jsp");
// rd.forward(request,response);
response.sendRedirect("../userlist.jsp");
}
}
LogoutServlet.java
/**
* 用于注销
*/
package com.session;
import java.io.IOException;
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
{
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
HttpSession session = request.getSession();
if (session != null)
{
session.invalidate();
}
response.sendRedirect("../userlist.jsp");
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
}
简单的登录界面:
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="servlet/UserListServlet" method="POST">
<input type="text" name="userName" >
<input type="submit" name="login" value=" 登 录 ">
</form>
</body>
</html>
显示用户列表:
userlist.jsp
<%@ page language="java" import="java.util.*"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.session.UserList"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户列表</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript" src="refresh.js">
</script>
</head>
<body>
<h2>在线用户列表</h2>
<div id="userList">
<%
UserList userList=UserList.getInstance();
List<String> list = userList.getList();
for (int i = 0; i < list.size(); i++)
{
out.println(list.get(i) + "<br>");
}
%>
</div>
<form action="servlet/LogoutServlet" method="GET">
<input type="submit" name="logout" value=" 注 销 ">
</form>
</body>
</html>
最后是实现页面无刷新的javascript代码
refresh.js
/* 页面无刷新的javascript代码 */ window.οnlοad=initAll; var httpReq=false; var url="userlist.jsp"; function initAll() { makeRequest(url); } function makeRequest(url) { if(window.XMLHttpRequest)// Mozilla, Safari,... { httpReq=new XMLHttpRequest(); } else { if(window.ActiveXObject)//IE { try { httpReq=new ActiveXObject("Microsoft.XMLHTTP"); } catch(e){} } } if(httpReq) { httpReq.onreadystatechange=tillRefresh; httpReq.open("GET",url,true);//异步 httpReq.send(null); } else { alert("不能创建一个XMLHTTPRequest实例"); } } function tillRefresh() { var tempDiv=document.createElement("div"); var userList=document.getElementById("userList"); if(httpReq.readyState==4) { if(httpReq.status==200) { tempDiv.innerHTML=httpReq.responseText; var required=tempDiv.getElementsByTagName("div"); userList.innerHTML=required[0].innerHTML; setTimeout("makeRequest(url)",5000); } else { alert("对不起,出现了一些问题 :"+httpReq.status); } } }
对用户以浏览器的关闭按钮关闭或以Alt+F4进行关闭的情况没有写出,因为对javascript不太懂,COME ON!!!