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