快速业务通道

DWR的Converter实现原理简单分析及应用 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

DWR的Converter实现原理简单分析及应用(2)

时间:2011-09-14 unmi 隔叶黄莺

它们是应用启动的时候,通过 org.directwebremoting.servlet.DwrServlet 初始化 dwr- 2.0.5.jar!/org/directwebremoting/dwr.xml 文件加载进来的。例如:

<converter id="date" class="org.directwebremoting.convert.DateConverter"/> 注册了 date 转换器

<convert converter="date" match="java.util.Date"/> 应用注册的 date 转换器应用到 java.util.Date 类型

看到上面,你也许会惊讶一下,我们平时可能也就用下 bean 转换器,其他用内置就行。然而 DWR 确 为我们考虑的很周到的,包括 hibernate 相关的,URL、Servlet、Dom 等相关类型的转换器。

2. DWR 如何确定用哪个 Converter?

DWR 是根据方法参数来确定入口参数的 Converter、根据返回值类型确定传向 JS 的出口参数的 Converter。总之是以 Java 方法原型为基准来决定每一参数或返回值各自用哪个 Converter 来转换数据 。

在 BaseCallMarshaller.marshallInbound(HttpServletRequest request, HttpServletResponse response) 方法中,使用

Class paramType = method.getParameterTypes()[j] 来获得参数的类型,然后从已加载的 Converter Map 中找到 Converter 名称,进而确定 Converter 类名。

而确定返回值类型就不是直接用反射的 method.getReturnType()。而是以反射方式调用方法后,根据 具体返回值的类型来确定的。见:

Replay DefaultRemoter.execute(Call) 方法中的

Object reply = chain.doFilter(object, method, call.getParameters()); 再进入到

Object ExecuteAjaxFilter.doFilter(Object obj, Method method, Object[] params Ajax FilterChain){

return method.invoke(obj, params);

}

就是根据上面的返回值,然后在

DefaultConverterManager.convertOutbound(Object, OutboundContext) 方法中的

Converter converter = getConverter(object);  //根据返回值 object  确定该用的 Converter 。

3. DWR Converter 的调用

多留意下 DWR 自带的 Converter,可以看到所有的 Converter 直接或简接的 extends Bas***0Converter implements Converter,其实 Bas***0Converter(DWR 1.x 中对应为 BaseV10Converter) 本身就实现了 Converter。在 Bas***0Converter 抽象类中默认实现了 Converter 的方法

public void setConverterManager(ConverterManager config)  {  }

具体的 Converter 只要专心去实现接口 Converter 中的另两个方法:

Object convertInbound(Class paramType, InboundVariable data, InboundContext inctx) throws MarshallException;

OutboundVariable convertOutbound(Object data, OutboundContext outctx) throws MarshallException;

运行时,它们相应的被 ConvertManager(默认为 DefaultConvertManager) 的

Object convertInbound(Class paramType, InboundVariable iv, InboundContext inctx, TypeHintContext incc) throws MarshallException

OutboundVariable convertOutbound(Object object, OutboundContext outctx) throws MarshallException

来调用。

DWR 对每个参数或返回值至少会应用一次 Converter,但对于复杂的类型会递归的调用 Converter, 比如,要完成

JS "{id:123, name: ''Unmi'', blogs: [''http://unmi.blogjava.net'',''http://blog.csdn.net/kypfos'']}"  到 Java 的 Person{int id, String name, String[] blogs;} 的转换,就会使用到 bean->primitive->array 三个 Converter 。

DWR的Converter实现原理简单分析及应用(3)

时间:2011-09-

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号