Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc @modeldattribute方法和放入ModelAndView之间有区别吗?_Spring Mvc - Fatal编程技术网

Spring mvc @modeldattribute方法和放入ModelAndView之间有区别吗?

Spring mvc @modeldattribute方法和放入ModelAndView之间有区别吗?,spring-mvc,Spring Mvc,这两者之间有什么区别吗?它们都向JSP公开变量。第一个是用@modeldattribute标记的方法。第二个将所需对象放入模型和视图中。JSP的目标是检索这个变量 (一) (二) 在你使用它们的方式上,它们是相同的。@Model属性将对象添加到模型中。您可以从视图中访问它 @ModelAttribute也可以像参数一样使用它 主要区别在于一个是方法注释,另一个是语句 这意味着其他事情。注释将为控制器处理的每个请求公开对象,除非抛出异常并触发异常处理程序。该语句只适用于它在中声明的处理程序方法 当

这两者之间有什么区别吗?它们都向
JSP
公开变量。第一个是用
@modeldattribute
标记的方法。第二个将所需对象放入
模型和视图中。JSP的目标是检索这个变量

(一)

(二)


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

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


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

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

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

至于一些主观的、固执己见的建议:

  • 我想,语句是通常的方式,因为您很少希望为特定控制器处理的所有类型的请求公开相同的对象
  • 方法返回值上的注释,如您的示例中所示,是公开所谓的引用数据的好方法,如中所述–例如。,假设您在表单中有一个HTML
    ,并且您希望在控制器中提供
    的列表,因为它们必须来自从JPA存储库检索到的一些数据–我以前就是这样使用它的;由于控制器处理的每种类型的请求通常都需要此类数据(前提是控制器与某种形式相关),因此它使处理程序方法不会重复向视图模型添加相同的引用数据
  • 如前所述,方法参数上的注释通常与表单传输对象(即字段包含表单数据的bean类)一起使用–在表单视图处理程序方法中,您可以单独使用参数,在表单提交处理程序方法中,您可以使用带
    BindingResult
    类型参数的
    @modeldattribute
    注释参数
  • @ModelAttribute("store_location_types")
    public StoreLocationType[] getStoreLocationTypes() {
        return StoreLocationType.values();
    }
    
    public ModelAndView handlePage(Model m) {
    
        ModelAndView mav = new ModelAndView("my.jsp");
        mav.addObject("store_location_types", StoreLocationType.values();
        //...
         return mav;
    
    }