当java方法的参数不是基本数据类型也不是字符串类型时,DWR无法正常识别这种自定义类型的数据,必须在配置文件中定义转换器。转换器的作用是完成java实例和JavaScript对象之间的相互转换,从而保证Ajax交互的正常通信。
基本转换器
基本转换器的作用是用于负责完成java类型和JavaScript类型之间的相互转换。
对于普通的情形,我们无须显示使用准换器,对于所有的基本数据类型,包括String和BigDecimal等,DWR已经提供了一种简单对象的转换器,无须在dwr.xml
<allow
>元素中使用<convert>
元素定义。
DWR默认支持的类型有:boolean、byte、short、int、long、float、double、char、java.lang.Boolean、java.lang.Byte、java.lang.Short、java.long.Integer、java.lang.Long、java.long.Float、java.long.Double、java.long.Character、java.math.BigInteger、java.math.BigDecimal和java.lang.String。对于日期类型的数据,DWR则提供了Date转换器。Date转换器负责在JavaScript的Date类型与java中的date类型(java.util.Date、java.sql.Date、java.sql.Times或java.sql,TimeStamp)之间进行转换,DWR默认支持Date准换器。
对象准换器
DWR默认关闭了Bean和Object转换器。Bean转换器用于完成JavaBean对象和JavaScript对象之间的转换。Bean准换器默认是关闭的,因此必须在dwr.xml文件中显示打开该转换器才可以在java方法中使用对应的JavaBean实例作为参数或返回值。
Object转换器与Bean转换器的作用完全相同,都是用于完成java 对象和JavaScript对象之间的转转。但是Object转换器的功能更加强大,Object转换器通过java的反射来访问java对象的属性,即Object转换器用于转换普通的Java对象(没有getter和setter方法)。
为某个类单独打开一个Bean转换器,可以采用如下编码:
<convert converter=“bean” match=“com.bh.domain.User”/>
以上的转换器表明DWR将使用setter和getter方法访问com.bh.domain.User对象的各个属性Bean转换器要求java对象必须符合JavaBean规范,要求每个属性都必须有对应的getter方法和setter方法。
如果同时需要转换某个包下的所有类,可采用如下格式:
<convert converter=“bean” match=“com.bh.domain.*”/>
下面的配置指定所有的类都是使用Bean转换器进行转换:
<convert converter=“bean” match=“*”/>
在某些情况下,假设类A有x、y、z三个属性,但是希望DWR将A实例转换成javascript对象后只包含x和y属性,屏蔽z属性,则可以使用Bean转换器的限制转换功能,限制转换有两种方式:
黑名单方式:被黑名单列出的属性将不会转换到JavaScript对象中。
<convert converter=“bean” match=“com.bh.domain.A”>
<param name="execlude" value="z,......"/>
</convert>
白名单方式:没有被白名单列出的属性将不会转换到javascript对象中。
Object转换器
<convert converter=“object” match=“com.bh.domain.A”>
//指定force=true强制使用反射访问私有属性
<param name="force" value="true"/>
</convert>
数组转化器
默认情况下数组转换器是打开的,不管数组元素时基本类型还是字符串或者是其他引用数据类型,DWR都可以支持转换。因此不管远程java方法中的参数是数组还是java方法返回值是数据,都不需要在dwr.xml 中增加额外的配置。
集合类型转换器
DWR提供了两个集合转换器,两个转换器分别用于转换Map对象好collection对象。DWR默认已经打开这连个集合转换器,因此也无需在dwr.xml中额外配置。
map和collection转换器有以下两个缺点:
如果集合不使用泛型限制集合元素的类型,则DWR无法确定集合元素的类型,因此这两个转换器都不能把集合元素转换成有意义的JavaScript对象。
不能明确指定集合的类型,只能使用基于接口的类型转换。
此时DWR允许在dwr.xml中使用<signatures.../>
来声明集合元素的数据类型,从而可以让DWR能正确识别集合元素的类型。当然使用泛型限制集合元素类型将会更加简洁。
<!-- 因为sendListNoGeneric方法中list没有指定参数类型,需要借助signatures标签指定其类型 -->
<signatures>
<![CDATA[ import java.util.List; import com.bohua.dwr.HelloDwr; import com.bohua.beans.Person; HelloDwr.sendListNoGeneric(List<Person>); ]]>
</signatures>