javascript
Spring MVC DataBinder
我們都知道Spring MVC在處理HTTP請(qǐng)求的時(shí)候的數(shù)據(jù)都是來自于HTTP 請(qǐng)求。這不是廢話嗎,:)! 那么Spring MVC是如何把HTTP中的請(qǐng)求中的數(shù)據(jù)納入到其中呢?我們都知道Spring MVC處理HTTP請(qǐng)求是通過DispatcherServlet來做為攔截請(qǐng)求的。DispatcherServlet是一個(gè)Ja va EE中的Servlet,可以從Servlet容器(e.g. Tomcat) 獲取到HTTP請(qǐng)求傳過來的報(bào)文封裝的HttpServletRequest 。
由之前的BLOG – Spring MVC DispatcherServlet,我們可以知道Spring MVC最終是通過反射來調(diào)用定義在Controller中標(biāo)注了@RequestMapping的方法。其中數(shù)據(jù)綁定的入口是InvocableHandlerMethod#getMethodArgumentValues方法。
下面先把調(diào)用的時(shí)序圖弄出來。由于方法調(diào)用過深就畫了2個(gè)時(shí)序圖:
1、DataBinder
把HttpServletRequest中的參數(shù)放入到Spring中的DataBinder對(duì)象中。
在這個(gè)過程中在ModelAttributeMethodProcessor#resolveArgument通過下面的代碼創(chuàng)建空的方法參數(shù)對(duì)象實(shí)例:
Object attribute = (mavContainer.containsAttribute(name) ? mavContainer.getModel().get(name) :createAttribute(name, parameter, binderFactory, webRequest));創(chuàng)建的這個(gè)空的實(shí)例是作為下一步setPropertyValue利用內(nèi)省來進(jìn)行塞值 作準(zhǔn)備的。
2、setPropertyValues
通過第一步中實(shí)例化這一個(gè)需要把HTTP請(qǐng)求中的值放入到Spring MVC中的參數(shù)對(duì)象當(dāng)中。當(dāng)然最外層是foreach的把Spring MVC Controller中的方法參數(shù)創(chuàng)建出來給后面的反射調(diào)用。
3、DataBinder類圖
在Spring MVC中使用DataBinder的實(shí)例是ExtendedServletRequestDataBinder。我們先來看一下它的類圖:
這個(gè)類圖是不是和之前Spring IOC依賴注入中的BeanWrapper的有點(diǎn)差不多,只是它是簡(jiǎn)化版本的依賴注入.
而且Spring MVC當(dāng)中創(chuàng)建WebDataBinder是通過工廠方法模式來創(chuàng)建的,下面WebDataBinderFactory的類繼承圖:
下面來分析這個(gè)Spring MVC中是何時(shí)把數(shù)據(jù)真正納入到DataBinder當(dāng)中的。具體是在第一步DataBinder當(dāng)中ModelAttributeMethodProcessor#resolveArgument中的下面的方法當(dāng)中創(chuàng)建的:
WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);當(dāng)然這個(gè)創(chuàng)建過程還有很多細(xì)節(jié),我這個(gè)只是給大家給個(gè)拋磚引玉的作用。如果大家感興趣,可以自己去看看源代碼。
這下子就把Spring MVC就把HttpServletRequest當(dāng)中的參數(shù)納入到Spring當(dāng)中,然后再把數(shù)據(jù)通過內(nèi)省把數(shù)據(jù)塞到Spring MVC當(dāng)中Controller當(dāng)中標(biāo)注了@RequestMapping的方法中。我們就可以來分析一下Spring MVC處理Servlet的步驟:
推薦閱讀之前的BLOG:
1. Spring MVC @RequestMapping – 建立HTTP與Controller中的方法映射
2. Spring MVC DispatcherServlet – Spring MVC處理HTTP請(qǐng)求的過程
總結(jié)
以上是生活随笔為你收集整理的Spring MVC DataBinder的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反垃圾邮件产品测试评价方法
- 下一篇: 聊聊Spring中的数据绑定 --- D