DWR學習筆記(五)
js 2010-01-02 19:24:42 閱讀1 評論 字號:大中小 訂閱
六.DWR中的JavaScript簡介:回調(diào)函數(shù)的聲明方式、查找回調(diào)函數(shù)的原則、創(chuàng)建與java對象匹配的js對象
1.簡單說明:DWR根據(jù)dwr.xml生成和Java代碼類似的Javascript代碼。
DWR通過引入回調(diào)函數(shù)來解決這個問題,當請求結(jié)果被返回后,DWR會調(diào)用這個回調(diào)函數(shù)。
2.回調(diào)函數(shù)的聲明方式:有兩種,一是可以把回調(diào)函數(shù)放在參數(shù)列表里;一是可以把回調(diào)函數(shù)放到元數(shù)據(jù)對象里。
(1)參數(shù)列表的回調(diào)函數(shù)(前邊一直用的方式)
例子:
A.生成一個java對象
public class Remote{
public String getData(int index){
.........
}
}
B.通過DWR調(diào)用
<script type="text/javascript">
//handleGetData就是回調(diào)函數(shù)的方法名
Remote.getData(42, handleGetData);
//聲明回調(diào)函數(shù)
function handleGetData(data){
alert(data);
}
</script>
C.也可以將B中的回調(diào)函數(shù)寫成縮寫
<script type="text/javascript">
//handleGetData就是回調(diào)函數(shù)的方法名
Remote.getData(
42,
//匿名回調(diào)函數(shù)
function(data){
alert(data);
}
);
</script>
(2)元數(shù)據(jù)對象中的回調(diào)函數(shù)(推薦使用):這種方式較為規(guī)范
例子:任然使用上面的java類Remote類。只是將DWR的js調(diào)用做一下更改
Remote.getData(
42,
//定義元數(shù)據(jù)對象,其中字符串callback是匿名對象的屬性,
//而function(data){alert(data);}是callback的屬性值。
{
callback:function(data){
alert(data);
}
}
//這里將匿名對象作為了最后一個參數(shù)值,匿名對象中存有回調(diào)函數(shù),
//這樣DWR就可以通過找到callback,得到它的值,并作為回調(diào)函數(shù)。
);
**說明:通過這種調(diào)用元數(shù)據(jù)對象中的回調(diào)函數(shù)的好處就是可以指定額外的調(diào)用選項。
例子:
Remote.getData(
42,
//元數(shù)據(jù)對象,內(nèi)部有多個屬性及對應的屬性值
{
//回調(diào)函數(shù),注意函數(shù)仍然是匿名函數(shù)
callback:function(data){alert(data);},
//在回調(diào)函數(shù)的元數(shù)據(jù)對象中可以指定超時和錯誤的處理方式
timeout:5000,
errorHandler:function(message){alert("Oops: " + message);}
}
);
3.查找回調(diào)函數(shù)的原則:我們通過js調(diào)用java對象的方法時指定了回調(diào)函數(shù),
那么DWR是怎樣識別回調(diào)函數(shù)的呢?為什么它能準確的調(diào)用到回調(diào)函數(shù)。
那是因為DWR通過js調(diào)用java對象的方法是傳入的回調(diào)函數(shù)的位置是有規(guī)定的
(如:一般最后一個參數(shù)用于指定回調(diào)函數(shù))
A.如果第一個(針對java對象方法不接收參數(shù)的情況)或最后一個參數(shù)是一個函數(shù),那么它就是回調(diào)函數(shù),其他參數(shù)都是Java的方法參數(shù)。
B.如果最后一個參數(shù)是一個對象,這個對象中有一個"callback"屬性(經(jīng)過驗證必須用callback字符串作為屬性名,否則不起作用),
并且它是個函數(shù),那么這個對象就是元數(shù)據(jù)對象,它將作為回調(diào)函數(shù)的擁有者,其他參數(shù)都是Java方法參數(shù)。
C.如果第一個參數(shù)是null ,我們就假設(shè)沒有回調(diào)函數(shù),其他的都是Java方法參數(shù)。
盡管如此,我們會檢查最后一個參數(shù)是不是null,如果是就發(fā)出警告。不是那就正常!
D.如果最后一個參數(shù)是null,那么就沒有callback函數(shù)。
4.創(chuàng)建與java對象匹配的js對象:就是通過創(chuàng)建js對象,
然后通過js調(diào)用java對象方法的時候為方法傳遞參數(shù)(主要指Bean對象參數(shù))
A.產(chǎn)生javaBean對象
public Person{
private String name;
private int age;
private Date[] appointments;
getters and setters ...
}
B.生成要用js調(diào)用的java類
public class Remote{
private Person person;
public void setPerson(Person p){
this.person = p;
}
}
C.通過js構(gòu)造Bean參數(shù)然后調(diào)用方法(此時將涉及到轉(zhuǎn)換,要開啟對bean的轉(zhuǎn)換器BeanConverter的支持)
var p = {
//name屬性賦值
name:"Fred Bloggs",
//age屬性賦值
age:42,
//appointments數(shù)組屬性賦值
appointments:[ new Date(), new Date("1 Jan 2008") ]
};
//DWR調(diào)用java對象方法,傳入Bean對象參數(shù)值
Remote.setPerson(p);
**注意:這里不用注冊回調(diào)函數(shù),因為setPerson()方法返回void,即沒有返回值,所以不需要回調(diào)函數(shù)處理返回結(jié)果。
當然如果非要注冊回調(diào)函數(shù)也沒有問題,只不過回調(diào)函數(shù)中將不會接收到任何返回數(shù)據(jù)。