利用xmlhttp和Java session监听改善站内消息系统
利用xmlhttp和Java session监听改善站内消息系统
这个标题含有许多需求解释的概念,最容易阐明的是“站内消息”,这是很多论坛都有的性能,可能经过web向其余的在线用户发送消息,很多用户都利用过。站内消息的第一个益处是大家都不需求装置客户端,你不用知道对方的MSN或许QQ,就能与他联络,称赞他的观点或许是给他一顿臭骂。第二个益处是客户治理方便,应用session来维护在线名单,各种脚本都已经把session操作封装得很易用了,不用像其余无形状的即时通讯工具(比如利用UDP通讯的工具)一样,要费一些脑细胞来处理在线名单的成绩。缺陷嘛,就是实时性不好,普通是在用户跳转或许刷新页面能力探测消息、更新在线名单。
Session监听嘛,没什么好解释的,java提供了很灵敏的事情机制来监听session,可能监听session的创建和销毁,监控session所携带数据的创建、变化和销毁,可能监听session的锐化和钝化(了解对象序列化的兄弟应该知道这个),其余的平台是个什么情况我不太清楚,预计也差不多吧。假设可以对一切客户的session停止监控,就不用再去操作费事而风险的Application了。
Xmlhttp是MS推的一项技术,性能很简单,可能做很多事件,比如客户端可能在简略的HTML中打开HTTP衔接,自动向server申请数据并获得前往数据,是DOM技术一个十分重要的运用,应用它来写无刷新的动态页面简直是soeasy,做过web开发的兄弟应该明确它的意义有如许严重。
一、session监听
servlet中对session的监听有很多接口,性能很灵敏,最常用的是监听Session和Attribute。这里要廓清一下概念,servlet中的session监听和Attribute监听含义有差别,session监听指的不是咱们普通所理解的放置一个session或许销毁一个session,这是Attribute监听的性能,由于servlet中放置session的语法是session.setAttribute(“session名”,要放入的对象)。而session监听,监听的是HTTP衔接,只需有用户与server衔接,就算衔接的是一个空白的jsp页面,也会触发session事情,所以此处的session实践上指的是connection,用来统计以后在线用户数最适合了。不知道我说清楚了没有。下面分别讲解这两种监听模式。
1、session监听
首先编写一个session监听类,实作HttpSessionListener接口,它的作用是计算以后有多少个在线用户:
/**
*@Authorbromon
*2004-6-12
*/
packageorg.bromon.test;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclassSessionCountimplementsHttpSessionListener
{
privatestaticintcount=0;
publicvoidsessionCreated(HttpSessionEventse)
{
count++;
System.out.println(“session创建:”+newjava.util.Date());
}
publicvoidsessionDestroyed(HttpSessionEventse)
{
count--;
System.out.println(“session销毁:”+newjava.util.Date());
}
publicstaticintgetCount()
{
return(count);
}
}
怎样样,是不是了如指掌?count被定义为static,是由于要保证整个系统只要这一个count。假设你真实不释怀,可能把它写成一个单例类。
然后在web.xml中申明这个监听器:
<listener>
<listener-class>
org.bromon.test.SessionCount
</listener-class>
</listener>
编写一个测试页面test.jsp,内容是获得count:
<%
intcount=org.bromon.test.SessionCount.getCount();
out.println(count);
%>
需求留意的是,这里基本不触及任何session的操作。重启动Appserver,试着衔接test.jsp,可能看到监听器已经末尾工作。
2、Attribute监听
作为一个站内消息系统,一定要获得一切登陆者的ID,才有能够互发消息。这就触及Attribute监听。假定咱们写了个用户登陆的模块,用户经过身份验证之后会产生一个session,保存它的相干信息,比如:
//check.jsp
<%
Stringname=request.getParameter(“name”);
Name=newString(name.getBytes(“ISO8859-1”));
session.setAttribute(“user”,name);
%>
做过jsp的兄弟应该对这段代码再相熟不过了,下面写个监听器来监听用户登陆,把一切用户的ID保存到一个List当中,这个监听器实作HttpSessionAttributeListener接口:
/**
*@Authorbromon
*2004-6-12
*/
packageorg.bromon.test;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.util.*;
publicclassOnlineListimplementsHttpSessionAttributeListener
{
privatestaticListlist=newArrayList();
publicvoidattributeAdded(HttpSessionBindingEventse)
{
if(“user”.equals(se.getName()))
{
list.add(se.getValue());
}
}
publicvoidattributeRemoved(HttpSessionBindingEventse)
{
if(“user”.equals(se.getName()))
{
list.remove(se.getValue());
}
}
publicvoidattributeReplaced(HttpSessionBindingEventse){}
publicstaticListgetList()
{
return(list);
}
}
写个简略的jsp来失去用户列表:
<%
java.util.Listlist=org.bromon.test.OnlineList.getList();
out.println(“共有”+list.size()+”名用户已登陆:”);
for(intI=0;I<lise.size();i++)
{
out.println(list.get(i));
}
%>
兴许你说,这有什么神奇呢,监听session而已,不着急,看看xmlhttp。
二、XMLHTTP
XMLHTTP的用处很多,这里只说咱们需求的,就是无刷新的与server通讯,看这段代码:
<scriptlanguage="javascript">
xml=newActiveXObject("Microsoft.XMLHTTP");
varpost="";//结构要携带的数据
xml.open("POST",":7001/TestWL/index.jsp",false);//利用POST方法打开一个到服务器的衔接,以异步模式通讯
xml.setrequestheader("content-length",post.length);
xml.setrequestheader("content-type","application/x-www-form-urlencoded");
xml.send(post);//发送数据
varres=xml.responseText;//接纳服务器前往的数据
document.write(res);
</script>
释然开朗,这段代码就是打开一个HTTP衔接,以标准的HTTP格式传递数据,假设你青睐,可能用XML的格式来传递。更改一下xml对象的结构模式就可能兼容Mozilla和Netscape。下面来写一个轮询,每隔一段工夫刷新一次用户列表,当然,是不需求刷新页面的:
<html>
<head><title>探测器</title>
<scriptlanguage="javascript">
functiondetect()
{
xml=newActiveXObject("Microsoft.XMLHTTP");
varpost="";//结构要携带的数据
xml.open("POST",":7001/TestWL/index.jsp",false);//利用POST方法打开一个到服务器的衔接,以异步模式通讯
xml.setrequestheader("content-length",post.length);
xml.setrequestheader("content-type","application/x-www-form-urlencoded");
xml.send(post);//发送数据
varres=xml.responseText;//接纳服务器前往的数据
list.innerText=res;
setTimeout(“detect()”,5000);//每隔5秒钟轮询一次
}
</script>
<bodyonload=”detect()”>
<aid=”list”></a>
</body>
</html>
这样的通讯模式数据量很小,不用重新传递整个页面,5秒钟轮一次,一般PC也能接受较大的在线数。结构一个探测器来监听在线列表和消息,效果是很好的,即使你的客户坐在电脑前袖手旁观,键鼠都不碰一下,也能保证数据即时传递,页面也不会发生跳转和刷新。
Session监听加上XMLHTTP通讯,开发一个较为欠缺的站内消息系统真实易如反掌