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
官方網站:http://getahead.ltd.uk/dwr/
//DWR--不錯的Ajax框架之一
本文內容:
- DWR介紹
- DWR原理
- DWR開發步驟
- dwr.xml說明
- DWR核心引擎
- DWR工具包
DWR介紹
- What is DWR?:
- 在服務器上運行的Servlet來處理請求并把結果返回瀏覽器。
- 運行在瀏覽器上的Javascript,可以發送請求,并動態 改變頁面。DWR會根據你的Java類動態的生成Javascript代碼。這些代碼魔力是讓你感覺整個Ajax調用都是在瀏覽器上發生的,但事實上是服務器執行了這些代碼,DWR負責數據的傳遞和轉換。
- 這種Java和Javascript之間的遠程調用會讓DWR用戶感覺像是曾經習慣使用的RMI或SOAP的RPC機制。而且這一過程還不需要額外的瀏覽器插件。
- Java是同步的,而Ajax是異步的。所以當你調用一個遠程方法時,你要給DWR一個回調函數,當數據從網絡上回來時,DWR會調用這個函數。
- DWR的作用:
- 有效地從應用程序代碼中把 Ajax 的全部請求-響應循環消除掉。
- 客戶端代碼再也不需要直接處理XMLHttpRequest 對象或者服務器的響應。
- 不再需要編寫對象的序列化代碼或者使用第三方工具才能把對象變成 XML。
- 不再需要編寫 servlet 代碼把 Ajax 請求調整成對 Java 域對象的調用
DWR原理
- DWR是作為Web應用的一個Servlet進行部 署的,是一個黑盒子中的servlet。
- 對于公共有的每個類,DWR 動態地生成包含在 Web 頁面中的 JavaScript。生成的JavaScript 包含存根函數,代表 Java 類上的 對應方法并在幕后執行XMLHttpRequest。這些請求被發送給DWR。
- 把請求翻譯成服務器端 Java 對象上的方法調用并把方法的返回值放在servlet 響應中發送回客戶端,編碼成 JavaScript。
DWR開發步驟
- Download jar包
- http://getahead.org/dwr/download
- Copy dwr.jar into WEB-INF/lib
- 修改web.xml,新增 DwrServlet
代碼片斷:
<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>
<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>
- 編寫服務器端Java類
- 不要出現Javascript保留關鍵字;和保留關鍵字同名的函數指定被排除。多數Javascript的關鍵字和Java是相同的。所以你不可能有一個方法叫做”try()”。但是該死”delete()”對與Javascript有著特殊意義,而對Java則不是。
- Javascript方法重載是不支持的,所以盡量不要再Java中使用。
一個小例子:
下載: HelloWorld.java
package cn.com.jacken.dwr;
public class HelloWorld {
public String sayHello(String name) {
return "Hi, " + name;
}
}
public class HelloWorld {
public String sayHello(String name) {
return "Hi, " + name;
}
}
- 在dwr.xml文件注冊Java對象
舉例:
<dwr>
<allow>
<create creator="new" javascript="HelloWorld" scope="page">
<param name="class" value="cn.com.jacken.dwr.HelloWorld" />
</create>
</allow>
</dwr>
<allow>
<create creator="new" javascript="HelloWorld" scope="page">
<param name="class" value="cn.com.jacken.dwr.HelloWorld" />
</create>
</allow>
</dwr>
- 在Web 頁面中添加DWR AJAX庫
代碼片段:
<script src='dwr/engine.js'>
</script>
<script src='dwr/util.js'>
</script>
<script src='dwr/interface/HelloWorld.js'>
</script>
</script>
<script src='dwr/util.js'>
</script>
<script src='dwr/interface/HelloWorld.js'>
</script>
dwr.xml說明
請看另外一篇文章:DWR配置文件dwr.xml詳解
DWR核心引擎engine.js
- 頁面中加入:
<script type='text/javascript' src='dwr/engine.js' />
- 設置超時時間:
全局設置:dwr.engine.setTimeout(1000);局部設置(優先級高):
Remote.singleMethod(params, { callback:function(data)
{ ... }, timeout:2000 }); - 錯誤處理:
全局設置:function handler(msg) {
alert(msg);
}
dwr.engine.setErrorHandler(handler);局部設置:
Remote.method(params, {
callback:function(data) { ... },
errorHandler:handler
}); - 批量執行 :
dwr.engine.beginBatch();
var selValue=…;
//調用服務器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):這個函數能操作大多數HTML元素
- getValue(id):getValue(id)是 setValue()對應的”讀版本”。
- setValues():批量設置值
- getValues():批量獲取值
- getText(id):為select列表設計的。你可能需要取得顯示的文字,而不是當前選項的值。
- selectRange:選擇一個輸入框中的一定范圍的文字。
- ……