rocket
走在agile的小路上
BlogJava
首页
新随笔
联系
聚合
管理
随笔-55 评论-208 文章-0 trackbacks-0
dwr reverse-ajax 实例解析
在网上找了一个老外写的dwr reverse-ajax的例子,自己把coding顺序调整了一下希望可以对学习dwr reverse-ajax的朋友有所帮助
1、首先要下载dwr 2.0 地址
http://getahead.org/dwr/download
2、在web.xml中加入dwr的servlet和相关配置
<!--
dwr servlet
-->
<
servlet
>
<
servlet-name
>
dwr-invoker
</
servlet-name
>
<
display-name
>
DWR Servlet
</
display-name
>
<
servlet-class
>
uk.ltd.getahead.dwr.DWRServlet
</
servlet-class
>
<
init-param
>
<
param-name
>
debug
</
param-name
>
<
param-value
>
true
</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>
pollAndCometEnabled
</
param-name
>
<
param-value
>
true
</
param-value
>
</
init-param
>
<
load-on-startup
>
1
</
load-on-startup
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>
dwr-invoker
</
servlet-name
>
<
url-pattern
>
/dwr/*
</
url-pattern
>
</
servlet-mapping
>
pollAndCometEnabled是指dwr 的reverse ajax是使用polling 和comet的方式,在这个例子中可以明显地从页面上看出来是用的polling+comet
附:关于reverse-ajax的实现有3种方式
polling 就是隔一段时间向服务器发送一request来检查服务端是否有数据更新
comet 就是一个长http请求,在请求期间服务端可以向客户端push数据,但是这种做法要求server和brower长期建立一个通信通道,而且效率很低
piggyback 就是服务端的更新数据都在排队等待,等到下一次有请求过来,那么这些等待更新数据就伴随这次请求一起发送到brower
有关更详细的reverse-ajax技术介绍可以参考
http://getahead.org/dwr/reverse-ajax
3、创建一个dwr.xml,用于配置你要制定的java代码映射类,以及允许使用的方法和converter
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd"
>
<
dwr
>
<
allow
>
<
create
creator
="new"
javascript
="DWRHelper"
>
<
param
name
="class"
value
="com.cloverworxs.uma.helper.DWRHelper"
/>
<
include
method
="addMessage"
/>
</
create
>
<
convert
converter
="bean"
match
="com.cloverworxs.uma.helper.Message"
>
<
param
name
="include"
value
="id,text"
/>
</
convert
>
</
allow
>
</
dwr
>
create是只一个java的js映射,其中include是可以在js使用的方法
convert 是指对应js到java,或者java到js的对象转换,其中include是可以转换的属性
4、写服务段的java代码
DWRHelper
package
com.cloverworxs.uma.helper;
import
java.util.ArrayList;
import
java.util.Collection;
import
java.util.Iterator;
import
java.util.LinkedHashMap;
import
java.util.LinkedList;
import
java.util.List;
import
java.util.Map;
import
org.directwebremoting.ScriptBuffer;
import
org.directwebremoting.WebContext;
import
org.directwebremoting.WebContextFactory;
import
org.directwebremoting.proxy.dwr.Util;
public
class
DWRHelper
{
public
void
addMessage(String text)
{
LinkedList messages
=
new
LinkedList();
if
(text
!=
null
&&
text.trim().length()
>
0
)
{
messages.addFirst(
new
Message(text));
while
(messages.size()
>
10
)
{
messages.removeLast();
}
}
//
Reverse Ajax code to be added here shortly
WebContext wctx
=
WebContextFactory.get();
String currentPage
=
wctx.getCurrentPage();
//
Clear the input box in the browser that kicked off this page only
Util utilThis
=
new
Util(wctx.getScriptSession());
utilThis.setValue(
"
text
"
,
""
);
//
For all the browsers on the current page:
Collection sessions
=
wctx.getScriptSessionsByPage(currentPage);
Util utilAll
=
new
Util(sessions);
//
Clear the list and add in the new set of messages
utilAll.removeAllOptions(
"
chatlog
"
);
utilAll.addOptions(
"
chatlog
"
, messages,
"
text
"
);
}
}
Message
package
com.cloverworxs.uma.helper;
import
org.directwebremoting.Security;
public
class
Message
{
public
Message(String newtext)
{
text
=
newtext;
if
(text.length()
>
256
)
{
text
=
text.substring(
0
,
256
);
}
text
=
Security.replaceXmlCharacters(text);
}
public
long
getId()
{
return
id;
}
public
String getText()
{
return
text;
}
private
long
id
=
System.currentTimeMillis();
private
String text;
}
5、到此为止可以写页面代码了,下面的代码html或者jsp都可以
<
h1
>
Java Chat
</
h1
>
<
body
onload
="dwr.engine.setActiveReverseAjax(true);"
>
<
script
type
='text/javascript'
src
='/sperc/dwr/interface/DWRHelper.js'
></
script
>
<
script
type
='text/javascript'
src
='/sperc/dwr/engine.js'
></
script
>
<
script
type
='text/javascript'
src
='/sperc/dwr/util.js'
></
script
>
<
p
>
This is a very simple chat demo that uses reverse ajax to collect messages and server-side browser manipulation to update the pages with the results.
</
p
>
<
p
>
Your Message:
<
input
id
="text"
onkeypress
="dwr.util.onReturn(event, sendMessage)"
/>
<
input
type
="button"
value
="Send"
onclick
="sendMessage()"
/></
p
>
<
script
type
="text/javascript"
>
function
sendMessage()
{
alert(dwr.util.getValue(
"
text
"
));
DWRHelper.addMessage(dwr.util.getValue(
"
text
"
));
}
</
script
>
<
hr
/>
<
ul
id
="chatlog"
style
="list-style-type:none;"
>
</
ul
>
</
body
>
页面代码简单吧,只有方法调用,没有任何获得返回数据,和对回传数据处理的代码
注意:
<
body
onload
="dwr.engine.setActiveReverseAjax(true);"
>
这个是要在使用reverse-ajax的页面必须的!
现在可以启动应用体检一把reverse-ajax,希望你能和我有一样的惊奇感觉
当然,肯定有人会说这种功能用普通的ajax也可以实现啊,为什么要用reverse-ajax
这时候你就要考虑这种情况了,有用户A和用户B同时在发Message,A正在看message没有任何request动作,而B发了一条新message,这时要求这个信息要展现给A看,那么普通的ajax可以处理这种功能吗?这就是reverse-ajax的用途,可以从服务段向brower下推信息
posted on 2007-05-19 14:48
rocket
阅读(6588)
评论(11)
编辑
收藏
评论:
#
re: dwr reverse-ajax 实例解析 2007-06-02 17:24 |
sunflower
公司里有些领导一味追求速度,不让搞设计.
不肯接受新东西,也不让我们年轻人使用新东西.
独断专行.
呵呵,rocket当初走的时候不会因为这个吧.^-^
回复
更多评论
#
re: dwr reverse-ajax 实例解析 2007-06-02 17:26 |
sunflower
还是喜欢fred和phil那些不摆架子的前辈的.
^-^
回复
更多评论
#
re: dwr reverse-ajax 实例解析 2007-08-10 15:53 |
thlzjfe
我怎么看着效果不明显啊?必须点击是才能谈出个提示框,事件 onkeypress 的作用是什么啊,效果有是如何.请回复,谢谢!
回复
更多评论
#
re: dwr reverse-ajax 实例解析 2007-08-11 14:46 |
rocket
你觉得效果不明显是因为单机操作 可以试想一下这样一种情况,两个同时在线的用户,A用户有了操作之后,系统判断会对另外B用户造成影响,那么就可以使用reverse-ajax的方式在不刷新页面的情况下把信息推给B用户
回复
更多评论
#
re: dwr reverse-ajax 实例解析 2007-09-19 09:25 |
yorry
关键在于DWRHelper把msg推给了所有的客户端。
谢谢博主分享。
回复
更多评论
#
re: dwr reverse-ajax 实例解析 2008-03-07 09:43 |
niejun
谢谢分享,确实很惊讶
回复
更多评论
#
re: dwr reverse-ajax 实例解析[未登录] 2008-08-27 14:02 |
kim
非常感谢这个教程。试过了,效果不错。
在用http://***/ ,在IE,Firefox访问都没有问题,
但是https://***/ , IE就一点反应都没有了。Firefox没有问题。
请问知道什么问题吗?谢谢啊
回复
更多评论
#
re: dwr reverse-ajax 实例解析[未登录] 2008-12-04 10:05 |
cc
为什么报错说找不到dwr
回复
更多评论
#
re: dwr reverse-ajax 实例解析[未登录] 2008-12-04 10:24 |
cc
<body onload="dwr.engine.setActiveReverseAjax(true);">可能就是这个dwr找不到
回复
更多评论
#
re: dwr reverse-ajax 实例解析 2009-04-26 14:58 |
longrui
您好:
LinkedList messages = new LinkedList();
的位置写错了,写在方法里在每次调用方法时都会实例一个新的list,那后面储存10条的步骤也就变得没有意义了。
回复
更多评论
#
re: dwr reverse-ajax 实例解析
2009-10-29 16:31 |
benson
我的會一直出現
嚴重的: Error loading WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@107ebe1
uk.ltd.getahead.dwr.DWRServlet
java.lang.ClassNotFoundException: uk.ltd.getahead.dwr.DWRServlet
我有看dwr.jar 裡的確實有 uk.ltd.getahead.dwr.DWRServlet
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
Dict.CN 在线词典, 英语学习, 在线翻译
QQ:19794405
agilelife分享群:59765983
QQ上少了,请大家加入msn group:
agilelife@groups.msn.com
敏捷项目实践经验分享
TDD,重构,迭代,结对
<
2008年12月
>
日
一
二
三
四
五
六
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(7)
给我留言
查看公开留言
查看私人留言
我参与的团队
深圳Java俱乐部(0/0)
随笔分类
(15)
UI相关
好文翻译(1)
常用框架(1)
敏捷方法(4)
数据库相关
构架设计(2)
经验积累(3)
项目管理(4)
随笔档案
(55)
2008年12月 (1)
2008年7月 (2)
2008年5月 (8)
2008年3月 (1)
2008年2月 (4)
2007年10月 (1)
2007年9月 (4)
2007年7月 (3)
2007年5月 (2)
2007年4月 (6)
2007年3月 (5)
2007年2月 (2)
2007年1月 (3)
2006年11月 (3)
2006年10月 (1)
2006年8月 (1)
2006年7月 (1)
2006年5月 (2)
2006年4月 (2)
2006年3月 (3)
相册
rocket
搜索
积分与排名
积分 - 132659
排名 - 464
最新评论
1. re: 找了一天的jsp格式化工具,最后还是用回workshop
nb@2
--3
2. re: 一个以前没有注意的问题:java构造函数的执行顺序
不错,很有帮助
--王鹏飞
3. re: 一个新java web项目入手过程总结
标记一下。
--何杨
4. re: 单元测试究竟是测试什么?[未登录]
单元测试是在测逻辑,包括条件判定,循环等。博主的这段代码不包括任何逻辑,当然不需要用单元测试去覆盖。
--王辉
5. re: 找了一天的jsp格式化工具,最后还是用回workshop
傻逼
--2
阅读排行榜
1. 一个新java web项目入手过程总结(8491)
2. 一个以前没有注意的问题:java构造函数的执行顺序(8185)
3. 找了一天的jsp格式化工具,最后还是用回workshop(7367)
4. dwr reverse-ajax 实例解析(6588)
5. Spring+hibernate 单元测试框架总结(6224)
评论排行榜
1. 不仁义,不仗义(24)
2. 招聘java程序员,系统架构师(20)
3. dwr reverse-ajax 实例解析(11)
4. 找了一天的jsp格式化工具,最后还是用回workshop(10)
5. 单元测试究竟是测试什么?(10)