admin管理员组文章数量:1794759
Spring MVC DataBinder
我们都知道Spring MVC在处理HTTP请求的时候的数据都是来自于HTTP 请求。这不是废话吗,:)! 那么Spring MVC是如何把HTTP中的请求中的数据纳入到其中呢?我们都知道Spring MVC处理HTTP请求是通过DispatcherServlet来做为拦截请求的。DispatcherServlet是一个Ja va EE中的Servlet,可以从Servlet容器(e.g. Tomcat) 获取到HTTP请求传过来的报文封装的HttpServletRequest 。
由之前的BLOG – Spring MVC DispatcherServlet,我们可以知道Spring MVC最终是通过反射来调用定义在Controller中标注了@RequestMapping的方法。其中数据绑定的入口是InvocableHandlerMethod#getMethodArgumentValues方法。
下面先把调用的时序图弄出来。由于方法调用过深就画了2个时序图:
把HttpServletRequest中的参数放入到Spring中的DataBinder对象中。
在这个过程中在ModelAttributeMethodProcessor#resolveArgument通过下面的代码创建空的方法参数对象实例:
Object attribute = (mavContainer.containsAttribute(name) ? mavContainer.getModel().get(name) : createAttribute(name, parameter, binderFactory, webRequest));创建的这个空的实例是作为下一步setPropertyValue利用内省来进行塞值 作准备的。
2、setPropertyValues通过第一步中实例化这一个需要把HTTP请求中的值放入到Spring MVC中的参数对象当中。当然最外层是foreach的把Spring MVC Controller中的方法参数创建出来给后面的反射调用。
3、DataBinder类图在Spring MVC中使用DataBinder的实例是ExtendedServletRequestDataBinder。我们先来看一下它的类图:
这个类图是不是和之前Spring IOC依赖注入中的BeanWrapper的有点差不多,只是它是简化版本的依赖注入.
而且Spring MVC当中创建WebDataBinder是通过工厂方法模式来创建的,下面WebDataBinderFactory的类继承图:
下面来分析这个Spring MVC中是何时把数据真正纳入到DataBinder当中的。具体是在第一步DataBinder当中ModelAttributeMethodProcessor#resolveArgument中的下面的方法当中创建的:
WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);当然这个创建过程还有很多细节,我这个只是给大家给个抛砖引玉的作用。如果大家感兴趣,可以自己去看看源代码。
这下子就把Spring MVC就把HttpServletRequest当中的参数纳入到Spring当中,然后再把数据通过内省把数据塞到Spring MVC当中Controller当中标注了@RequestMapping的方法中。我们就可以来分析一下Spring MVC处理Servlet的步骤:
推荐阅读之前的BLOG: 1. Spring MVC @RequestMapping – 建立HTTP与Controller中的方法映射 2. Spring MVC DispatcherServlet – Spring MVC处理HTTP请求的过程
本文标签: springMVCDataBinder
版权声明:本文标题:Spring MVC DataBinder 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686619100a86988.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论