應(yīng)用場景

運(yùn)行流程:
* 1.執(zhí)行@ModelAttribute? 注解修飾的方法:從數(shù)據(jù)庫取出對象,把對象放入到了Map 中。鍵為:userinfo
* 2.SpringMVC 從Map 中取出User對象,并把表單的請求參數(shù)賦值給該User對應(yīng)屬性。
* 3.SpringMVC 把上述對象傳入目標(biāo)方法的參數(shù)
* 注意:在@ModelAttribute 修飾的方法中,放入到Map 時的鍵需要和目標(biāo)方法入?yún)㈩愋偷牡谝粋€字母小寫的字符串一致!


SpringMVC 確定目標(biāo)方法POJO類型入?yún)⒌倪^程
* 1.確定一個key:
? ? ????????? 1).若目標(biāo)方法的POJO類型的參數(shù)沒有使用@ModelAttribute 作為修飾,則key 為POJO類名第一個字母小寫
? ? ? ? ? ? ? ?2).若使用了@ModelAttribute 來修飾,則key 為@ModelAttribute 注解的value 屬性值。
* 2.在implicitModel 中查找key 對應(yīng)的對象,若存在,則作為入?yún)魅?/p>
????????????? ? ?1).若在@ModelAttribute 標(biāo)記的方法中在Map 中保存過,且key 和 1 確定的key一致,則會獲取到
* 3.若implicitModel 中不存在 ley 對應(yīng)的對象,則檢查當(dāng)前的Handler 是否使用@SessionAttributes 注解修飾
*? 若使用了該注解,且@SessionAttributes注解的value屬性值中包含了key,則會從HttpSession中來獲取key所對應(yīng)的value值,
*? 若存在則直接傳入到目標(biāo)方法的參數(shù)中,若不存在則將拋出異常。
* 4.若Handler 沒有標(biāo)識@SessionAtributes 注解或SessionAttributes 注解的value值中不包含key,則會通過反射來創(chuàng)建POJO類型的參數(shù),傳入為目標(biāo)
* 方法的參數(shù)
* 5.springMVC 會把 key和value 保存到implicitModel 中,進(jìn)而會保存到request 中。
源代碼分析的流程
* 1.調(diào)用@ModelAttribute 注解修飾的方法。實(shí)際上把@ModelAttribute 方法中的Map中的數(shù)據(jù)放在了implicitModel中。
* 2.解析請求處理器的目標(biāo)參數(shù),實(shí)際上該目標(biāo)參數(shù)來自于WebDataBinder 對象的target屬性
*? ? ? 1)創(chuàng)建WebDataBinder 對象:
*? ? ? ? ? ①.確定objectName 屬性:若傳入的 attrName 屬性值為“”,則objectName 為類名第一個字母小寫。
*? ? ? ? ? *注意:attrName.若目標(biāo)方法的POJO屬性使用了@ModelAttribute 來修飾,則attrName值即為@ModelAttribute的value屬性值
*? ? ? ? ? ②.確定target 屬性:
*? ? ? ? ? ? ? 在implicitModel 中查找attrName 對應(yīng)的屬性值。若存在,則ok
*? ? ? ? ? ? ? *若不存在:則驗(yàn)證當(dāng)前Handler是否使用了@SessionAttributes 進(jìn)行修飾,若使用了,則嘗試從Session 中獲取attrName
*? ? ? ? ? ? ? 所對應(yīng)的屬性值。若@Session中沒有對應(yīng)的屬性值,則拋出異常。
*? ? ? ? ? ? ? 若Handler沒有使用@SessionAttributes 進(jìn)行修飾,或@SessionAttributes中沒有使用value 值指定的key和attrName 相匹配,則通過反射創(chuàng)建
*? ? ? ? ? ? ? POJO對象
*? ? ? 2)springMVC 把表單的請求參數(shù)賦給看 WebDataBinder 和 target 對應(yīng)的屬性。
*? ? ? 3)*SpringMVC 會把WebDataBinder 的 attrName 和 target 給到 implicitModel,進(jìn)而傳到request 域?qū)ο笾小?/p>
*? ? ? 4)把WebDataBinder的target作為參數(shù)傳遞給目標(biāo)方法的入?yún)ⅰ?/p>