监听器

监听器应用一般统计在线人数,闲着没事,写个笔记,我们项目中是这样做的

首先定义一个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>
原文地址:https://www.cnblogs.com/chizizhixin/p/6957586.html