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>