DWR的Converter实现原理简单分析及应用 - 编程入门网
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |