12dwr - dwr.xml配置(allow标签-Converter属性)

简介: 12dwr - dwr.xml配置(allow标签-Converter属性)

我们需要确认所有的参数能被转换。许多 JDK 提供的类型使你能够使用,但是你如果要转换你自己的代码,就必须告诉 DWR。一般是指 JavaBean 的参数需要一个<convert…>标签作为入口。

你不需要在 dwr.xml 中<allow>部分的<convert>中定义。它们默认支持。

  • 所有主要的类型,boolean, int , double 等等。
  • 包装类,Boolean, Integer 等等。
  • java.lang.String
  • java.util.Date 和 java.sql.Times,java.sql.Timestamp。
  • 数组(存放以上类型的)
  • 集合类型 (List, Set, Map, Iterator 等等) (存放以上类型的)
  • DOM 对象(来自于 DOM, XOM, JDOM 和 DOM4J)

日期转换器

如果你有一个 String(例如:“2001-02-11”)在 Javascript,你想把它转换成 Java 日期。那么你有 2 种选择,一是使用 Date.parse()然后使用 DataConverter 传入服务器端,还有一种选择是把该 String 传入,然后用 java 的 SimpleDateFormat(或者其他的)来转换。

同样,如果你有个 Java 的 Date 类型并且希望在 HTML 使用它。你可以先用 SimpleDateFormat 把它转换成字符串再使用。也可以直接传 Date 给 Javascript,然后用 Javascript 格式化。第一种方式简单一些,尽管浪费了你的转换器,而且这样做也会是浏览器上的显示逻辑受到限制。其实后面的方法更好,也有一些工具可以帮你,例如:

  • The Javascript Toolbox Date formatter
  • Web Developers Notes on Date formatting

数组转换器

数组实体不太容易理解。默认情况下 DWR 能转换所有原生类型的数组,还有所有 marshallable 对象的数组。这些 marshallable 对象包括前面介绍的 String 和 Date 类型。match 属性看上去很怪。

<convert converter="array" match="[Z"/>
<convert converter="array" match="[B"/>
<convert converter="array" match="[S"/>
<convert converter="array" match="[I"/>
<convert converter="array" match="[J"/>
<convert converter="array" match="[F"/>
<convert converter="array" match="[D"/>
<convert converter="array" match="[C"/>
<convert converter="array" match="[L*"/>

上面没有解释 * 的作用 - 它是通配符,表示匹配接下来的所有字符串。这也是 DWR 可以转换任意类型的数组的原因。

bean 和对象转换器

两个没有默认打开的转换器是 Bean 和 Object 转换器。Bean 转换器可以把 POJO 转换成 Javascript 的接合数组(类似与 Java 中的 Map),或者反向转换。这个转换器默认情况下是没打开的,因为 DWR 要获得你的允许才能动你的代码。

Object 转换器很相似,不同的是它直接应用于对象的成员,而不是通过 getter 和 setter 方法。下面的例子

都是可以用 object 来替换 bean 的来直接访问对象成员。’

如果你有一个在 <create ...> 中声明的远程调用 Bean。它有个一参数也是一个 bean,并且这个 bean 有

一个 setter 存在一些安全隐患,那么攻击者就可能利用这一点。

你可以为某一个单独的类打开转换器:

<convert converter="bean" match="your.full.package.BeanName"/>

如果要允许转换一个包或者子包下面的所有类,可以这样写:

<convert converter="bean" match="your.full.package.*"/>

显而易见,这样写是允许转换所有的 JavaBean:

<convert converter="bean" match="*"/>

BeanConverter 和 JavaBeans 规范

用于被 BeanConverter 转换的 Bean 必须符合 JavaBeans 的规范,因为转换器用的是 Introspection,而不是 Reflection。这就是说属性要符合一下条件:有 getter 和 setter,setter 有一个参数,并且这个参数的类型是 getter 的返回类型。setter 应该返回 void,getter 应该没有任何参数。setter 没有重载。以上这些属于常识。就在 eclipse 里自动为每个属性添加 setter,getter 那种类型,如果你用的不是JavaBean,那么你应该y用ObjectConverter.

设置 Javascript 变量

DWR 可以把 Javascript 对象(又名 maps,或联合数组)转换成 JavaBean 或者 Java 对象。例子:

public class Remoted {
public void setPerson(Person p) {
  // ...
}
}
public class Person {
public void setName(String name) { ... }
public void setAge(int age) { ... }
// ...
}

如果这个 Remoted 已经被配置成 Creator 了,Persion 类也定义了 BeanConverter,那么你可以通过下面

的方式调用 Java 代码:

var p = { name:"Fred", age:21 };
Remoted.setPerson(p);
限制转换器

就像你可以在 creator 的定义中剔出一些方法一样,converter 也有类似的定义。

限制属性转换仅仅对于 Bean 有意义,很明显原生类型是不要需要这个功能的,所以只有BeanConverter 及其子类型(HibernateBeanConverter))有这个功能。

语法是这样的:

<convert converter="bean" match="com.example.Fred">
<param name="exclude" value="property1, property2" />
</convert>

这就保证了 DWR 不会调用 fred.getProperty1() 和 fred.getProperty2 两个方法。另外如果你喜欢"白

名单"而不是"黑名单"的话:

<convert converter="bean" match="com.example.Fred">
  <param name="include" value="property1, property2" />
</convert>

安全上比较好的设计是使用"白名单"而不是"黑名单"。

访问对象的私有成员

通过’object’转换器的参数的一个名为 force 的参数,可以让 DWR 通过反射来访问对象私有成员。

语法是这样的:

<convert converter="object" match="com.example.Fred">
  <param name="force" value="true" />
</convert>

直到 DWR1.1.3,这里有一个 bug,public 的 field 反而不能被发现,所以你需要在 public 成员上设置

force=true。

集合类型转换器

有个两个默认的转换器,针对 Map 和 Collection:

<convert converter="collection" match="java.util.Collection"/>
<convert converter="map" match="java.util.Map"/>

一般来说这些转换器可以递归转换它们的内容。

但是也有两点不足之处:

  • 仅仅用反射机制是没有方法明确集合里面是什么类型的。所以这两个转换器不能把集合里面的东西转
    换成有意义的 Javascript 对象。
  • 不能明确是那种类型的集合。 虽然我们不能让他们自动的起作用,我们可以在 dwr.xml 中用
    signatures 语法声明它们类型,使之正确转换。

枚举类型转换器

枚举类型转换器默认是没有打开的。它在 Java5 中的 Enum 和 Javascript 的 String 之间进行转换。这个转换器默认关闭是因为 DWR 要在转换你的代码之前得到你的同意。

枚举类型转换器是 DWR 1.1 版以后才支持的。

你可以这样设置来打开这个转换器:

<convert converter="enum" match="your.full.package.EnumName"/>

设置 Javascript,一个简单的例子。假设你有下面的 Java 代码:

public class Remoted {
public void setStatus(Status p) {
// ...
}
}
enum Status {
PASS, FAIL,
}

如果 Remoted 类已经配置好 Creator,并且 Status 枚举类型已经设置了 EnumConverter。那么你就可以

在 javascript 中这样调用:

Remoted.setStatus("PASS");

DOM 对象

DWR 可以自动转换来之 DOM,DOM4J,JDOM 和 XOM 的 DOM 树。你可以简单得用上面这些类库返回一

个 Document、Element 或者 Node,DWR 会把他们自动转换成浏览器的 DOM 对象。

在程序启动的时候会有一个常见的关于 JDOM 转换器的警告,你可以放心的忽略它,除非你要用 JDOM:

image.png

因为 DWR 没有办法知道你是否想用 JDOM,所以这个信息设在 INFO 级别的。

如果你曾经尝试过使用 JDOM,你会意识到在这种情况下这个转换器不可用的 - 这也是我们显示这个信息的原因。

exist-db.org,我相信 DWR 能同 exist-db 很好的工作,因为它是建立在 W3C DOM 之上的,而 DWR 也支持这个。

目录
相关文章
|
1月前
|
Java 数据库连接 数据库
hibernate正向生成数据库表以及配置——Teacher.hbm.xml
hibernate正向生成数据库表以及配置——Teacher.hbm.xml
13 1
|
1月前
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
15 1
|
1月前
|
数据库
最全三大框架整合(使用映射)——struts.xml和web.xml配置
最全三大框架整合(使用映射)——数据库资源文件jdbc.properties
10 0
|
1月前
最全三大框架整合(使用映射)——applicationContext.xml里面的配置
最全三大框架整合(使用映射)——applicationContext.xml里面的配置
7 0
|
1月前
|
XML Java Apache
Apache Flink自定义 logback xml配置
Apache Flink自定义 logback xml配置
152 0
|
2月前
|
Java
logback配置,命名为logback-spring.xml
logback配置,命名为logback-spring.xml
|
2月前
|
XML Java 测试技术
【SpringBoot】基于 Maven 的 pom.xml 配置详解
【SpringBoot】基于 Maven 的 pom.xml 配置详解
231 0
【SpringBoot】基于 Maven 的 pom.xml 配置详解
|
6天前
|
XML 数据格式
小米备份descript.xml文件
小米备份descript.xml文件
12 0
|
17天前
|
XML Java 数据库连接
mybatis中在xml文件中通用查询结果列如何使用
mybatis中在xml文件中通用查询结果列如何使用
20 0
|
19天前
|
XML JavaScript 前端开发
xml文件使用及解析
xml文件使用及解析