DWR介紹
DWR是Direct Web Remoting 的縮寫。
DWR 是一個開放源碼的使用 Apache 許可協定的解決方案,它包含伺服器端 Java 庫、一個 DWR servlet 以及 JavaScript 庫。雖然 DWR 不是 Java 平台上唯一可用的 Ajax-RPC 工具包,但是它是最成熟的,而且提供了許多有用的功能。
從最簡單的角度來說,DWR 是一個引擎,可以把伺服器端 Java 對象的方法公開給 JavaScript 代碼。使用 DWR 可以有效地從應用程式代碼中把 Ajax 的全部請求-響應循環消除掉。這意味着用戶端代碼再也不需要直接處理 XMLHttpRequest 對象或者伺服器的響應。不再需要編寫對象的序列化代碼或者使用第三方工具才能把對象變成 XML。甚至不再需要編寫 servlet 代碼把 Ajax 請求調整成對 Java 域對象的調用。
DWR 是作為 Web 應用程式中的 servlet 部署的。把它看作一個黑盒子,這個 servlet 有兩個主要作用:首先,對于公開的每個類,DWR 動态地生成包含在 Web 頁面中的 JavaScript。生成的 JavaScript 包含存根函數,代表 Java 類上的對應方法并在幕後執行 XMLHttpRequest。這些請求被發送給 DWR,這時它的第二個作用就是把請求翻譯成伺服器端 Java 對象上的方法調用并把方法的傳回值放在 servlet 響應中發送回用戶端,編碼成 JavaScript。DWR 還提供了幫助執行常見的使用者界面任務的 JavaScript 工具函數。
DWR(Direct Web Remoting)是一個開源的類庫,可以幫助開發人員開發包含AJAX技術的網站.它可以允許在浏覽器裡的代碼使用運作在WEB伺服器上的JAVA函數,就像它就在浏覽器裡一樣.
它包含兩個主要的部分:允許JavaScript從WEB伺服器上一個遵循了AJAX原則的Servlet(小應用程式)中擷取資料.另外一方面一個JavaScript庫可以幫助網站開發人員輕松地利用擷取的資料來動态改變網頁的内容.
DWR采取了一個類似AJAX的新方法來動态生成基于JAVA類的JavaScript代碼.這樣WEB開發人員就可以在JavaScript裡使用Java代碼就像它們是浏覽器的本地代碼(用戶端代碼)一樣;但是Java代碼運作在WEB伺服器端而且可以自由通路WEB 伺服器的資源.出于安全的理由,WEB開發者必須适當地配置哪些Java類可以安全的被外部使用.
這個從JAVA到JavaScript的遠端功能方法給DWR的使用者帶來非常像傳統的RPC機制,就像RMI或者SOAP一樣,而且擁有運作在WEB上但是不需要浏覽器插件的好處.
DWR不認為浏覽器/WEB伺服器協定是重要的,而更樂于保證程式設計界面的簡單自然.對此最大的挑戰就是把AJAX的異步特性和正常JAVA方法調用的同步特性相結合.在異步模式下,結果資料在開始調用之後的一段時間之後才可以被異步通路擷取到.DWR允許WEB開發人員傳遞一個回調函數,來異步處理Java函數調用過程.
其配置如下:
1.1、dwr.xml的配置
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value="com.dwr.TestClass" />
<include method="testMethod1"/>
</create>
</allow>
</dwr>
<allow>标簽中包括可以暴露給javascript通路的東西。
<create>标簽中指定javascript中可以通路的java類,并定義DWR應當如何獲得要進行遠端的類的執行個體。creator="new"屬性指定java類執行個體的生成方式,new意味着DWR應當調用類的預設構造函數來獲得執行個體,其他的還有spring方式,通過與IOC容器Spring進行內建來獲得執行個體等等。javascript=" testClass "屬性指定javascript代碼通路對象時使用的名稱。
<param>标簽指定要公開給javascript的java類名。
<include>标簽指定要公開給javascript的方法。不指定的話就公開所有方法。
<exclude>标簽指定要防止被通路的方法。
1.2、javascript中調用
首先,引入javascript腳本
<script src='dwr/interface/ testClass.js'></script>
<script src='dwr/engine.js'></script>
<script src='dwr/util.js'></script>
其中TestClass.js是dwr根據配置檔案自動生成的,engine.js和util.js是dwr自帶的腳本檔案。
其次,編寫調用java方法的javascript函數
Function callTestMethod1(){
testClass.testMethod1();
}
2、調用有簡單傳回值的java方法
2.1、dwr.xml的配置
配置同1.1
<include method="testMethod2"/>
2.2、javascript中調用
其次,編寫調用java方法的javascript函數和接收傳回值的回調函數
Function callTestMethod2(){
testClass.testMethod2(callBackFortestMethod2);
Function callBackFortestMethod2(data){
//其中date接收方法的傳回值
//可以在這裡對傳回值進行處理和顯示等等
alert("the return value is " + data);
其中callBackFortestMethod2是接收傳回值的回調函數
3、調用有簡單參數的java方法
3.1、dwr.xml的配置
<include method="testMethod3"/>
3.2、javascript中調用
Function callTestMethod3(){
//定義要傳到java方法中的參數
var data;
//構造參數
data = “test String”;
testClass.testMethod3(data);
4、調用傳回JavaBean的java方法
4.1、dwr.xml的配置
<include method="testMethod4"/>
<convert converter="bean" match=""com.dwr.TestBean">
<param name="include" value="username,password" />
</convert>
<creator>标簽負責公開用于Web遠端的類和類的方法,<convertor>标簽則負責這些方法的參數和傳回類型。convert元素的作用是告訴DWR在伺服器端Java 對象表示和序列化的JavaScript之間如何轉換資料類型。DWR自動地在Java和JavaScript表示之間調整簡單資料類型。這些類型包括Java原生類型和它們各自的封裝類表示,還有String、Date、數組和集合類型。DWR也能把JavaBean轉換成JavaScript 表示,但是出于安全性的原因,要求顯式的配置,<convertor>标簽就是完成此功能的。converter="bean"屬性指定轉換的方式采用JavaBean命名規範,match=""com.dwr.TestBean"屬性指定要轉換的javabean名稱,<param>标簽指定要轉換的JavaBean屬性。
4.2、javascript中調用
Function callTestMethod4(){
testClass.testMethod4(callBackFortestMethod4);
Function callBackFortestMethod4(data){
//對于JavaBean傳回值,有兩種方式處理
//不知道屬性名稱時,使用如下方法
for(var property in data){
alert("property:"+property);
alert(property+":"+data[property]);
}
//知道屬性名稱時,使用如下方法
alert(data.username);
alert(data.password);
其中callBackFortestMethod4是接收傳回值的回調函數
5、調用有JavaBean參數的java方法
5.1、dwr.xml的配置
配置同4.1
<include method="testMethod5"/>
<convert converter="bean" match="com.dwr.TestBean">
5.2、javascript中調用
Function callTestMethod5(){
//構造參數,date實際上是一個object
data = { username:"user", password:"password" }
testClass.testMethod5(data);
6、調用傳回List、Set或者Map的java方法
6.1、dwr.xml的配置
<include method="testMethod6"/>
<param name="include" value="username,password" />
注意:如果List、Set或者Map中的元素均為簡單類型(包括其封裝類)或String、Date、數組和集合類型,則不需要<convert>标簽。
6.2、javascript中調用(以傳回List為例,List的元素為TestBean)
Function callTestMethod6(){
testClass.testMethod6(callBackFortestMethod6);
Function callBackFortestMethod6(data){
for(var i=0;i<data.length;i++){
for(var property in data){
alert("property:"+property);
alert(property+":"+data[property]);
}
for(var i=0;i<data.length;i++){
alert(data.username);
alert(data.password);
7、調用有List、Set或者Map參數的java方法
7.1、dwr.xml的配置
<include method="testMethod7"/>
<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(List<TestBean>);
]]>
</signatures>
<signatures>标簽是用來聲明java方法中List、Set或者Map參數所包含的确切類,以便java代碼作出判斷。
7.2、javascript中調用(以傳回List為例,List的元素為TestBean)
Function callTestMethod7(){
//定義要傳到java方法中的參數
//構造參數,date實際上是一個object數組,即數組的每個元素均為object
data = [
{
username:"user1",
password:"password2"
},
username:"user2",
password:" password2"
}
];
testClass.testMethod7(data);
注意:
1、對于第6種情況,如果java方法的傳回值為Map,則在接收該傳回值的javascript回調函數中如下處理:
function callBackFortestMethod(data){
//其中date接收方法的傳回值
var bean = data[property];
alert(bean.username);
alert(bean.password);
}
2、對于第7種情況,如果java的方法的參數為Map(假設其key為String,value為TestBean),則在調用該方法的javascript函數中用如下方法構造要傳遞的參數:
function callTestMethod (){
//定義要傳到java方法中的參數
var data;
//構造參數,date實際上是一個object,其屬性名為Map的key,屬性值為Map的value
data = {
"key1":{
username:"user1",
password:"password2"
},
"key2":{
username:"user2",
password:" password2"
}
};
testClass.testMethod(data);
并且在dwr.xml中增加如下的配置段
TestClass.testMethod7(Map<String,TestBean>);
3、由以上可以發現,對于java方法的傳回值為List(Set)的情況,DWR将其轉化為Object數組,傳遞個javascript;對于java方法的傳回值為Map的情況,DWR将其轉化為一個Object,其中Object的屬性為原Map的key值,屬性值為原Map相應的value值。
4、如果java方法的參數為List(Set)和Map的情況,javascript中也要根據3種所說,構造相應的javascript資料來傳遞到java中
本文轉自左正部落格園部落格,原文連結:http://www.cnblogs.com/soundcode/archive/2010/12/20/1911882.html,如需轉載請自行聯系原作者