DWR獲取java類的返回值

在DWR中實現直接獲取一個JAVA類的返回值
2008-04-25 01:00

DWR是Ajax的一個開源框架,可以很方便是實現調用遠程Java類。但是,DWR只能採用回調函數的方法,在回調函數中獲取返回值,然後進行處理。那麼,到底有沒有辦法直接獲取一個方法的放回值呢?

寫一個簡單的Java類,如下:

Java代碼
  1. public class Test()   
  2. {   
  3.     public String getString()   
  4.      {   
  5.         return "test";   
  6.      }   
  7. }  
public class Test()
{
    public String getString()
    {
        return "test";
    }
}

上面這個類很簡單,裏面的getString就直接返回一個字符串。
我們假設在DWR中配置了Test在DWR中所對應的類未JTest,那麼我們要調用getString方法,可以這樣寫:

Java代碼
  1. function Test()   
  2. {   
  3.     //調用Java類Test的getString方法,callBackFun爲回調函數   
  4.      JTest.getString(callBackFun);   
  5.        
  6.     //回調函數   
  7.      function callBackFun(data)   
  8.      {   
  9.          alert(data);   
  10.      }   
  11. }  
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類,如下:

Java代碼
  1. function Test()   
  2. {   
  3.      var _data = "";   
  4.        
  5.     this.getString = function()   
  6.      {   
  7.         //設置成同步   
  8.          DWREngine.setAsync(false);   
  9.            
  10.         //調用Java類Test的getString方法,callBackFun爲回調函數   
  11.          JTest.getString(callBackFun);   
  12.            
  13.         //重新設置爲異步方式   
  14.          DWREngine.setAsync(true);   
  15.            
  16.         return _data;   
  17.      }   
  18.        
  19.     //回調函數   
  20.      function callBackFun(data)   
  21.      {   
  22.          _data = data;   
  23.      }   
  24. }  
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就已經賦值了,所以可以正常獲取值。
上面這些寫法比較麻煩,可以寫成下面方式:

  1. function Test()   
  2. {   
  3.      var _data = "";   
  4.        
  5.     this.getString = function()   
  6.      {   
  7.         //設置成同步   
  8.          DWREngine.setAsync(false);   
  9.            
  10.         //調用Java類Test的getString方法,callBackFun爲回調函數   
  11.          JTest.getString(function(data){_data = data;});   
  12.            
  13.         //重新設置爲異步方式   
  14.          DWREngine.setAsync(true);   
  15.            
  16.         return _data;   
  17.      }   
  18. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章