4

正如Spring 规范所说,@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
     }
}
4

3 回答 3

3

bookList给定会话中第一次调用该方法时,@ModelAttribute('form)将调用方法 with,将返回的值(Form 对象)存储在HttpSession其中,最后bookList使用作为参数传递的相同 Form 对象调用该方法(从会话中获取) .

对于相同的后续请求,Spring 从会话中检索相同的 Form 对象,并且直到会话结束才再次HttpSession调用该方法。@ModelAttribute('form')

在每次bookList方法调用结束后,Spring 将 Form 对象的更新版本存储在HttpSession.

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

于 2019-04-13T14:50:16.210 回答
1

请记住,您的映射是通用的。它将映射到 GET 方法和 POST 方法。

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

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

如果从 POST 请求返回一个属性形式,

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

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

于 2012-04-16T10:00:56.677 回答
-1

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

于 2015-12-23T16:55:59.627 回答