2008年12月4日 星期四

[DWR] Direct Web Remoting - Using Object

上次有提到簡單的使用 DWR 了! 不過上次的範例是採用 String 作為 server 端服務的回傳值,那如果我們要回傳的結果不只是 String 而是物件的話,DWR 能幫我們處理嗎?

這問題,DWR 當然都幫我們解決了! 而且我們要撰寫這樣的 code 並不難,跟我們撰寫 String 回傳值有 99% 相似! 這就是 DWR 的功力啦~

首先,我們改寫上次的 DWRServer class,增加新的 method:

public class DWRServer {
    public String sayHello(String name) {
        return "Hello! "+name;
    }
    public HelloObject sayHelloObject(String name) {
        HelloObject hello = new HelloObject();
        hello.setYourName(name);
        hello.setMyName("Silver8250");
        return hello;
    }
}
class HelloObject {
    private String yourName;
    private String myName;
    //setter and getter methods
}

這是我們增加一個 sayHelloObject() method 這個 method 會回傳一個 HelloObject (我們定義在下方) 的物件。HelloObject 中儲存前端使用者傳入的 name 與作者我的 name,裡面的 methods 都是針對 yourName 與 myName 變數的 getter 與 setter methods,在此就不列出(不懂? 趕快去了解一下 JavaBean 吧!)。

後端程式寫完後,依照慣例就是設定我們的 dwr.xml 檔案:

<dwr>
    <allow>
        <create javascript="myHelloServer" creator="new">
            <param name="class" value="DWRServer"></param>
        </create>
        <convert converter="bean" match="HelloObject"></convert>
    </allow>
</dwr>

在這裡我們並不增加新的 create tag,因為我們並沒有增加新的 server 端 class,我們只是在既有的 class 上新增加 method,不過要注意的是因為我們的 method 回傳的是一個 JavaBean(也就是 HelloObject),所以我們要在 dwr.xml 告知 DWR 這件事。所以我們使用 <convert> tag,並且設定 converter attribute 的值為 bean,這樣 DWR 就知道我們是用 JavaBean,而且 match 的值要放 HelloObject class 的所在位置(當然要包含 package)。這完成後,前端就可以使用這樣的 JavaBean 來取值囉!

前端的程式我們依舊要加入:

<script src='/MyProject/dwr/interface/myHelloServer.js'></script>

<script src='/MyProject/dwr/engine.js'></script>

然後我們在前端的 javascript 更改為:

function callSayHello(myName) {
    myHelloServer.sayHelloObject(myName, showResult);
}
function showResult(result) {
    document.getElementById("resultTextMyName").value = result.myName;
    document.getElementById("resultTextYourName").value = result.yourName;
}

原先的呼叫就更改為 sayHelloObject,因為 parameter 沒有差異,所以不變。但是神奇的是在 showResult function,我們一樣放 result 作為 argument,不過裡面的呼叫就改了,因為現在的 result 不是 String 而是我們的 HelloObject 物件,我們要取值,就直接呼叫 result.myName,就可以。DWR 會自動幫我們去到 server 呼叫 result.getMyName() 然後回傳! 神奇吧~

其實,用物件作為回傳值其實跟用 primary type 作回傳值是類似的,差別在於回傳的結果在前端的頁面可以有像物件般的曲裡面的 fields 的功能!

我的 DWR 目前也只有 survey 到此,往後有機會再深入的 survey,日後在分享給大家~

沒有留言: