Posted on 2008-02-13 19:02
kooyee 閱讀(1069)
評(píng)論(0) 編輯 收藏 所屬分類:
Ajax學(xué)習(xí)手記
Direct Web Remoting
DWR allows Javascript in a browser to interact with Java on a server and helps you manipulate web pages with the results.
DWR is Easy Ajax for Java
官方網(wǎng)站:http://getahead.ltd.uk/dwr/
本文內(nèi)容:
- DWR介紹
- DWR原理
- DWR開發(fā)步驟
- dwr.xml說明
- DWR核心引擎
- DWR工具包
DWR介紹
- 在服務(wù)器上運(yùn)行的Servlet來處理請(qǐng)求并把結(jié)果返回瀏覽器。
- 運(yùn)行在瀏覽器上的Javascript,可以發(fā)送請(qǐng)求,并動(dòng)態(tài) 改變頁面。DWR會(huì)根據(jù)你的Java類動(dòng)態(tài)的生成Javascript代碼。這些代碼魔力是讓你感覺整個(gè)Ajax調(diào)用都是在瀏覽器上發(fā)生的,但事實(shí)上是服務(wù)器執(zhí)行了這些代碼,DWR負(fù)責(zé)數(shù)據(jù)的傳遞和轉(zhuǎn)換。
- 這種Java和Javascript之間的遠(yuǎn)程調(diào)用會(huì)讓DWR用戶感覺像是曾經(jīng)習(xí)慣使用的RMI或SOAP的RPC機(jī)制。而且這一過程還不需要額外的瀏覽器插件。
- Java是同步的,而Ajax是異步的。所以當(dāng)你調(diào)用一個(gè)遠(yuǎn)程方法時(shí),你要給DWR一個(gè)回調(diào)函數(shù),當(dāng)數(shù)據(jù)從網(wǎng)絡(luò)上回來時(shí),DWR會(huì)調(diào)用這個(gè)函數(shù)。
- 有效地從應(yīng)用程序代碼中把 Ajax 的全部請(qǐng)求-響應(yīng)循環(huán)消除掉。
- 客戶端代碼再也不需要直接處理XMLHttpRequest 對(duì)象或者服務(wù)器的響應(yīng)。
- 不再需要編寫對(duì)象的序列化代碼或者使用第三方工具才能把對(duì)象變成 XML。
- 不再需要編寫 servlet 代碼把 Ajax 請(qǐng)求調(diào)整成對(duì) Java 域?qū)ο蟮恼{(diào)用
DWR原理
- DWR是作為Web應(yīng)用的一個(gè)Servlet進(jìn)行部 署的,是一個(gè)黑盒子中的servlet。
- 對(duì)于公共有的每個(gè)類,DWR 動(dòng)態(tài)地生成包含在 Web 頁面中的 JavaScript。生成的JavaScript 包含存根函數(shù),代表 Java 類上的 對(duì)應(yīng)方法并在幕后執(zhí)行XMLHttpRequest。這些請(qǐng)求被發(fā)送給DWR。
- 把請(qǐng)求翻譯成服務(wù)器端 Java 對(duì)象上的方法調(diào)用并把方法的返回值放在servlet 響應(yīng)中發(fā)送回客戶端,編碼成 JavaScript。
DWR開發(fā)步驟
- http://getahead.org/dwr/download
- Copy dwr.jar into WEB-INF/lib
代碼片斷:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
- 不要出現(xiàn)Javascript保留關(guān)鍵字;和保留關(guān)鍵字同名的函數(shù)指定被排除。多數(shù)Javascript的關(guān)鍵字和Java是相同的。所以你不可能有一個(gè)方法叫做”try()”。但是該死”delete()”對(duì)與Javascript有著特殊意義,而對(duì)Java則不是。
- Javascript方法重載是不支持的,所以盡量不要再Java中使用。
一個(gè)小例子:
package cn.com.jacken.dwr;
public class HelloWorld {
public String sayHello(String name) {
return "Hi, " + name;
}
}
- 在dwr.xml文件注冊(cè)Java對(duì)象
舉例:
<dwr>
<allow>
<create creator="new" javascript="HelloWorld" scope="page">
<param name="class" value="cn.com.jacken.dwr.HelloWorld" />
</create>
</allow>
</dwr>
代碼片段:
<script src='dwr/engine.js'>
</script>
<script src='dwr/util.js'>
</script>
<script src='dwr/interface/HelloWorld.js'>
</script>
dwr.xml說明
請(qǐng)看另外一篇文章:DWR配置文件dwr.xml詳解
DWR核心引擎engine.js
- 頁面中加入:
<script type='text/javascript' src='dwr/engine.js' />
- 設(shè)置超時(shí)時(shí)間:
全局設(shè)置:
dwr.engine.setTimeout(1000);
局部設(shè)置(優(yōu)先級(jí)高):
Remote.singleMethod(params, { callback:function(data)
{ ... }, timeout:2000 });
- 錯(cuò)誤處理:
全局設(shè)置:
function handler(msg) {
alert(msg);
}
dwr.engine.setErrorHandler(handler);
局部設(shè)置:
Remote.method(params, {
callback:function(data) { ... },
errorHandler:handler
});
- 批量執(zhí)行 :
dwr.engine.beginBatch();
var selValue=…;
//調(diào)用服務(wù)器Java程序
Province.getCitiesByProvince(selValue,callBack);
Province.getNick(callBack2);
dwr.engine.endBatch({
timeout:3000
});
//…
DWR工具包
- 必須在頁面引入util.js
<script src='dwr/util.js'>
</script>
- $(”username”) = document.getElementById(”username”);
- setValue(id, value):這個(gè)函數(shù)能操作大多數(shù)HTML元素
- getValue(id):getValue(id)是 setValue()對(duì)應(yīng)的”讀版本”。
- setValues():批量設(shè)置值
- getValues():批量獲取值
- getText(id):為select列表設(shè)計(jì)的。你可能需要取得顯示的文字,而不是當(dāng)前選項(xiàng)的值。
- selectRange:選擇一個(gè)輸入框中的一定范圍的文字。
- ……