要實現在線人數統計功能,網上搜了下,都不太滿意。於是自己綜合了一下找到的資料方法,能實現在線人數比較準確的統計。
1.定義一個類OnlineUser
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
/**
*
* @lsls22
* 單例模式
*
*/
public class OnlineUsers {
private static final OnlineUsers onlineUsers = new OnlineUsers();
private static Map<HttpSession, String> userMap;
private OnlineUsers(){
userMap = new HashMap<HttpSession,String>();
}
public static OnlineUsers getInstance(){
return onlineUsers;
}
public static int getUserCount() {
return userMap.size();
}
public static Map<HttpSession, String> getUserMap() {
return userMap;
}
public static void setUserMap(Map<HttpSession, String> userMap) {
OnlineUsers.userMap = userMap;
}
public static OnlineUsers getOnlineusers() {
return onlineUsers;
}
}
2.用戶類實現HttpSessionBindingListener接口,新用戶登錄時生成一個User對象,此時觸發valueBound方法import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements HttpSessionBindingListener{
private String userId;
private String userName;
public String getUserId() {
return userId;
}
public String getUserName() {
return userName;
}
public void setUserId(String userId) {
this.userId = userId;
}
public void setUserName(String userName) {
this.userName = userName;
}
/**
* 用戶登錄後會創建一個新User對象,將它放進OnlineUsers
*/
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
HttpSession session = arg0.getSession();
OnlineUsers.getUserMap().put(session,userId);
}
/**
* 當銷毀一個User對象時,將它從OnlineUsers移除
*/
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
OnlineUsers.getUserMap().remove(arg0.getSession());
}
}
;3.jsp頁面<
%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Online User</title>
<script type="text/javascript" src="js/jquery-1.4.4.min.js"></script>
<script language="javascript" type="text/javascript">
$(function(){;
refreshOnlineUser();
});
//每三秒鐘刷新一次在線人數
function refreshOnlineUser(){
$.ajax({
type:'post',
url:'refresh_onlne_user',
success:function(data){
$('#lbUserCount').attr('innerHTML',data);
},
error:function(data,status){
$.messager.alert('Error',data,'err');
},
dataType:'text'
});
setTimeout("refreshOnlineUser()",3000);
}
</script>
</head>
<body >
<div>在線人數:<label id="lbUserCount"></label></div>
</div>
</body>
</html>
4.請求的Servletprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
for(HttpSession se : OnlineUsers.getUserMap().keySet()){
if(new Date().getTime() - se.getLastAccessedTime() > 6000){
OnlineUsers.getUserMap().remove(se);
}
}
Integer count = OnlineUsers.getUserCount();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
response.getWriter().write(count.toString());
}