dwr reverse-ajax 实例解析

在网上找了一个老外写的dwr  reverse-ajax的例子,自己把coding顺序调整了一下希望可以对学习dwr reverse-ajax的朋友有所帮助
1、首先要下载dwr 2.0 地址 http://getahead.org/dwr/download
2、在web.xml中加入dwr的servlet和相关配置
None.gif   <!-- dwr servlet -->
None.gif  
< servlet >
None.gif    
< servlet-name > dwr-invoker </ servlet-name >
None.gif    
< display-name > DWR Servlet </ display-name >
None.gif    
< servlet-class > uk.ltd.getahead.dwr.DWRServlet </ servlet-class >
None.gif    
< init-param >
None.gif        
< param-name > debug </ param-name >
None.gif        
< param-value > true </ param-value >
None.gif    
</ init-param >
None.gif   
   < init-param >
None.gif      
< param-name > pollAndCometEnabled </ param-name >
None.gif      
< param-value > true </ param-value >
None.gif    
</ init-param >
None.gif    
< load-on-startup > 1 </ load-on-startup >       
None.gif  
</ servlet >
None.gif  
< servlet-mapping >
None.gif      
< servlet-name > dwr-invoker </ servlet-name >
None.gif      
< url-pattern > /dwr/* </ url-pattern >
None.gif  
</ 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
None.gif <? xml version="1.0" encoding="UTF-8" ?>
None.gif
<! DOCTYPE dwr PUBLIC
None.gif    "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
None.gif    "http://www.getahead.ltd.uk/dwr/dwr10.dtd"
>
None.gif
< dwr >
None.gif  
< allow >
None.gif    
< create  creator ="new"  javascript ="DWRHelper" >
None.gif      
< param  name ="class"  value ="com.cloverworxs.uma.helper.DWRHelper"   />
None.gif      
< include  method ="addMessage"   />
None.gif    
</ create >
None.gif        
< convert  converter ="bean"  match ="com.cloverworxs.uma.helper.Message" >
None.gif      
< param  name ="include"  value ="id,text"   />
None.gif    
</ convert >
None.gif  
</ allow >
None.gif
</ dwr >
None.gif
create是只一个java的js映射,其中include是可以在js使用的方法
convert 是指对应js到java,或者java到js的对象转换,其中include是可以转换的属性
4、写服务段的java代码
DWRHelper
None.gif package  com.cloverworxs.uma.helper;
None.gif
None.gif
import  java.util.ArrayList;
None.gif
import  java.util.Collection;
None.gif
import  java.util.Iterator;
None.gif
import  java.util.LinkedHashMap;
None.gif
import  java.util.LinkedList;
None.gif
import  java.util.List;
None.gif
import  java.util.Map;
None.gif
None.gif
import  org.directwebremoting.ScriptBuffer;
None.gif
import  org.directwebremoting.WebContext;
None.gif
import  org.directwebremoting.WebContextFactory;
None.gif
import  org.directwebremoting.proxy.dwr.Util;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public   class  DWRHelper  {
InBlock.gif     
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void addMessage(String text) {
InBlock.gif        LinkedList messages 
= new LinkedList();
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (text != null && text.trim().length() > 0{
InBlock.gif            messages.addFirst(
new Message(text));
ExpandedSubBlockStart.gifContractedSubBlock.gif            
while (messages.size() > 10{
InBlock.gif                messages.removeLast();
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif        
// Reverse Ajax code to be added here shortly
InBlock.gif
        WebContext wctx = WebContextFactory.get();
InBlock.gif        String currentPage 
= wctx.getCurrentPage();
InBlock.gif
InBlock.gif        
// Clear the input box in the browser that kicked off this page only
InBlock.gif
        Util utilThis = new Util(wctx.getScriptSession());
InBlock.gif        utilThis.setValue(
"text""");
InBlock.gif
InBlock.gif        
// For all the browsers on the current page:
InBlock.gif
        Collection sessions = wctx.getScriptSessionsByPage(currentPage);
InBlock.gif        Util utilAll 
= new Util(sessions);
InBlock.gif       
 // Clear the list and add in the new set of messages
InBlock.gif
        utilAll.removeAllOptions("chatlog");
InBlock.gif        utilAll.addOptions(
"chatlog", messages, "text");
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif   
ExpandedBlockEnd.gif}

None.gif
Message
None.gif package  com.cloverworxs.uma.helper;
None.gif
None.gif
import  org.directwebremoting.Security;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public   class  Message  {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public Message(String newtext) {
InBlock.gif        text 
= newtext;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (text.length() > 256{
InBlock.gif            text 
= text.substring(0256);
ExpandedSubBlockEnd.gif        }

InBlock.gif        text 
= Security.replaceXmlCharacters(text);
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public long getId() {
InBlock.gif        
return id;
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public String getText() {
InBlock.gif        
return text;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
private long id = System.currentTimeMillis();
InBlock.gif
InBlock.gif    
private String text;
ExpandedBlockEnd.gif}

None.gif
5、到此为止可以写页面代码了,下面的代码html或者jsp都可以
None.gif < h1 > Java Chat </ h1 >
None.gif
< body  onload ="dwr.engine.setActiveReverseAjax(true);" >
None.gif
< script  type ='text/javascript'  src ='/sperc/dwr/interface/DWRHelper.js' ></ script >
None.gif
< script  type ='text/javascript'  src ='/sperc/dwr/engine.js' ></ script >
None.gif
< script  type ='text/javascript'  src ='/sperc/dwr/util.js' ></ script >
None.gif
< 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 >
None.gif
< p > Your Message:  < input  id ="text"  onkeypress ="dwr.util.onReturn(event, sendMessage)"   />   < input  type ="button"  value ="Send"  onclick ="sendMessage()"   /></ p >
ExpandedBlockStart.gifContractedBlock.gif
< script  type ="text/javascript" >
ExpandedSubBlockStart.gifContractedSubBlock.gif    
function sendMessage() {
InBlock.gif      alert(dwr.util.getValue(
"text"));
InBlock.gif      DWRHelper.addMessage(dwr.util.getValue(
"text"));
ExpandedBlockEnd.gif    }

None.gif
</script>
None.gif
<hr />
None.gif
<ul id="chatlog" style="list-style-type:none;">
None.gif
</ul>
None.gif
</body>
None.gif
页面代码简单吧,只有方法调用,没有任何获得返回数据,和对回传数据处理的代码
注意: < 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下推信息
118543.html

rocket 2007-05-19 14:48 发表评论
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值