第六部分 DWR原理
通過前面五章學(xué)習(xí),對(duì)DWR整體有所了解,但是我仍然對(duì)核心細(xì)節(jié)不是很清楚。我最后的辦法就是單步調(diào)試,調(diào)試之后將所有東西串一串,DWR的原理就清楚了,搞清楚核心生產(chǎn)線,其他全是輔助的,沒必要再分析了。老外聰明啊,服。我們以DWR的第一個(gè)樣例為例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>
前面兩個(gè)都是DWR系統(tǒng)默認(rèn)需要加載的,Demo.js是Demo.java所對(duì)應(yīng)的。按理論,只要在web.xml和dwr.xml配置好,那么我們就可以在客戶端操作Demo.js,類似于操作服務(wù)器端的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>
在瀏覽器第一次加載本頁面時(shí),瀏覽器第一步發(fā)現(xiàn)<script type='text/javascript' src='../dwr/engine.js'> </script>,根據(jù)web.xml關(guān)于dwr的配置,系統(tǒng)會(huì)激發(fā)Servlet的POST方法,向客戶端輸出engine.js文件流,這個(gè)文件你可以在IE的緩存里面發(fā)現(xiàn),當(dāng)然,程序會(huì)在最后輸出一刻比較客戶端是否已經(jīng)存在該文件,如果要輸出的文件流大小和和該文件大小一致,就不輸出了,同樣util.js、Demo.js也是這么輸出的。那么看看Demo.js文件里面的內(nèi)容如下:

























這樣我們就知道了,實(shí)際上Demo.java類的sayHello方法已經(jīng)被解釋到Demo.js中了,只不過后面的調(diào)用還不是很清楚而已。
繼續(xù)!
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);
};
在調(diào)用engine.execute()方法時(shí),最終采用無刷新訪問服務(wù)器技術(shù)。
采用該技術(shù)的關(guān)鍵問題是兩個(gè)參數(shù),一個(gè)是url,往什么地方發(fā)送;一個(gè)是doc,發(fā)送什么內(nèi)容
通過跟蹤engine.js我們知道
url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr
發(fā)送內(nèi)容如下:












實(shí)際上url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr,轉(zhuǎn)向的是DwrServlet,DwrServlet實(shí)際上獲取了兩部分信息,一部分是url,根據(jù)這個(gè)能夠解析到我們的目標(biāo)java類、方法,另外一部分是發(fā)送信息包,實(shí)際上這就是SayHello所需要的參數(shù)輸入信息,最后,返回?cái)?shù)據(jù),這些數(shù)據(jù)格式通過response返回,在engine.js中對(duì)應(yīng)于return batch.reply;通過解析返回對(duì)象,采用javascirpt將數(shù)據(jù)動(dòng)態(tài)刷新到頁面。
至此,dwr的核心原理,基本清晰
posted on 2008-04-06 12:13 滿店香 閱讀(3462) 評(píng)論(4) 編輯 收藏 所屬分類: dwr源碼分析