满店香的家

学习+实践=进步

第六部分 DWR原理

   通过前面五章学习,对DWR整体有所了解,但是我仍然对核心细节不是很清楚。我最后的办法就是单步调试,调试之后将所有东西串一串,DWR的原理就清楚了,搞清楚核心生产线,其他全是辅助的,没必要再分析了。老外聪明啊,服。
   我们以DWR的第一个样例为例Dynamically Text
   1,在index.html里面我们嵌入
     <script type='text/javascript' src='../dwr/engine.js'> </script>
     <script type='text/javascript' src='../dwr/util.js'> </script>
     <script type='text/javascript' src='../dwr/interface/Demo.js'> </script>
         前面两个都是DWR系统默认需要加载的,Demo.js是Demo.java所对应的。按理论,只要在web.xml和dwr.xml配置好,那么我们就可以在客户端操作Demo.js,类似于操作服务器端的Demo.js。
    

HTML source:

<p>
Name:
<input type="text" id="demoName"/>
<input value="Send" type="button" onclick="update()"/>
<br/>
Reply: <span id="demoReply"></span>
</p>

Javascript source:

function update() {
var name = dwr.util.getValue("demoName");
Demo.sayHello(name, function(data) {
dwr.util.setValue("demoReply", data);
});
}

Java source:

package org.getahead.dwrdemo.simpletext;
public class Demo {
public String sayHello(String name) {
return "Hello, " + name;
}
}

dwr.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="Demo">
<param name="class" value="org.getahead.dwrdemo.simpletext.Demo"/>
</create>
</allow>
</dwr>
        

       在浏览器第一次加载本页面时,浏览器第一步发现<script type='text/javascript' src='../dwr/engine.js'> </script>,根据web.xml关于dwr的配置,系统会激发Servlet的POST方法,向客户端输出engine.js文件流,这个文件你可以在IE的缓存里面发现,当然,程序会在最后输出一刻比较客户端是否已经存在该文件,如果要输出的文件流大小和和该文件大小一致,就不输出了,同样util.js、Demo.js也是这么输出的。那么看看Demo.js文件里面的内容如下:
if (typeof this['Person'] != 'function') {
  
function Person() {
    
this.address = null;
    
this.phoneNumber = null;
    
this.name = null;
    
this.id = 0;
    
this.salary = 0;
  }

}


// Provide a default path to dwr.engine
if (typeof this['dwr'] == 'undefined') this.dwr = {};
if (typeof dwr['engine'] == 'undefined') dwr.engine = {};

if (typeof this['Demo'] == 'undefined') this.Demo = {};

Demo._path 
= '/dwr/dwr';

Demo.sayHello 
= function(p0, callback) {
  
return dwr.engine._execute(Demo._path, 'Demo', 'sayHello', p0, callback);
}
;

Demo.getInclude 
= function(callback) {
  
return dwr.engine._execute(Demo._path, 'Demo', 'getInclude', callback);
}
;

    这样我们就知道了,实际上Demo.java类的sayHello方法已经被解释到Demo.js中了,只不过后面的调用还不是很清楚而已。
继续!
public String sayHello(String name) {
return "Hello, " + name;
}
 翻译成
       Demo._path = '/dwr/dwr';
 Demo.sayHello = function(p0, callback) {
  return dwr.engine._execute(Demo._path, 'Demo', 'sayHello', p0, callback);
};
  在调用engine.execute()方法时,最终采用无刷新访问服务器技术。
 采用该技术的关键问题是两个参数,一个是url,往什么地方发送;一个是doc,发送什么内容
 通过跟踪engine.js我们知道
url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr
发送内容如下:

callCount=1
windowName
=DWR-442B435899
c0
-scriptName=Demo
c0
-methodName=sayHello
c0
-id=0
c0
-param0=string:Joe
batchId
=1
page
=/dwr/simpletext/index.html
httpSessionId
=
scriptSessionId
=1CC3A.0A3


实际上url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr,转向的是DwrServlet,DwrServlet实际上获取了两部分信息,一部分是url,根据这个能够解析到我们的目标java类、方法,另外一部分是发送信息包,实际上这就是SayHello所需要的参数输入信息,最后,返回数据,这些数据格式通过response返回,在engine.js中对应于return batch.reply;通过解析返回对象,采用javascirpt将数据动态刷新到页面。

    至此,dwr的核心原理,基本清晰

posted on 2008-04-06 12:13 满店香 阅读(3453) 评论(4)  编辑  收藏 所属分类: dwr源码分析

Feedback

# re: 第六部分 DWR原理 2008-04-28 10:49 rgy

bucuo   回复  更多评论   

# re: 第六部分 DWR原理[未登录] 2008-05-23 10:37 sam

学习了  回复  更多评论   

# re: 第六部分 DWR原理[未登录] 2008-10-27 23:05 jones

谢谢楼主的文章。请问楼主如何联系啊,有qq么?能向你请教么?  回复  更多评论   

# Servisy Web 20 2009-05-18 12:24 Servisy Web 20

Please post your favorite sites.
I am from Albania and also am speaking English, please tell me right I wrote the following sentence: "Contact seo workers professional search engine optimization marketing consultants to improve your web site performance and search engine rankings.Left, bullet seo optimization, right."

THX :-), Lisbet.  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

My Links

Blog Stats

常用链接

留言簿(2)

随笔档案

文章分类

文章档案

新闻档案

搜索

最新评论

阅读排行榜

评论排行榜