DWR是Ajax的一個開源框架,可以很方便是實現調用遠程Java類。但是,DWR隻能采用回調函數的方法,在回調函數中獲取返回值,然後進行處理。那麼,到底有沒有辦法直接獲取一個方法的返回值呢?
下面我寫一個簡單的Java類,如下:
public class Test()
{
public String getString()
{
return "test";
}
}
上面這個類很簡單,裡面的getString就直接返回一個字符串。
我們假設在DWR中配置瞭Test在DWR中所對應的類未JTest,那麼我們要調用getString方法,可以這樣寫:
function Test()
{
//調用Java類Test的getString方法,callBackFun為回調函數
JTest.getString(callBackFun);
//回調函數
function callBackFun(data)
{
alert(data);
}
}
這裡處理很簡單,就是調用java類的方法,然後在回調函數中處理,上面那段話執行後會顯示test,也就是java方法的返回值。但是,采用回調函數不符合我們的習慣,有些時候我們就想直接獲取返回值進行處理,這時候就無能為力瞭。
我們知道,DWR是Ajax的框架,那麼必然擁有瞭Ajax的特性瞭。
先來說說Ajax的運行原理吧,其實它的原理很簡單,就是調用遠端地址,獲取頁面返回數據,然後進行分析處理。而這個過程是異步的,就就是為什麼DWR采用回調函數的原因瞭,而你不知道,我們調用瞭Java類後,回調函數不知道什麼時候執行。
再來看看Ajax的方法,其中,XMLHttpRequest的open函數是有一個是否同步參數,如下:
XMLHttpRequest.open(String method, String URL, boolean asynchronous)
其中的asynchronous就是是否同步的參數瞭。
現在,讓我們打開DWR的engine.js文件,搜索一個asyn,馬上,就發現瞭一個setAsync方法,原來,DWR是這個方法設置成屬性封裝起來瞭。這樣,我們就可以實現獲取返回值的功能瞭。
下面,我在DWR中封裝出Java類,如下:
function Test()
{
var _data = "";
this.getString = function()
{
//設置成同步
DWREngine.setAsync(false);
//調用Java類Test的getString方法,callBackFun為回調函數
JTest.getString(callBackFun);
//重新設置為異步方式
DWREngine.setAsync(true);
return _data;
}
//回調函數
function callBackFun(data)
{
_data = data;
}
}
上面這個方法,在調用java方法之前先設置為同步方式,那麼調用java方法後,執行瞭回調函數後,才接著執行下面的語句,這樣子,返回_data就已經賦值瞭,所以可以正常獲取值。
上面這些寫法比較麻煩,可以寫成下面方式:
function Test()
{
var _data = "";
//設置成同步
DWREngine.setAsync(false);
//調用Java類Test的getString方法,callBackFun為回調函數
JTest.getString(function(data){_data = data;});
//重新設置為異步方式
DWREngine.setAsync(true);
return _data;
}
作者“battier的博客”