DWR的转换器介绍

当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转换器有以下两个缺点:

  1. 如果集合不使用泛型限制集合元素的类型,则DWR无法确定集合元素的类型,因此这两个转换器都不能把集合元素转换成有意义的JavaScript对象。

  2. 不能明确指定集合的类型,只能使用基于接口的类型转换。

此时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>

相关文章

JS原生Ajax操作(XMLHttpRequest) GET请求 POST请求 兼容性问题 利用iframe模拟ajax 实现表单提交的返回...
AJAX 每日更新前端基础,如果觉得不错,点个star吧 &#128515; https://github.com/WindrunnerMax/E...
踩坑Axios提交form表单几种格式 前后端分离的开发前后端, 前端使用的vue,后端的安全模块使用的SpringSe...
很早就听闻ajax的名声,但是却一直不知道怎么用,今天自己捣鼓了一下,竟然会用了,哈哈哈哈。 为了防止...
需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: &quot;./server/slider.js...
Ajax函数封装ajax.js // Get / Post // 参数 get post // 是否异步 // 如何处理响应数据 // URL // var...