返回湘西教育e网首页>>

博客博客天地
论坛教育论坛
日记学生日记

您现在位于:首页教育技术 → 软件应用 → 浏览:用xmlhttp和Java sess...
2018年05月27日星期日
 软件应用
 推荐文章
 热门文章
 信息技术
 学科整合
 远程教育
 课件制作
 本类热门文章
 湖南省中小学教师继...
 中小学电脑报征稿函
 2010年湖南省中...
 我国中小学Intern...
 2009年全省中小...
 关于组织参加2009...
 教育部要求中小学装...
 关于组织参加2011...
 教师水平决定农村远...
 2011年全省中小...
 本类推荐文章
 多媒体文件的格式类...
 用《几何画板》改进...
 推行网络信息教学,...
 教师水平决定农村远...
 教育信息化时代教师...
 中美教育技术比较研...
 PowerPoint...
 用PowerPoint...
 信息技术与课程整合...
 试论信息技术与课程...
 文章浏览
用xmlhttp和Java session改善站内消息
出处:转载 作者: 湘西教育教学信息网 2007年12月14日
 

xmlhttpJava session改善站内消息

 

  这个题目含有许多需要解释的概念,最容易说明的是站内消息,这是很多论坛都有的功能,可以通过web向其他的在线用户发送消息,很多用户都使用过。站内消息的第一个好处是大家都不需要安装客户端,你不用知道对方的MSN或者QQ,就能与他联系,称赞他的观点或者是给他一顿臭骂。第二个好处是客户管理方便,利用session来维护在线名单,各种脚本都已经把session操作封装得很易用了,不用像其他无状态的即时通信工具(比如使用UDP通信的工具)一样,要费一些脑细胞来解决在线名单的问题。缺点嘛,就是实时性不好,一般是在用户跳转或者刷新页面才能探测消息、更新在线名单。

Session监听嘛,没什么好解释的,java提供了很灵活的事件机制来监听session,可以监听session的创建和销毁,监控session所携带数据的创建、变化和销毁,可以监听session的锐化和钝化(了解对象序列化的兄弟应该知道这个),其他的平台是个什么情况我不太清楚,估计也差不多吧。如果能够对所有客户的session进行监控,就不用再去操作麻烦而危险的Application了。

XmlhttpMS推的一项技术,功能很复杂,可以做很多事情,比如客户端可以在简单的HTML中打开HTTP连接,主动向server请求数据并获得返回数据,是DOM技术一个非常重要的应用,利用它来写无刷新的动态页面简直是so easy,做过web开发的兄弟应该明白它的意义有多么重大。

一、 session监听

servlet中对session的监听有很多接口,功能很灵活,最常用的是监听SessionAttribute。这里要澄清一下概念,servlet中的session监听和Attribute监听含义有差别,session监听指的不是我们一般所理解的放置一个session或者销毁一个session,这是Attribute监听的功能,因为servlet中放置session的语法是session.setAttribute(“session”,要放入的对象)。而session监听,监听的是HTTP连接,只要有用户与server连接,就算连接的是一个空白的jsp页面,也会触发session事件,所以此处的session实际上指的是connection,用来统计当前在线用户数最合适了。不知道我说清楚了没有。下面分别讲解这两种监听方式。

1 session监听

首先编写一个session监听类,实作HttpSessionListener接口,它的作用是计算当前有多少个在线用户:
/*
*@Author bromon
*2004-6-12
*/
package org.bromon.test;

import javax.servlet.*;
import javax.servlet.http.*;

public class SessionCount implements HttpSessionListener
{
private static int count=0;

public void sessionCreated(HttpSessionEvent se)
{
count++;
System.out.println(“session
创建:”+new java.util.Date());
}

public void sessionDestroyed(HttpSessionEvent se)
{
count--;
System.out.println(“session
销毁:”+new java.util.Date());
}

public static int getCount()
{
return(count);
}
}

怎么样,是不是一目了然?count被定义为static,是因为要保证整个系统只有这一个count。如果你实在不放心,可以把它写成一个单例类。

然后在web.xml中声明这个监听器:
&lt listener &gt
&lt listener-class &gt
org.bromon.test.SessionCount
&lt /listener-class &gt
&lt /listener &gt

编写一个测试页面test.jsp,内容是获得count
&lt %
int count=org.bromon.test.SessionCount.getCount();
out.println(count);
% &gt
需要注意的是,这里根本不涉及任何session的操作。重启动App server,试着连接test.jsp,可以看到监听器已经开始工作。

2 Attribute监听
作为一个站内消息系统,肯定要获得所有登陆者的ID,才有可能互发消息。这就涉及Attribute监听。假设我们写了个用户登陆的模块,用户通过身份验证之后会产生一个session,保存它的相关信息,比如:
//check.jsp
&lt %
String name=request.getParameter(“name”);
Name=new String(name.getBytes(“ISO8859-1”));
session.setAttribute(“user”,name);
% &gt

做过jsp的兄弟应该对这段代码再熟悉不过了,下面写个监听器来监听用户登陆,把所有用户的ID保存到一个List当中,这个监听器实作HttpSessionAttributeListener接口:

/*
*@Author bromon
*2004-6-12
*/
package org.bromon.test;

import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class OnlineList implements HttpSessionAttributeListener
{
private static List list=new ArrayList();

public void attributeAdded(HttpSessionBindingEvent se)
{
if(“user”.equals(se.getName()))
{
list.add(se.getValue());
}
}

public void attributeRemoved(HttpSessionBindingEvent se)
{
if(“user”.equals(se.getName()))
{
list.remove(se.getValue());
}
}

public void attributeReplaced(HttpSessionBindingEvent se){}

public static List getList()
{
return(list);
}
}

写个简单的jsp来得到用户列表:
&lt %
java.util.List list=org.bromon.test.OnlineList.getList();
out.println(“
共有”+list.size()+”名用户已登陆:”);
for(int I=0;I&lt lise.size();i++)
{
out.println(list.get(i));
}
% &gt

也许你说,这有什么神奇呢,监听session而已,不着急,看看xmlhttp

二、 XMLHTTP

<P class=MsoNormal style="BACKGROUND: #fbfdff; TEXT-INDENT: 14.8pt; TEXT-ALIGN: left; mso-char-indent-count: 1.41; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>XMLHTTP的用处很多,这里只说我们需要的,就是无刷新的与server通信,看这段代码:
&lt script language="javascript" &gt
xml = new ActiveXObject("Microsoft.XMLHTTP");
var post=" ";//
构造要携带的数据
xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//
使用POST方法打开一个到服务器的连接,以异步方式通信
xml.setrequestheader("content-length",post.length);
xml.setrequestheader("content-type","application/x-www-form-urlencoded");
xml.send(post);//
发送数据 var res = xml.responseText;//接收服务器返回的数据
document.write(res);

<P class=MsoNormal style="BACKGROUND: #fbfdff; TEXT-INDENT: 14.8pt; TEXT-ALIGN: left; mso-char-indent-count: 1.41; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>&lt /script &gt豁然开朗,这段代码就是打开一个HTTP连接,以标准的HTTP格式传递数据,如果你喜欢,可以用XML的格式来传递。更改一下xml对象的构造方式就可以兼容MozillaNetscape。下面来写一个轮询,每隔一段时间刷新一次用户列表,当然,是不需要刷新页面的:

<P class=MsoNormal style="BACKGROUND: #fbfdff; TEXT-INDENT: 14.8pt; TEXT-ALIGN: left; mso-char-indent-count: 1.41; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>&lt html &gt
&lt head &gt&lt title &gt
探测器&lt /title &gt
&lt script language="javascript" &gt
function detect()
{
xml = new ActiveXObject("Microsoft.XMLHTTP");
var post=" ";//
构造要携带的数据
xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//
使用POST方法打开一个到服务器的连接,以异步方式通信
xml.setrequestheader("content-length",post.length);
xml.setrequestheader("content-type","application/x-www-form-urlencoded");
xml.send(post);//
发送数据
var res = xml.responseText;//
接收服务器返回的数据
list.innerText=res;
setTimeout(“detect()”,5000);//
每隔5秒钟轮询一次
}
&lt /script &gt
&lt body onload=”detect()” &gt
&lt a id=”list” &gt&lt /a &gt
&lt /body &gt
&lt /html &gt
这样的通信方式数据量很小,不用重新传递整个页面,5秒钟轮一次,普通PC也能承受较大的在线数。构造一个探测器来监听在线列表和消息,效果是很好的,即使你的客户坐在电脑前袖手旁观,键鼠都不碰一下,也能保证数据即时传递,页面也不会发生跳转和刷新。

Session监听加上XMLHTTP通信,开发一个较为完善的站内消息系统实在易如反掌。

 

(本文已被浏览 4341 次)
上篇文章:博客文化与现代教育技术 〖文章打印〗
下篇文章:中小学生学籍全国统一管理 逐步与户籍脱钩 〖关闭窗口〗
→ 推荐给我的好友 → 报告错误链接 发布人:-
 文章评论
  ◎ 查看评论    共0条评论,每页显示5条评论   浏览所有评论
(没有相关评论)
  ◎ 发表评论
您还没有 注册登陆 本站!
关于我们 网站留言 友情链接 与我在线 管理中心 加入收藏 设为首页
湘西教育教学信息网http://info.exxedu.cn
Processed in 0.359 s, 13 queries, 13 Cache, 16 Online
湘西州教育科学研究院 版权所有: Copyright © 2005 All Rights Reserved
电子邮箱:xxeduinfo@126.com 备案序号:湘ICP备06010990号