Spring中的@ModelAttribute和@SessionAttribute

时间:2012-03-31 22:41:12

标签: spring-mvc annotations modelattribute

作为Spring Specification said,@ ModelAttribute将在映射处理程序之前执行,而@SessionAttribute将在会话中保留模型属性。

考虑以下场景:在调用控制器之后创建表单bean,并将其设置为会话属性。下次调用MenuController时,将再次执行createForm()并创建另一个新的表单bean。我的问题是:这个最新创建的表单bean是否会被设置为会话属性?哪个表单bean将绑定到方法bookList()中的参数?

希望你们能提供帮助。谢谢。

@Controller
@RequestMapping("/store")
@SessionAttribute("form")
public class MenuController {
     @ModelAttribute("form")
     public Form createForm() {
     return new Form();
     }

     @RqeustMapping("/book")
     public String bookList(@ModelAttribute("form") Form form){
     //processing the form
     }
}

3 个答案:

答案 0 :(得分:1)

请记住,您的映射是一般化的。它将映射到GET方法和POST方法。

  

如果您的请求映射是GET方法,

session属性将保存createForm方法中@ModelAttribute(“form”)的值。

  

如果从POST请求返回属性表单,

会话属性将覆盖createForm方法中的@Model属性。

记住@ModelAttribute将在映射处理程序之前执行是有帮助的。

答案 1 :(得分:0)

在给定会话中首次调用bookList方法时,然后调用带有@ModelAttribute('form)的方法,返回值(Form对象)将填充在HttpSession中,而{{ 1}}方法具有相同的Form对象。

对于同一bookList中的后续请求,Spring从会话中检索相同的Form对象,并且直到会话结束才再次使用HttpSession调用该方法。

@ModelAttribute('form')方法调用的每个结束之后,Spring都会在bookList中存储Form对象的更新版本。

如果您使用的是Spring Boot 2.x,则可以调试DefaultSessionAttributeStore#retrieveAttribute方法来了解这种行为。

答案 2 :(得分:-1)

sessionAttribute表示“表单”将保存在会话中。并不意味着从会话中检索“表单”。