?? 統計在線人員列表.txt
字號:
在線用戶列表的寫法近日項目中要用到這個功能,查閱很多資料后,總結如下。由于項目不只要統計用戶數,還要顯示相關在線用戶的信息,所以考慮用HttpSessionBindingListener接口。該接口包含了valueBound()和valueUnbound()兩個方法,分別可以對創建session和注銷session、session過期做出響應。此處我們建立HttpSessionBindingListener接口實現類package com.sscm.common.organization;import javax.servlet.http.*;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import java.util.*;import com.retop.scm.common.*;public class OnlineCounterListener implements HttpSessionBindingListener{ private OnlineUser newUser=null; //OnlineUser是用戶類 /** * Constructor for OnlineCounterListener. */ public OnlineCounterListener() { newUser = new OnlineUser(); } public void valueBound(HttpSessionBindingEvent e){ ScmLogin scmLogin = (ScmLogin)e.getSession().getAttribute("ScmLogin"); newUser.setScmLogin(scmLogin); try { if(isInList(scmLogin)) newUser.updateOnline(); } catch (Exception ex) { } //System.out.println("用戶"+e.getSession().getAttribute("ScmLogin")+"上限"); } public void valueUnbound(HttpSessionBindingEvent e){ ScmLogin scmLogin = (ScmLogin)e.getSession().getAttribute("ScmLogin"); newUser.setScmLogin(scmLogin); try { newUser.updateUnline(); } catch (Exception ex) { } //System.out.println("用戶"+e.getSession().getAttribute("ScmLogin")+"下限"); } public boolean isInList(ScmLogin scmLogin){ List list = OnlineUser.getList(); if(list.size()>0){ for(int i=0;i<list.size();i++){ ScmLogin myLogin = (ScmLogin)list.get(i); if(scmLogin.getUserID().equalsIgnoreCase(myLogin.getUserID())) return false; } } return true; }}該類要在系統中注冊,我用的是Websphere,所以只需在web.xml中添加listener> <listener-class>com.sscm.common.organization.OnlineCounterListener</listener-class></listener>來注冊該類。另外,要實現valueBound()方法,還需在用戶登陸模塊來激活該方法,OnlineCounterListener sessionListener=new OnlineCounterListener();request.getSession(false).setAttribute("listener",sessionListener);此處注冊了listener,相當于后臺多了一個session監聽器。同理,要實現valueUnbound,在注銷模塊添加:session.removeAttribute("listener");來注銷該用戶session即可。再來看用戶實現類package com.retop.scm.common;import java.util.*;public class OnlineUser { private ScmLogin scmLogin = null ; private static List list=new ArrayList(); //用來存放在線用戶列表 /** * Returns the scmLogin. * @return ScmLogin */ public ScmLogin getScmLogin() { return scmLogin; } /** * Sets the scmLogin. * @param scmLogin The scmLogin to set */ public void setScmLogin(ScmLogin scmLogin) { this.scmLogin = scmLogin; } public void updateOnline(){ list.add(this.scmLogin); } public void updateUnline(){ list.remove(this.scmLogin); } public static List getList(){ return list; }}將在線用戶信息放在一個static的list中。此處還用到一個用戶的基類ScmLogin,public class ScmLogin { private String UserID; private String RealName; private Integer OrgID; private String OrgName; private String OrgCode; //add by starrain.tian 2003.12.17 private java.sql.Timestamp loginTime; //add by starrain.tian 2004.11.10 private String ip; ..... setXX,getXX.....}在用戶登錄模塊,只需把ScmLogin放入session即可。mysession.setAttribute("ScmLogin",mylogin);最后在實現頁面,即訪問的jsp頁面里,<%@ page contentType="text/html; charset=GBK"%><%@ page import= "java.util.*"%><%@ page import="com.sscm.common.organization.OnlineCounterListener" %><%@ page import ="com.retop.scm.common.*" %><html><head><title>在線用戶</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><link rel="stylesheet" href="../ScmStyle.css" type="text/css" media="screen"/></head><body><% //session.setMaxInactiveInterval(20); List list = OnlineUser.getList();%><TABLE style="width:100%;" cellSpacing="0" cellPadding="0" border="0"> <tr> <TD width="13%" align="left"><img src="../images/w1.gif"><FONT color="#2f47cc"> 在線用戶列表 當前在線用戶<%=list.size()%>人</FONT> </TD> </tr> <tr><td height="6"> </td></tr></Table><table class="DbGridStyle" cellspacing="1" cellpadding="4" rules="all" border="1" id="comlist" style="width:100%;"> <tr class="GridHeadStyle" nowrap align="Center"> <td><div align="center">用戶ID</div></td> <td><div align="center">用戶名稱</div></td> <td><div align="center">所屬組織</div></td> <td><div align="center">登錄時間</div></td> <td><div align="center">用戶IP</div></td> </tr> <% for(int i=0;i<list.size();i++) { ScmLogin myLogin = (ScmLogin)list.get(i);%> <tr class="ItemStyle"> <td><%=myLogin.getUserID()%></td> <td><%=myLogin.getRealName()%></td> <td><%=myLogin.getOrgName()%></td> <td> <%String loginttime=(String)myLogin.getLoginTime().toString().substring(0,16);out.println(loginttime);%> </td> <td><%=myLogin.getIp()%></td> </tr> <% }%></table></body></html>這樣就可以得到在線用戶信息。在實際測試當中,對用戶直接關閉瀏覽器情況,可以對服務會話進行設置,在web.xml中添加<session-config> <session-timeout>20</session-timeout></session-config>表示20秒 后服務器超時,可以用來測試該情況。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -