【问题标题】:Is there a difference between a @ModelAttribute Method and Putting Into ModelAndView?@ModelAttribute 方法和放入 ModelAndView 之间有区别吗?
【发布时间】:2015-10-30 02:58:56
【问题描述】:

这两者之间有什么区别,它们都将变量暴露给JSP。第一个是用@ModelAttribute 标记的方法。第二个将所需的对象放入ModelAndView。目标是让JSP 检索此变量。

1)

@ModelAttribute("store_location_types")
public StoreLocationType[] getStoreLocationTypes() {
    return StoreLocationType.values();
}

2)

public ModelAndView handlePage(Model m) {

    ModelAndView mav = new ModelAndView("my.jsp");
    mav.addObject("store_location_types", StoreLocationType.values();
    //...
     return mav;

}

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    主要区别是一个是方法注解,一个是语句。

    这意味着其他事情。注释将为控制器处理的每个请求公开您的对象,除非将引发异常并触发异常处理程序。该语句仅适用于它声明的处理程序方法。

    当然,还有另一种使用注解的方式:在方法参数上,这也是处理 HTML 表单传输对象的常用方式。

    至于一些主观的、自以为是的建议:

    1. 声明是,我猜,通常的方式,因为你很少愿意为特定控制器处理的所有类型的请求公开相同的对象
    2. 方法返回值上的注释,如您的示例,是公开所谓的参考数据的好方法,如documentation 中所述 - 例如,假设您在表单中有一个 HTML <select>,并且您想要在控制器中提供<option>s 的列表,因为它们必须来自从 JPA 存储库中检索到的一些数据——这就是我过去使用它的方式;由于控制器处理的每种类型的请求通常都需要这种数据(假设控制器与某种形式相关),因此它可以使您的处理程序方法避免重复向视图模型添加相同的引用数据
    3. 如前所述,方法参数上的注释通常与表单传输对象(即其字段包含表单数据的 bean 类)一起使用——然后在 form view 处理程序方法中使用该参数就其本身而言,在 表单提交 处理程序方法中,您遵循带有 BindingResult 类型参数的 @ModelAttribute 注释参数

    【讨论】:

      【解决方案2】:

      在您使用它们的方式上,它们是相同的。 @ModelAttribute 将对象添加到模型中。您可以从视图中访问它。

      @ModelAttribute 你也可以像参数一样使用它

      http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib-method-args

      【讨论】:

        猜你喜欢
        • 2017-07-23
        • 2012-09-06
        • 1970-01-01
        • 2014-04-01
        • 2012-02-16
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多