我们在应用 DWR 调用远程方法时涉及到 JS 与 JAVA 之间参数和返回值的数据转换,例如:
JS 的 123 与 Java 的 int或 Integer、long 间的转换
JS 的 "2009-06-23" 与 Java 的 java.util.Date 之间的转换
JS 的 "[1,2,3]" 与 Java 的 int[] 间的转换
JS 的 "{id:123, name: 'Unmi'}" 与 Java 的 Class Person{int id; String name} 间的转换
或者更复杂的嵌套类型( "{id:123, name: 'Unmi', blogs: ['http://unmi.blogjava.net','http://blog.csdn.net/kypfos']}" ) 与 Java 类型间的转换,等等。 那么这一切是怎么进行的呢?其实我们见识过很多组件的类型映射,如 Java 的 PropertyEditor、 Hibernate(UserType)、iBatis(TypeHandler) 的类型映射,Struts1/2 中 Form/Model 用的 Converter 等。
这里我来稍稍分析 DWR 的 Converter 实现,以及说明如何定制自己的 Converter。本文所用 DWR 是 2.0.5 版。
1. DWR 内置的 Converter 及应用类型
名称 | 应用类型 | 转换器 |
null | void,java.lang.Void | NullConverter |
enum | EnumConverter | |
primitive | 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.Double,java.lang.Character |
PrimitiveConverter |
bignumber | java.math.BigInteger,java.math.BigDecimal | BigNumberConverter |
string | java.lang.String | StringConverter |
array | [Z,[B,[S,[I,[J,[F,[D,[C,[L* | ArrayConverter |
map | java.util.Map | MapConverter |
collection | java.util.Collection | CollectionConverter |
date | java.util.Date,java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Calendar |
DateConverter |
dom | org.w3c.dom.Node,org.w3c.dom.Element, org.w3c.dom.Document |
DOMConverter |
dom4j | org.dom4j.Document,org.dom4j.Element, org.dom4j.Node |
DOM4JConverter |
jdom | org.jdom.Document,org.jdom.Element | JDOMConverter |
xom | nu.xom.Document,nu.xom.Element, nu.xom.Node |
XOMConverter |
servlet | javax.servlet.ServletConfig, javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.http.HttpSession |
ServletConverter |
bean | BeanConverter | |
object | ObjectConverter | |
hibernate2 | H2BeanConverter | |
hibernate3 | H3BeanConverter | |
url | java.net.URL | URLConverter |
exception | ExceptionConverter | |
miniException | java.lang.Throwable | MinimalistExceptionConverter |