监听器应用一般统计在线人数,闲着没事,写个笔记,我们项目中是这样做的
首先定义一个servlet 这个servelt 在服务器启动时,就会调用,初始化:
这个是 web.xml的配置
<!-- added by li'n for 登陆页面自动读取访问数 on 2013-04-15 the beginning --> <servlet> <servlet-name>VisitCounts</servlet-name> <servlet-class>com.sysware.framework.login.VisitCounts</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <!-- added by li'n for 登陆页面自动读取访问数 on 2013-04-15 the end -->
2、项目登录页面可以获取访问本项目的总人数(init方法)
package com.sysware.framework.login; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import javax.servlet.http.HttpServlet; /** * @version 1.0 * @author li'n on 系统工程部 * @since 2013-04-15 17:00 * */ public class VisitCounts extends HttpServlet{ /** * */ private static final long serialVersionUID = -6737156348721467846L; //累计访问量 public static int counts = 0; public static void setCounts(int counts) { VisitCounts.counts = counts; } /** * * @return 历史访问量 */ public int getCounts() { return counts; } /** * 服务器启动时读取文件中的历史访问量 */ public void init() { //获取visitCount.txt的文件路径 String p = this.getClass().getClassLoader().getResource("").getPath(); File file = new File(p+File.separator +"visitCount.txt"); //读取文件中的数字,即系统的历史访问量 if (file.exists()) { readFile(file); } else { try { file.createNewFile(); readFile(file); } catch (IOException e) { e.printStackTrace(); } } } /** * 读取文件file中的访问量数据 */ @SuppressWarnings("static-access") public void readFile(File file){ BufferedReader reader = null; String tempString = null; try { reader = new BufferedReader(new FileReader(file)); while((tempString = reader.readLine()) != null) { VisitCounts.counts = Integer.parseInt(tempString); System.out.println(); this.setCounts(counts); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
3、在用户登录时,数量加1并用流写到文件里面(doLogin方法里面处理)
if(loginInfo.isSuccess()) { //added by li'n for 访问量统计 on 2013-04-19 the beginning //登录成功,访问量加1 VisitCounts.setCounts(VisitCounts.counts + 1); //将访问量更新到文件visitCount.txt writeFile(); //added by li'n for 访问量统计 on 2013-04-19 the end }
/**
* 将访问量更新到文件visitCount.txt
* @return 历史访问量
* @author li'n on 系统工程部
* @since 2013-04-19
*/
public void writeFile(){
FileWriter filewrite = null;
try {
//获得文件路径
filewrite = new FileWriter(this.getClass().getClassLoader().getResource("").getPath()+File.separator +"visitCount.txt");
//将访问量写入文件
int o = VisitCounts.counts;
filewrite.write(o + " ");
filewrite.flush();
filewrite.close();
} catch (Exception e) {
e.printStackTrace();
}
}
以上,是实现累计访问量的一个方法;
下面说说实现在线人数,这个就要用到监听器的方式
首先还是在 web.xml中配置你所写的监听器
<!-- 在线用户session监听器 --> <listener> <listener-class>com.sysware.framework.login.OnlineSessionListener</listener-class> </listener>
2、监听器类
package com.sysware.framework.login; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import com.sysware.framework.commons.SystemConstants; /** * * * 在线session监听器 * * @version : 1.0 * @since : 2012-5-21下午08:46:02 * @team : 系统管理 * @author : liuxj */ public class OnlineSessionListener implements HttpSessionAttributeListener { @Override public void attributeAdded(HttpSessionBindingEvent event) { if (SystemConstants.SESSION_KEY.equals(event.getName())) { OnlineUserContext.getInstance().addSession(event.getSession()); } } @Override public void attributeRemoved(HttpSessionBindingEvent event) { if (SystemConstants.SESSION_KEY.equals(event.getName())) { OnlineUserContext.getInstance().removeSession(event.getSession()); } } @Override public void attributeReplaced(HttpSessionBindingEvent event) { if (SystemConstants.SESSION_KEY.equals(event.getName())) { OnlineUserContext.getInstance().replaceSession(event.getSession()); } } }
package com.sysware.framework.login; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.servlet.http.HttpSession; import com.sysware.framework.commons.SystemConstants; import com.sysware.framework.eobs.commons.ObjectCloneUtils; import com.sysware.utils.SyswareUtil; /** * copyright : Sysware Technology Co., Ltd * * 在线用户信息上下文 * * @version : 1.0 * @since : 2012-5-21下午08:31:07 * @team : 系统管理 * @author : liuxj */ public class OnlineUserContext { private static OnlineUserContext onlineUserContext; // 用户在线信息 private Map<String, HttpSession> onlineUserMap; private OnlineUserContext() { onlineUserMap = new HashMap<String, HttpSession>(); } /** * 获取在线用户上下文实例 * * @since : 2012-5-23:下午05:47:55 * @return 在线用户上下文实例 */ public static OnlineUserContext getInstance() { return onlineUserContext == null ? onlineUserContext = new OnlineUserContext() : onlineUserContext; } /** * 加入session触发 * * @since : 2012-5-21:下午09:02:26 * @param session * session对象 */ synchronized void addSession(HttpSession session) { onlineUserMap.put(session.getId(), session); } /** * 移除Session * * @since : 2012-5-21:下午09:02:56 * @param session * session对象 */ synchronized void removeSession(HttpSession session) { if (onlineUserMap.containsKey(session.getId())) { onlineUserMap.remove(session.getId()); } } /** * 替换Session * * @since : 2012-5-21:下午09:03:18 * @param session * session对象 */ synchronized void replaceSession(HttpSession session) { addSession(session); } /** * 根据用户ID判断是否登录 * * @since : 2013-1-28:下午02:01:31 * @param userId * 用户ID * @return true已经登录|false未登录 */ public boolean isLogged(String userId) { List<OnlineUserInfo> list = getOnlineUserInfoList(); for (OnlineUserInfo info : list) { if (info.isLogged() && info.getUserId().equals(userId)) { return true; } } return false; } /** * 根据sessionId获取session * @since : 2012-12-17:下午01:06:11 * @param sessionId sessionId * @return session */ public HttpSession getSession(String sessionId) { return onlineUserMap.containsKey(sessionId) ? onlineUserMap.get(sessionId) : null; } /** * 根据sessionId移除session * @since : 2012-12-17:下午01:05:39 * @param sessionId sessionId */ public void removeSession(String sessionId) { HttpSession session = getSession(sessionId); if(!SyswareUtil.isEmpty(session)) { session.invalidate(); session = null; } } /** * 获取当前登录操作用户数量 * * @since : 2012-5-21:下午09:20:54 * @return 登录操作用户数量 */ public int getLoginUserCount() { int num = 0; List<OnlineUserInfo> list = getOnlineUserInfoList(); for(OnlineUserInfo info : list) { if(info.isLogged()) { num ++; } } return num; } /** * 获取当前未登录的操作用户数量 * * @since : 2012-5-21:下午09:21:14 * @return 未登录的操作用户数量 */ public int getNoLoginUserCount() { int num = 0; List<OnlineUserInfo> list = getOnlineUserInfoList(); for(OnlineUserInfo info : list) { if(!info.isLogged()) { num ++; } } return num; } /** * 获取当前操作用户总数 * * @since : 2012-5-21:下午09:22:16 * @return 操作用户总数 */ public int getOperatorCount() { return getOnlineUserInfoList().size(); } /** * 获取当前操作用户列表 * * @since : 2012-5-22:上午10:11:39 * @return 操作用户列表 */ public synchronized List<OnlineUserInfo> getOnlineUserInfoList() { List<OnlineUserInfo> list = new ArrayList<OnlineUserInfo>(); Iterator<Entry<String, HttpSession>> iterator = onlineUserMap .entrySet().iterator(); while (iterator.hasNext()) { Entry<String, HttpSession> entry = iterator.next(); OnlineUserInfo info = ObjectCloneUtils.clone(getOnlineUserInfo(entry.getKey())); info.setSessionId(entry.getKey()); list.add(info); } return list; } /** * 获取在线用户信息 * * @since : 2012-5-21:下午09:14:01 * @param sessionId * session的ID * @return 在线用户信息 */ private OnlineUserInfo getOnlineUserInfo(String sessionId) { HttpSession session = getSession(sessionId); return SyswareUtil.isEmpty(session) ? null : (Operator) session.getAttribute(SystemConstants.SESSION_KEY); } }
上面的方法,一个是在线统计人数,一个是实现总访问量,自己项目中运用的,做个笔记。
<div class="visit">当前访问数:<span id="nowVisitCount" style="color:#5374B1;"><%=OnlineUserContext.getInstance().getLoginUserCount() %></span></div> <div class="count">累计访问数:<span id="historyVisitCount" style="color:#5374B1;"><%=new LoginServiceImpl().getCounts()%></span></div>