DWR使用总结
DWR是方便使用AJAX連接JS和JAVA的的一個(gè)框架,把服務(wù)器端 Java 對(duì)象的方法公開給 JavaScript 代碼。
如果是用dwr2.0的jar包,還需要同時(shí)導(dǎo)入log4j.jar和commons-loggin.jar,勿忘!!
web.xml和dwr.xml放在WEB-INF下!
-----------------------------
配置web.xml:WEB工程啟動(dòng)的時(shí)候會(huì)在這個(gè)里面找到具體所用到的類的路徑,由此進(jìn)行加載
-----------------------------
配置dwr.xml: dwr.xml的作用是讓你告訴DWR哪些class中的哪些方法你需要暴露給前臺(tái)使用,當(dāng)DWR啟動(dòng)時(shí)候根據(jù)dwr.xml這個(gè)文件把java類中的方法轉(zhuǎn)成js中可用的類中方法,使前臺(tái)可以使用。
注:以下是不全按dwr2.0寫的,如果用的是DWR2.0,那java里暴露類(藍(lán)字顯示)不能寫在<create>屬性里,應(yīng)刪除后寫在<include method="" />前,<param name="class" value="***java里暴露的class,必須寫完整路徑***" />。
-----------------------------
在html或js頁(yè)面中加入
其實(shí)我們調(diào)用AAA.bbb([參數(shù)],callBack);就是做了以下這一步:
(下面紅字是包裝好的,不在前臺(tái),所以即使你沒有創(chuàng)建html或者jsp來調(diào)用,也可以通過localhost:8080/工程名/dwr 來看到你暴露的java類進(jìn)行測(cè)試)
通過在dwr.xml暴露的方法得到j(luò)s里的方法,當(dāng)我們調(diào)用AAA.bbb時(shí)候再通過/dwr/dwr轉(zhuǎn)到DWRServlet中去用JAVA里的AAA.bbb方法,然后返回值到callback中(中間經(jīng)過dwr.xml的convert)
----------------------------
上面對(duì)dwr的工作大致分析了下,現(xiàn)在對(duì)于參數(shù)類型的不同,對(duì)dwr.xml也要進(jìn)行修正。
DWR自動(dòng)地在Java和JavaScript表示之間調(diào)整簡(jiǎn)單數(shù)據(jù)類型,這些類型包括Java原生類型和它們各自的封裝類表示,還有String、Date、數(shù)組和集合類型。但如果參數(shù)類型非簡(jiǎn)單數(shù)據(jù)類型,則要通過轉(zhuǎn)換。
調(diào)用返回JavaBean的java方法
<convert converter="bean" match="***一般來說是javabean***"> ?//int,String,list等不需要顯式的轉(zhuǎn)換就可以被js拿到 ? ? ?<param name="include" value="***javabean中的屬性,用','隔開***" /> ?//這句可以不寫 </convert>
?<creator>標(biāo)簽負(fù)責(zé)公開用于Web遠(yuǎn)程的類和類的方法,<convertor>標(biāo)簽則負(fù)責(zé)這些方法的參數(shù)和返回類型。convert元素的作用是告訴DWR在服務(wù)器端Java 對(duì)象表示和序列化的JavaScript之間如何轉(zhuǎn)換數(shù)據(jù)類型。
這樣在js端回調(diào)函數(shù)直接拿到的data就是一個(gè)javabean,可以直接通過data.xxx拿到bean的屬性xxx。
調(diào)用有JavaBean參數(shù)的java方法
在JS端,把要傳入的參數(shù)寫成javabean方式,例:要傳入一個(gè)名為student的javabean,參數(shù)有name,password,則
var stu = {name:"zhangsan",password:"zspassword"}; //這是json的表示方法
AAA.bbb(stu,callBack);
調(diào)用返回List、Set或者M(jìn)ap的java方法
?在JS端,以List,里面數(shù)據(jù)是bean為例,data是一個(gè)List型,只要用for循環(huán)就可以依次拿到數(shù)據(jù)。
?遍歷方法1:
for(var i=0;i<data.length;i++) ?
? ?/*對(duì)于java方法的返回值為L(zhǎng)ist(Set)的情況,DWR將其轉(zhuǎn) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 化為Object數(shù)組,傳遞個(gè)javascript*/
{
? ?alert(data[i].name+":"+data[i].password);
}
遍歷方法2:
for(var property in data) //property為序號(hào),從0開始
{
? ?var bean = data[property];
? ?alert(bean.name+":"+bean.password);
}
相比返回為javabean多了一個(gè)遍歷而已。
如果java方法的返回值為Map,則如下
for(var property in data) //property為key值
? ?/*對(duì)于 java方法的返回值為Map的情況,DWR將其轉(zhuǎn)化為一個(gè)Object,
? ? ? 其中Object的屬性為原Map的key值,屬性值為原Map相應(yīng)的 value值*/
{
?var bean = data[property];
?alert(bean.username);
?alert(bean.password);
}
如果知道key值,則可直接用:data.key拿到value
調(diào)用有List、Set或者M(jìn)ap參數(shù)的java方法
?在dwr.xml的<dwr>標(biāo)簽內(nèi)加入:<signatures>標(biāo)簽。
<signatures>標(biāo)簽是用來聲明java方法中List、Set或者M(jìn)ap參數(shù)所包含的確切類,以便java代碼作出判斷,是js-->java的。
var stu = [{name:"zhangsan",password:"zspassword"},{name:"lisi",password:"lspassword"}];
?//把List當(dāng)作數(shù)組來處理
AAA.bbb(stu,callBack);
并且在dwr.xml中增加如下的配置段(剛才試驗(yàn)了下,不加也可以)
<signatures>
? <![CDATA[
? ?import java.util.List;
? ?import com.dwr.AAA; ? ? //AAA的包路徑要寫完整
? ?import com.dwr.TestBean; ?//javabean
? ?AAA.bbb(List<TestBean>);
? ]]>
?</signatures>
例參數(shù)是javabean的Map,key是String,value是javabean,如下:
var stu =
{
? ?"key1":{name:"zhangsan",password:"zspassword"},
? ?"key2":{name:"lisi",password:"lspassword"}
};
AAA.bbb(stu,callBack);
?并且在dwr.xml中增加如下的配置段(剛才試驗(yàn)了下,不加也可以)
<signatures>
? <![CDATA[
? ?import java.util.List;
? ?import com.dwr.AAA; ? ? //AAA的包路徑要寫完整
? ?import com.dwr.TestBean; ?//javabean
? ?AAA.bbb(Map<String,TestBean>);
? ]]>
?</signatures>
轉(zhuǎn)載于:https://blog.51cto.com/3001448/1206047
總結(jié)
- 上一篇: 用js实现在文本框中检测字数和限制字数功
- 下一篇: Python变量