发新话题
移动帖子 加入精华 加入置顶 加入收藏 关注此帖

基础的在线人数的统计.





基础的在线人数的统计.

 工具:Myeclipse或lomboz-eclipse
环境:xp,
服务器:tomcat6.0. 本机
使用技术: 监听器(对servlet上下文的监听和对session的监听)
-----------------------------------------------------------------------
首先介绍下监听器。
(-)监听器主要对三个事件的动作监听:
1 对servletContext的监听
2 对session的监听
3 对request的监听
注:今天只讨论第一和第二种监听,利用这两种监听来完成我们的在线人数统计的程序。
(二) 要想实现监听, 必须实现了一个或多个servlet事件监听器接口的类型。
(三)需要注意的是必须在部署描述符中配置实现类。
今天所使用的类和接口主要有:
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

统计当前在线人员:
(1)思路:1.首先就是我们要实现几个类,哪几个类。首先在线人员,那就必须打开多个浏览器。那就要监听servlet上下文,把所以数据必须保存在application中,必须有一个servletContext对象。
2.针对session变化进行操作。如果登录成功,则将user保存到session中,session.setAttribute(“”);
如果用户注销,则从application中删除此记录。
(2)下面给出登录页面:
--------------------------------------------------login.jsp-----------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.*"%>
<form action="" method="post">
用户名: <input type="text" name="name" /> 
<input type="submit" value="登录" /> 
<a href="logout.jsp">注销</a>
</form>
<%
	request.setCharacterEncoding("gb2312");
	if (request.getParameter("name") != null) {
		session.setAttribute("uname",request.getParameter("name"));
	}
%>
<h2>在线人员</h2>
<hr>
<%
	List l = (List)application.getAttribute("alluser");
		Iterator iter = l.iterator();
		while (iter.hasNext()) {
				
%>
			<li><%=iter.next()%></li>
<%
	}
%>


2注销页面:这个就好简单了,直接调用session中的invalidate ()
------------------------------------------logout.jsp-----------------------------------
<%
	session.invalidate();
%>
3监听类:
------------------------OnLineDemo.java----------------
package com.zhangkai.servlet;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnLineDemo implements ServletContextListener, HttpSessionListener,
		HttpSessionAttributeListener {
	// 声明一个ServletContext对象.
	private ServletContext application = null;

	public void contextInitialized(ServletContextEvent sce) {
		// 容器初始化时,向application中存放一个空的容器
		this.application = sce.getServletContext();
		this.application.setAttribute("alluser", new ArrayList());
	}

	public void contextDestroyed(ServletContextEvent sce) {
	}

	public void sessionCreated(HttpSessionEvent se) {
	}

	public void sessionDestroyed(HttpSessionEvent se) {
		// 将用户名称从列表中删除,首先拿到所以的在线人员,然后找到当前的用户,remove移除掉。
然后再把当前的所以人员保存到session中。
		List l = (List) this.application.getAttribute("alluser");
		String value = (String) se.getSession().getAttribute("uname");
		l.remove(value);
		this.application.setAttribute("alluser", l);
	}

	public void attributeAdded(HttpSessionBindingEvent se) {
		// 如果登陆成功,则将用户名保存在列表之中
		List l = (List) this.application.getAttribute("alluser");
		l.add(se.getValue());
		this.application.setAttribute("alluser", l);
		
	}

	public void attributeRemoved(HttpSessionBindingEvent se) {
	}

	public void attributeReplaced(HttpSessionBindingEvent se) {
	}


Ok了,大体的通过监听session和servlet上下文实现了简单了在线人员的统计。
如果您有好的建议和写的有不对的地方,给我提出来。谢谢。。
.不.要.轻.信.你.听.到.的.每.件.事..不.要.花.光.你.的.所.有..不.要.想.睡.多.久.就.睡.多.久.]无.论.何.时.说.“对.不.起”请.看.着.对.方.的.眼.睛。] 永.远.不要.忽.视.别.人.的.梦.想.。]. .永.远.不.要.以.貌.取.人..。慢.慢.地.说,但.要.迅.速.地.想。..总.有.一.种.平.凡.,让.我.们.泪.流.满.面..



编辑 回复 快速回复 TOP


Re:基础的在线人数的统计.

加精。
这个问题理论上没有好的解决方案。
我以前曾经考虑用flash,连接服务器端口进行在线人数统计。这个是长连接。类似socket。

不过太消耗资源。其实网站不用太精确的统计在线,一般有个大致估计就行了。

快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP

Re:基础的在线人数的统计.

.不.要.轻.信.你.听.到.的.每.件.事..不.要.花.光.你.的.所.有..不.要.想.睡.多.久.就.睡.多.久.]无.论.何.时.说.“对.不.起”请.看.着.对.方.的.眼.睛。] 永.远.不要.忽.视.别.人.的.梦.想.。]. .永.远.不.要.以.貌.取.人..。慢.慢.地.说,但.要.迅.速.地.想。..总.有.一.种.平.凡.,让.我.们.泪.流.满.面..
编辑 回复 快速回复 TOP

Re:基础的在线人数的统计.

这个方法不错,
编辑 回复 快速回复 TOP
发新话题