下面我们来一步步讲解:

1.转换器(convert)用于负责定义java类型和js类型之间的对应关系,看看文档的说辞:

Converters are an integral part of DWR and are responsible for marshaling data between the client and the server. You must specify a converter for:

  1. The Java return type of Java methods you have exposed to DWR. In order to return a JavaScript object that can be used by the browser DWR needs to kNow how to marshal the Java return type into a JavaScript object.
  2. The Java parameter type of all parameters of Java methods you have exposed to DWR. In order to properly call the Java method DWR needs to kNow how to marshal the JavaScript object being passed from the browser into the appropriate Java object.

从上面的文字可以知道,在客户端和服务器,无论是return type和parameter type上,都存在转换的问题,这样就更加凸显转换器的作用。

2.基本转换器(Basic Converters)的使用:

The converters for primitives,strings and simple objects like BigDecimal are all there waiting for you. Youdon'tneed a<convert ...>element in the<allow>section in dwr.xml to use them - They are enabled by default.

The types enabled by default include:boolean,byte,short,int,long,float,double,char,java.lang.Boolean,java.lang.Byte,java.lang.Short,java.lang.Integer,java.lang.Long,java.lang.Float,java.lang.Double,java.lang.Character,java.math.BigInteger,java.math.BigDecimal and java.lang.String

使用基本类型转换器不需要再在<allow>中使用<convert.../>元素来标识,它自己默认启用了。同时,上面的文档也列举了Basic Converters所能支持的类型:boolean、byte、short、int、long、float、double、char、java.lang.Boolean、java.lagne.Byte、java.lang.Short、java.lange.Integer、java.lang.Logn、java.lang.Float、java.lang.Double、java.lang.Character、java.math.BigInteger、java.math.BigDecimal以及java.lang.String。

3.日期转换器(Date Converter)的使用:

The Date converter marshalls between a Javascript Date and ajava.util.Date,java.sql.Date,java.sql.Timesorjava.sql.Timestamp. As with the basic converters above,the DateConverter is enabled by default.

If you have a string (e.g. "01 Jan 2010") in Javascript,that you wish to turn into a Java Date then you have 2 options: Parse it in Javascript usingDate.parse()and then pass it to the server using DWR's DateConverter,or pass it as a String and then parse it in Java using a SimpleDateFormat (or something similar).

On the other hand,if you have a date in Java which you wish to display in a usable form in HTML,then you can either transfer it as a string after using a DateFormatter on it,or transfer as a Date and then use Javascript to format it. The first option is probably easier although it does mean messing around with your converted objects,and it's doing something that it strictly view logic further from the browser. The latter option is better really and there are utilities to help you.

DWR提供了Date转换器,Date转换器负责在js的Date类型与Java中的Date类型之间进行转换,DWR默认支持Date转换器。

如果你有一个js的string(比如 2010-01-01),需要转换成一个Java的Date类型,默认提供了两种方法:在js中使用Date.parse()方法,把它解析成js的Date类型,然后由DWR的DateConverter来负责转换成Java的Date对象。或者直接将string传递到服务器端,然后在服务器端使用SimpleDateFormat转换成Date对象。

反过来,如果你有一个Java的Date对象,希望在HTML使用这个值,你可以选择先用SimpleDateFormat把它转换成string在传递给客户端的js使用。或者直接把这个Date对象传给客户端,再用js来格式化他。使用第一种方法可以很简单,但是却是无法再多样化显示了。而第二种就灵活很多,客户端的js代码获得是Date对象,因此可以提供更灵活的显示格式。

4.对象转换器(Bean and Object Converters)的使用

Two converters that are not enabled by default are the Bean and Object converters. They will convert Java Beans and POJOs to and from JavaScript objects. These converters are not enabled by default because DWR makes sure that is has permission before it exposes any of your classes.

DWR默认是关闭Bean converter和Object converter这两种converter的,因此使用这两个转换器必须要显示的通过文档调用才可以的。

我们看看接下来的这段文档:

Beans converted using the BeanConverter need to follow theJavaBeans specbecause the converter usesIntrospectionand notReflection. This means things like having properly named getters and setters where there is a single parameter to the setter which matches the return type of the getter. The setter should return void,the getter should not have any parameters and there is no overloading of setters. Mostly this is common sense,but it does trip some people up. If your class does not follow the Java Bean specification then you need the ObjectConverter.

Object converter和Bean converter是很相似的,都是负责完成Java对象和js对象之间的转换。但是Object转换器相对来说强大一点,因为他是使用reflection(反射)来访问Java对象的属性,即Object转换器用于转换普通Java对象(该Java对象并未为每个属性提供setter和getter方法)。而Bean转换器就是通过setter和getter来访问Java对象的属性。

为某个类单独打开一个Bean转换器,可以采用如下代码:

<!-- 对mwj.Mwj类使用Bean转换器-->

<convert convertor="bean" match="mwj.Mwj"/>

好像上面的例子,使用Bean转换器将使用setter和getter方法访问mwj.Mwj对象的各属性。如果使用Bean转换器,那么对应的类必须要符合JavaBean规范,即每一个属性都含有setter和getter方法。

如果同时需要转换某个包下的所有类,可以采用如下格式代码:

<convert convertor="bean" match="mwj.*"/>//这种方法将同时用Bean转换器把mwj包下的所有类进行转换。

如果想要把所有的类都进行Bean转换器的转换,可以采用如下的代码:

<convert convertor="bean" match="*"/>//这种方法可以同时用Bean转换器把该应用中的所有类都转换。

我们看看文档是如何让我们去操作DWR的:

public class Remoted {
public void addToFriends(Person p) {
// ...
}

}//Remoted类里面的addToFriends方法调用了Person类的参数。根据前面学习的“术语”知道,这个时候Remoted类是要被create的,而Person类是要被convert的。

public class Person {

private String name;//文档的例子没有这些的,我补上去是为了规范化的JavaBean。

private int age;//文档的例子没有这些的,我补上去是为了规范化的JavaBean。

public void setName(String name) { ... }

//文档的例子没有这些的,我补上去是为了规范化的JavaBean。

public String getName() { ... }
public void setAge(int age) { ... }

//文档的例子没有这些的,我补上去是为了规范化的JavaBean。

public int getAge() {... }
// ...
}

那么我们可以在前端的js代码中写到如下的内容:

var p = { name:"Fred",age:21 };//用JSON格式创建了一个js对象。明显这是一个Person的对象。
Remoted.addToFriends(p);//可以看到这个时候前端通过DWR的帮助,实现了Remoted对象的自动生成。这个时候就好像在操作一个js对象一般,来操作一个类。

如果我们希望不转换一个类中的某个属性,我们可以通过使用类似与create的白名单或者黑名单的方式来操作,那么就可以这样用:

<convert converter="bean" match="com.example.Person">
<param name="exclude" value="property1,property2"/>//黑名单法则,不转换property1、2。
</convert>

通常使用JavaBean作为远程Java方法的参数和返回值。如果远程Java方法的参数或返回值不是JavaBean实例,而是普通Object,则应该使用Object转换器。如下面的例子:

public class Person

{

private String name;

public Person(String name){

this.name=name;

}

}//这是一个简单的POJO

下面在dwr.xml文档中的设置:

<convert converter="object" match="com.example.Person">

<!-- 指定force=“true”,强制使用反射访问私有属性。-->

<param name="force" value="true"/>

</convert>

那么如何设置java类和js类之间的对应呢?可以使用javascript属性,例如下面的代码:

<convert converter="bean" match="com.example.Person" javascript="Person"/>

接下来,讨论一种继承关系在DWR中的应用的:

public class Employee extends Person{

public void setEmployee(Employee emp){... }

}//显然这个Employee继承了前面的Person。

dwr.xml代码:

<convert converter="bean" match="com.example.Employee" javascript="Employee"/>

前端js代码:

var person=...// 从服务器返回一个Employee类的对象

person instanceof Employee// 毫无疑问,结果为true

Remoted.addToFirends(person);// 前面的例子可以看出Remoted只能接受Person类参数,但是现在可以接受Employee,那就证明了一点,Employee是Person的子类。

但是,如果我们创建继承关系使用以下这种模式的时候:

var person1 = new Employee();

var person2 = new Person();

person1instanceof Employee;//true

person2 instanceof Employee;//false

person1 instanceof Person;//fasle(unexcepted)

person2 instanceof Person;//true

显然,这不是我们所期待的,那么如果真的要实现这种继承要怎么办呢?我们可以通过js自带的“伪继承”机制来实现:

Employee.prototype = new Person();//prototype的继承模式,Employee的prototype属性执行Prototype对象。

Employee.prototype.constructor = Employee;//Prototype对象的constructor属性指向一个Constructor对象,而这个Constructor对象恰好就是这个函数自己。

...

person1 instanceof Employee;//true

5.数组转换器(Array Converters)的使用

The array entries are less obvIoUs. By default DWR marshalls arrays of all primitive types as well as arrays of all marshallable objects,which by default includes String and Date as noted prevIoUsly.

默认情况下,数组转换器已经是打开的了,不过数组元素是基本数据类型还是字符串,或者是其他引用数据类型。因此,不需要在dwr.xml中添加任何额外的配置。而且因为数组的操作比较简单,那么就不再重复了。

6.集合类型转换器(Collection Converters)的使用

DWR提供好了两个集合转换器,两个转换器分别用于转换Map对象和Collection对象。DWR默认已经打开这两个集合转换器,因此无需在dwr.xml文件中配置。

如果实在要显示配置的的话,那么就需要使用如下的代码:

<convert convertor="collection" match="java.util.Collection"/>

<convert convertor="map" match="java.util.Map"/>

下面我们看文档的另外一段话:

There is no way of kNowing the underlying type of the collection just using reflection. So the 2 converters above can convert from any collection to something meaningful in JavaScript,however there is no way to kNow what sort of Collection to converttogoing the other way.

map和collection转换器有如下两个不足之处:

a.如果不使用泛型限制集合元素的类型,那么DWR无法确定集合元素的类型,从而,无法把集合元素转变为有意义的js对象。

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

不过集合可以不使用泛型来限制类型,但是可以通过使用dwr.xml中的<signatures.../>来声明集合元素的数据类型,从而可以让DWR能正确识别到集合元素的类型。如果使用泛型来限制集合元素类型将会更加简洁。

7.方法声明(signatures)的使用

The signatures section is used to enable resolution of the types stored in Collections when specific generic types are not being used.

因为DWR使用反射来实现集合元素的类型获取,但是有时候并不能很好的实现。特别是如同下面的这种情况:

public class Check {
public List<?> setLotteryResults(List<?> whatDoIContain)
{ ... }
}

那么这个时候就可以使用signatures来帮助实现“类泛型”的方法:

<signatures>
<![CDATA[ import java.util.List;
import com.example.Check;
Check.setLotteryResults(List<Integer> nos); ]]>
</signatures>

请记住:signatures元素的使用是在DWR没有办法实现泛型转换的基础上进行的。



转载地址:http://www.cnblogs.com/kaka-bing/archive/2012/06/10/2544094.html

DWR的学习-dwr convert的作用的更多相关文章

  1. html5 拖拽及用 js 实现拖拽功能的示例代码

    这篇文章主要介绍了html5 拖拽及用 js 实现拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5适合的情人节礼物有纪念日期功能

    这篇文章主要介绍了HTML5适合的情人节礼物有纪念日期功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. ios – 如何使用string中的参数创建Selector

    我正在使用Swift3.1和Xcode8.3.3编写程序.我想创建一个类,负责在键盘出现和消失时移动整个视图.但是我在使用字符串参数创建自定义选择器时遇到了困难.要显示或隐藏键盘我们需要功能:我正在尝试创建一个这样的选择器:它正在编译,但是当键盘出现时,它会崩溃.因为它是独立的类我不能使用这种结构:因为它将Swift函数转换为Objective-C函数.所以问题是:如何用参数字符串创建一个Selector表单?

  5. ios – 为什么,将nil作为参数从Objc C发送到swift类初始化器,用新对象替换nil参数

    除非属性本身被声明为nonnull:

  6. ios – 如何为NSNotification编写单元测试

    我在swift工作,我想刷新一个页面,所以我使用通知发送它,我在一个ViewController中发布通知并在另一个中添加观察者,它工作正常.我想要做的是在swift中添加单元测试.我查了很多网站但是没能做到.我是新手,不知道从哪里开始.基本上工作是,当我点击按钮通知被发布时,并且当加载下一个视图控制器时,添加通知观察者.我该怎么做单元测试提前致谢编辑:码并添加观察者解决方法一般的解决方案是:使用

  7. 对于NSManagedObject,Xcode 9构建了Date vs NSDate的问题

    Xcode9为模拟器与设备中的实体的Date类型属性生成不同的代码.我在coredata中将类设置为类别/扩展名下的codegen功能.直到Xcode8.3(最新)它一切正常.下面是Xcode9为属性自动生成的代码–在设备上:–和,在模拟器上:–有谁遇到过这个问题?对于一个有50个成员的项目来解决这个问题的最佳解决方案是什么,直到Xcode更新修复它?

  8. iOS兼容输入类型日期 – 设置最小值最大值

    我试图在UIWebViewiOS应用程序中使用jQueryMobile设置日期,值设置正确但最小和最大属性日期设置不起作用.和当我在模拟器上运行它时,当选择日期字段时,日期选择器可见,但未设置最小,最大日期.解决方法模拟器的safari不支持设置输入类型=“日期”的最小值和最大值.您可以通过导航到thissite并尝试控制来测试它.它(可能)可以在桌面浏览器上运行,但不会在模拟器的浏览器或UIWebView中运行.

  9. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  10. ios – 设置NSDataDetector的上下文日期

    假设今天是2014年1月20日.如果我使用NSDataDetector从“明天下午4点”字符串中提取日期,我将得到2014-01-21T16:00.大.但是,假设我希望NSDataDetector假装当前日期是2014年1月14日.这样,当我解析“明天下午4点”时,我将得到2014-01-15T16:00.如果我在设备上更改系统时间,我会得到我想要的.但是,有没有办法以编程方式指定它?

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部