上次有提到簡單的使用 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,日後在分享給大家~
沒有留言:
張貼留言