初學 Spring MVC , 感覺對於 @ModelAttribute 和 @SessionAttributes 是如何被Spring MVC處理的,這一流程不是很清楚,
經過Google資料,有了一個較為詳細的了解,在此總結一下。
1)Spring MVC 在調用處理方法之前,在請求線程中自動的創建一個隱含的模型對象。
2)調用所有方法級的 標注了 @ModelAttribute 的方法,並將方法返回值添加到隱含的模型對象中。
3)如果方法所在的控制器 (標記 @Controller的類)沒有標記 @SessionAttributes("sessionXXX") 注釋,則該處理步驟可跳過。
查看Session 中是否存在 sessionXXX 屬性,如果有,將其添加到隱含的模型對象中。如果隱含的模型對象中已經存在了sessionXXX屬性,則其值將會被覆蓋。
以下的步驟是針對 標記@ModelAttribute("xxx") 方法入參 的
4)如果隱含的模型對象已經存在xxx屬性,則將其賦值給入參,並將用戶的請求消息 賦值給入參的相應屬性 (PS:支持級聯屬性),並返回,以下的處理步驟不再進行。
5)如果 方法所在的控制器、標記了 @SessionAttributes("xxx") 注釋,則繼續進行該處理步驟,否則直接進入步驟6。
查找 Session,如果沒有找到 xxx 屬性,則拋出異常 HttpSessionRequiredException 。
如果找到則將其賦值給入參,並將用戶的請求消息 賦值給入參的相應屬性 (PS:支持級聯屬性),並返回,以下的處理步驟不再進行。
6)創建入參實例,並將其賦值給入參,並將用戶的請求消息 賦值給入參的相應屬性 (PS:支持級聯屬性)。至此,處理完畢。