【问题标题】:@ModelAttribute and @SessionAttribute in SpringSpring 中的 @ModelAttribute 和 @SessionAttribute
【发布时间】:2012-04-15 03:55:27
【问题描述】:

作为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
     }
}

【问题讨论】:

标签: spring-mvc annotations modelattribute


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    会话属性将保存来自方法 createForm 的 @ModelAttribute("form") 的值。

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 其实Spring中有两个注解名称相似:\@SessionAttributes(用于类级别)和\@SessionAttribute(用于参数,因为它有\@Target(ElementType.PARAMETER)) . \@SessionAttributes 定义了模型中应该存储在会话或某些会话存储中的会话属性的名称。 \@SessionAttribute 将会话属性绑定到参数(Spring 从会话中获取对象并作为参数提供给方法)。这个问题的作者在类级别错误地使用了\@SessionAttribute(或者它必须是错字)。
      猜你喜欢
      • 2013-04-14
      • 1970-01-01
      • 2016-02-25
      • 2011-03-03
      • 1970-01-01
      • 2014-05-04
      • 2012-01-01
      • 2011-11-06
      • 1970-01-01
      相关资源
      最近更新 更多