@ModelAttribute方法和放入ModelAndView之间有区别吗?

时间:2015-10-29 13:55:27

标签: spring-mvc

这两者之间是否存在差异,它们都将变量暴露给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;

}

2 个答案:

答案 0 :(得分:1)

主要区别在于一个是方法注释,另一个是语句。

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

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

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

    我认为
  1. 语句是通常的方式,因为您很少会为特定控制器处理的所有类型的请求公开相同的对象
  2. 方法返回值的注释,如您的示例所示,是一种很好的方式来公开所谓的引用数据,如documentation中所述 - 例如,假设您有一个HTML <select> in一个表单,你想在控制器中提供<option>的列表,因为它们必须来自从JPA存储库中检索到的一些数据 - 这是我以前使用它的方式;因为控制器处理的每种类型的请求通常都需要这种数据(假设控制器与某种形式相关),它会使处理程序方法不再重复地将相同的参考数据添加到视图模型
  3. 如前所述,
  4. 方法参数的注释通常用于表单传输对象(即其字段包含表单数据的bean类) - 在表单视图处理程序方法中,然后使用参数在它上面,并在表单提交处理程序方法中,您使用带有@ModelAttribute类型参数的BindingResult带注释的参数

答案 1 :(得分:0)

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

@ModelAttribute你也可以像参数

一样使用它

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