DWR默認提供了一些類型轉換器(boolean、byte、short、int、long、float、
double、char、java.lang.Boolean、java.lang.Byte、java.lang.Short、java.lang.Integer、
java.lang.Float、java.lang.Double、java.lang.Character、java.math.BigInteger、
java.math.BigDecimal、java.lang.String)
即如果定義的java類中有方法參數或返回值爲這些類型則無需在dwr.xm中的<convert../>元素配置.
如果定義的java類中有方法的參數不是上述類型,爲複合類型或數組或集合類型,則需要在dwr.xml中的<convert../>中配置.
1.對於方法返回或參數類型爲複合類型,DWR提供了Bean轉換器和Object轉換器,但它們默認關閉,即在使用時必須打開:
<convert match="com.wang.Person" converter="bean"/>
<convert match="com.wang.Person" converter="object">
<!--通過force參數指定可以訪問對象的私有屬性-->
<param name="force" value="true"/>
</convert>
要同時使用bean轉換器轉換某個包下的所有類:
<convert match="com.wang.*" converter="bean"/>
要使用bean轉換器轉換所有類:
<convert match="*" converter="bean"/>
object轉換器也支持上述方式.
bean轉換器和object轉換器的不同之處在於,bean轉換器要求要轉換的屬性類必須符合JavaBean規範
即bean轉換器是通過setter和getter方法來訪問屬性),而object沒有上述要求(object轉換器使用反射來訪問屬性)
例如:
對於方法:
public String sendObj(Person p)
{
return p.getName()+",您好,這是一個JavaBean參數的方法";
}
1.使用bean轉換器:
<convert match="com.wang.Person" converter="bean"/>
則Person類必須符合javaBean規範:
package com.wang;
public class Person
{
private String name;
private int age;
public Person(){}
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}
2.使用object轉換器:
<convert match="com.wang.Person" converter="object">
<param name="force" value="true"/>
</convert>
Person無需符合javaBean規範:
package com.wang;
public class Person
{
private String name;
public Person(){}
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
}
默認情況生成的javascript對象包含所有屬性,當使用javascript調用sendObj(Person p)方法使用json格式:
hello.sendObj(
{name:'wang',
age:23},cb);
其中cb爲回調函數.
對於這個例子age屬性完全沒有用到,如果要使生成的javascript對象只是需要的,屏蔽某些屬性有兩種方式:
(1)白名單方式:
<convert conterter="bean" match="com.wang.ajax.entity.Person">
<param name="include" value="property1,property2..."/>
</convert>
對於本例:
<convert match="com.wang.Person" converter="bean">
<param name="include" value="name"/>
</convert>
(2)黑名單方式:
<convert conterter="bean" match="com.wang.ajax.entity.Person">
<param name="exclude" value="property1,property2..."/>
</convert>
對於本例:
<convert match="com.wang.Person" converter="bean">
<param name="exclude" value="age"/>
</convert>
2.DWR默認打開數組轉換器,即參數或返回值爲數組時不需再dwr.xml中配置
返回值爲數組時:
//data爲返回值
for(var i = 0 ;i<data.length;i++)
{
result+=data[i].name;
}
參數爲數組時:
var args=[
{name:"aaaa"},
{name:"bbbb"}
]
//cb爲回調函數
methodA(args,cb);
3.DWR默認提供了兩個集合轉換器Map和Collection對象,無需顯式配置
如果需要顯式配置:
<convert match="java.util.Collection" converter="collection"/>
<convert match="java.util.Map" converter="map"/>
DWR支持Collection放Map,也可Map放Collection.
(1)如果集合不使用泛型,DWR無法確定集合元素的類型(可以在dwr.xml中<signatures.../>來聲明集合元素數據類型)
(2)不能明確指定集合的類型,只能使用基於接口的類型轉換
參數是集合使用泛型:
public String sendList(List<Person> p1)
{
String result = "";
for(Person p : p1)
{
result += p.getName()+"<br/>";
}
return result;
}
javascript客戶端調用時執行傳入一個集合參數即可
參數是集合不使用泛型:
public String sendListNoGeneric(List p1)
{
String result = "";
for(Object p : p1)
{
result += ((Person)p).getName()+"<br/>";
}
return result;
}
需要在dwr.xml中:
<signatures>
<!--DWR默認會導入java.lang.*下的所有類-->
<![CDATA[
import java.util.List;
import dwr.HelloDwr;
import dwr.Person;
HelloDwr.sendListNoGeneric(List<Person>);
]]>
</signatures>