說(shuō)說(shuō)@ModelAttribute在父類和子類中的執(zhí)行順序
@ModelAttribute在父類、子類的執(zhí)行順序
被 @ModelAttribute 注解的方法會(huì)在Controller每個(gè)方法執(zhí)行之前都執(zhí)行,因此對(duì)于一個(gè)Controller中包含多個(gè)URL的時(shí)候,要謹(jǐn)慎使用。
執(zhí)行順序:
先執(zhí)行子類 @ModelAttribute 注解的方法,再執(zhí)行父類中 @ModelAttribute 注解的方法。
@ModelAttribute原理概述以及使用注意點(diǎn)
@ModelAttribute注解修飾的方法:
1.從數(shù)據(jù)庫(kù)中取出對(duì)象,把對(duì)象放到Map中,鍵為user
2.SpringMvc從Map中取出User對(duì)象,并且把請(qǐng)求參數(shù)賦值給User對(duì)象的對(duì)應(yīng)屬性
3.SpringMvc把上述的對(duì)象傳入目標(biāo)方法的參數(shù)
注意:在@ModelAttribute修飾的方法中,放入到Map中的鍵名要和目標(biāo)方法入?yún)㈩愋偷牡谝粋€(gè)字母小寫(xiě)的字符串一致
源碼分析流程:
調(diào)用@ModelAttribute注解修飾的方法,實(shí)際上@ModelAttribute方法中Map中的數(shù)據(jù)放在了implicitModel中.
解析請(qǐng)求處理器的目標(biāo)參數(shù),實(shí)際上該目標(biāo)參數(shù)來(lái)自于WebDataBinder對(duì)象的target屬性
1).創(chuàng)建WebDataBinder對(duì)象
確定objectName屬性:如果傳入的attrName屬性值為"",則objectName為類名第一個(gè)字母小寫(xiě)
注意:attrName若目標(biāo)方法的POJO屬性使用了@ModelAttribute來(lái)修飾,則attrName的值為@ModelAttribute的value屬性
確定target屬性
在implitModel中查找attrName對(duì)應(yīng)的屬性值.若不存在,則驗(yàn)證當(dāng)前handler是否使用了@sessionAttribute進(jìn)行修飾,則嘗試從session中獲取attrName所對(duì)應(yīng)的屬性值,若session中沒(méi)有,則拋出了異常。
若Handler沒(méi)有使用@sessionAttribute進(jìn)行修飾,或者@SessionAttrbutes中沒(méi)有value值指定的key和attrName相,則通過(guò)反射創(chuàng)建POJO對(duì)象.
2).SpringMvc把表單的請(qǐng)求參數(shù)賦給了WebDataBinder的target對(duì)應(yīng)的屬性,
3).SpringMvc會(huì)把WebDataBinder的attrName和targe給到implicitMoel
4).把WebDataBinder的target作為參數(shù)傳遞給目標(biāo)方法的入?yún)?/p>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
自己動(dòng)手在Spring-Boot上加強(qiáng)國(guó)際化功能的示例
這篇文章主要介紹了自己動(dòng)手在Spring-Boot上加強(qiáng)國(guó)際化功能的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
SpringBoot使用Spring Security實(shí)現(xiàn)登錄注銷(xiāo)功能
這篇文章主要介紹了SpringBoot使用Spring Security實(shí)現(xiàn)登錄注銷(xiāo)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-09-09
Java Elastic Job動(dòng)態(tài)添加任務(wù)實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Java Elastic Job動(dòng)態(tài)添加任務(wù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Java模擬rank/over函數(shù)實(shí)現(xiàn)獲取分組排名的方法詳解
這篇文章主要為大家詳細(xì)介紹了Java模擬rank()、over()函數(shù)獲取分組排名的方法設(shè)計(jì)及實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04
java實(shí)現(xiàn)消息隊(duì)列的兩種方式(小結(jié))
本文主要介紹了兩種java實(shí)現(xiàn)消息隊(duì)列的方式,利用Spring消息模板發(fā)送消息和Apache ActiveMQ官方實(shí)例發(fā)送消息,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
java Comparator.comparing排序使用示例
本文主要介紹了java Comparator.comparing排序使用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10

