用xmlhttp和Java session改善站内消息

session|xml

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

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

Xmlhttp是MS推的一项技术,功能很复杂,可以做很多事情,比如客户端可以在简单的HTML中打开HTTP连接,主动向server请求数据并获得返回数据,是DOM技术一个非常重要的应用,利用它来写无刷新的动态页面简直是so easy,做过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接口,它的作用是计算当前有多少个在线用户:
/*
*@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

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);
&lt /script &gt

豁然开朗,这段代码就是打开一个HTTP连接,以标准的HTTP格式传递数据,如果你喜欢,可以用XML的格式来传递。更改一下xml对象的构造方式就可以兼容Mozilla和Netscape。下面来写一个轮询,每隔一段时间刷新一次用户列表,当然,是不需要刷新页面的:

&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通信,开发一个较为完善的站内消息系统实在易如反掌。

时间: 2024-10-30 14:52:42

用xmlhttp和Java session改善站内消息的相关文章

使用xmlhttp和Java session监听改善站内消息系统

session|xml 使用xmlhttp和Java session监听改善站内消息系统 bromon 原创  引自:http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=25340 这个题目含有许多需要解释的概念,最容易说明的是"站内消息",这是很多论坛都有的功能,可以通过web向其他的在线用户发送消息,很多用户都使用过.站内消息的第一个好处是大家都不需要安装客户端,你不用知道对方的MSN或

用xmlhttp和Java session监听改善站内消息系统

session|xml 原文出处:http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=25340 这个题目含有许多需要解释的概念,最容易说明的是"站内消息",这是很多论坛都有的功能,可以通过web向其他的在线用户发送消息,很多用户都使用过.站内消息的第一个好处是大家都不需要安装客户端,你不用知道对方的MSN或者QQ,就能与他联系,称赞他的观点或者是给他一顿臭骂.第二个好处是客户管理方便,利用

xmlhttp和Java session监听改善消息系统

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

java web 的站内链接问题

问题描述 java web 的站内链接问题 在做网站时 <link rel="shortcut icon" type="image/x-icon" href="images/title_ico.ico" media="screen" /> <link href="style/index.css" rel="stylesheet" type="text/css&

仅仅改善站内搜索,就能获得17%的利润增值!

多年从事电子商务的零售商都知道,让消费者登陆网站只是成功的一半,让消费者购买商品则是挑战的另一半.完成销售的一个关键点是确保消费者能够快速.方便地找到他们想要的商品.如果找不到,他们便会很沮丧地去其他网站寻找.这就是为什么一个可靠的网站搜索程序只需点击几次便能产生相应的结果,从而成为在线商家首选程序的原因. 一家研究咨询公司(E-tailing Group公司)的调查表明,增加一个网站搜索系统,或改善现有的系统,能够有效增强网站功能.这已经被69%的零售商响应,去年为65%.看一下成功的案例:

站内消息设计

设计优点,发系统消息给全站用户只需一条记录,不需要每个用户都插入,解决用户量大的问题 登录用户只显示未读的消息.用户查看未读消息后,将消息插入消息回收站表标记为已读,uid与该用户绑定,因此回收站表没有uid=system的记录. 2)已读消息列表:实现方法有2种取其一即可   2.1)插入消息回收站表并删除用户的未读消息表对应记录(非system)   2.2)插入消息回收站表 删除的消息列表:只插入消息回收站表, 未读消息:当前用户没有读过的消息   未读消息/消息表 Java代码   DR

啥时候能站内消息啊我等死了

还有,啥时候能有表情阿,我内心世界这么丰富,没有表情怎么表达我的多样情感呀,我还想升级,不升级多郁闷阿,希望从花籽,花芽成长成百合,管理员你们都在哪里??

站内小纸条如何实现,就像CSDN似的.(高手进)

问题描述 如题,最好有源码参考,谢谢 解决方案 解决方案二:有人知道没有?解决方案三:做Iframe里面嵌套一个页面,这个页面隔一段时间读取数据查看时候有人给你发纸条,就可以了解决方案四:用JS定时调用服务端程序.隔个时间段读取表内信息.有信息则提示.解决方案五:用xmlhttp解决方案六:就是站内信息,先写入数据库,之后按时搜索数据库信息,有新的留言就提示解决方案七:我现在想弹出对话框,然后再进入那个页面怎么做解决方案八:if(confirm("您有新的消息?现在查收吗?")){wi

关于站内搜索的那些事儿

前言 模块化 登录模块 博客扫描模块 博客详情模块 搜索模块 演示 案例一 案例二 总结 前言 之前学过一点点关于全文检索相关的技术,当时使用的是Java语言,Lucene和compass框架.有兴趣的话可以参考下面的专栏链接 http://blog.csdn.net/column/details/lucene-compass.html 然后现在用的是Python了,所以需要迭代一下.网上搜索了下,相关的还真不少,还有pylucene,但是相比较而言,whoosh更为出色.那今天就用它吧. 安装