Spring MVC 对于@ModelAttribute 、@SessionAttributes 的详细处理流程



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:支持级联属性)。至此,处理完毕。

你可能感兴趣的:(springmvc,ModelAttribute)