作为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
}
}
答案 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表示“表单”将保存在会话中。并不意味着从会话中检索“表单”。