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>