【転】DWRでJAVAクラスの戻り値を直接取得することができます。

2733 ワード

原文:
http://szumaky.blog.sohu.com/73695290.html
DWRはAjaxのオープンソースフレームであり、リモートJavaクラスの呼び出しを実現するのに便利である。しかし、DWRはコールバック関数の方法しか採用できません。コールバック関数で戻り値を取得してから処理します。では、一つの方法の戻り値を直接取得する方法がありますか?
    以下は簡単なJava類を書きます。
public class Test()
{
    public String getString()
    {
        return "test";
    }
}
    上のこの種類は簡単です。中のget Stringは直接に文字列に戻ります。
    DWRにTestがDWRに対応するクラス未JTestを配置したと仮定すると、get String方法を呼び出すことができます。
function Test()
{
    //  Java Test getString  ,callBackFun     
    JTest.getString(callBackFun);
    
    //    
    function callBackFun(data)
    {
        alert(data);
    }
}
   ここで処理するのは簡単です。javaクラスのメソッドを呼び出して、コールバック関数で処理します。上記の話を実行するとtest、つまりjavaメソッドの戻り値が表示されます。しかし、家に帰る関数を採用するのは私達の習慣に合わないで、時には私達は直接に帰って値を得て処理したいです。この時はどうすることもできません。
    DWRはAjaxのフレームワークであり、必然的にAjaxの特性を持っていることを知っています。
    まず、Ajaxの運行原理を説明しましょう。実は、その原理はとても簡単です。遠端アドレスを呼び出して、ページからデータを返して、分析処理を行います。このプロセスは非同期です。なぜDWRがコールバック関数を採用したのかは分かりませんが、Javaクラスを呼び出した後、コールバック関数はいつ実行されるか分かりません。
更にAjaxの方法を見てみます。XMLtHttpRequestのopen関数は同期パラメータがありますか?
XMLHttpRequest.open(String method,String URL,bolean asynchronous)
そのうちのasynchronousは同期するかどうかのパラメータです。
今、DWRのengine.jsファイルを開けて、asynを探してみます。すぐにsetsArync方法が見つかりました。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 = "";
    
    this.getString = function()
    {
        //     
        DWREngine.setAsync(false);
        
        //  Java Test getString  ,callBackFun     
        JTest.getString(function(data){_data = data;});
        
        //         
        DWREngine.setAsync(true);
        
        return _data;
    }
}