spring 中@ModelAttribute、model.addAttribute 有啥区别?

Posted

技术标签:

【中文标题】spring 中@ModelAttribute、model.addAttribute 有啥区别?【英文标题】:What is the difference between @ModelAttribute, model.addAttribute in spring?spring 中@ModelAttribute、model.addAttribute 有什么区别? 【发布时间】:2014-06-27 21:04:54 【问题描述】:

我是新的 Spring 学习者。我真的很困惑这两个概念之间的区别:

    @ModelAttribute model.addAttribute

在下面有两个“用户”值。它们是同一个东西吗?我为什么要这样使用? 谢谢大家

@RequestMapping(method = RequestMethod.GET)
public String setupForm(ModelMap model) 
    model.addAttribute("user", new User());
    return "editUser";


@RequestMapping(method = RequestMethod.POST)
public String processSubmit( @ModelAttribute("user") User user, BindingResult result, SessionStatus status) 
    userStorageDao.save(user);
    status.setComplete();
    return "redirect:users.htm";

【问题讨论】:

【参考方案1】:

当用于参数时,@ModelAttribute 的行为如下:

方法参数上的@ModelAttribute 表示应从模型中检索该参数。如果模型中不存在,则应首先实例化参数,然后将其添加到模型中。一旦出现在模型中,参数的字段应该从具有匹配名称的所有请求参数中填充。这在 Spring MVC 中称为数据绑定,这是一种非常有用的机制,可以让您不必单独解析每个表单字段。 http://docs.spring.io/spring/docs/4.1.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#mvc-ann-modelattrib-method-args

这是一个非常强大的功能。在您的示例中,用户对象由 Spring 自动从 POST 请求中填充。

然而,第一种方法只是创建一个User 的实例并将其添加到模型中。可以这样写来受益于@ModelAttribute:

@RequestMapping(method = RequestMethod.GET)
public String setupForm(@ModelAttribute User user) 
    // user.set...
    return "editUser";

【讨论】:

谢谢你的评论更清楚了。所以我们使用模型属性从jsp文件中获取数据并将数据发送到jsp文件我们使用模型并从处理程序返回modelandview,对吧? 您可以在这两种情况下使用 ModelAttribute,因为它将属性放在请求范围内,以便它们在 jsp 上下文中可用。在这里继续只返回视图名称或重定向为字符串就足够了。

以上是关于spring 中@ModelAttribute、model.addAttribute 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

spring中form标签中modelAttribute和commandName属性的区别?

Spring - @ModelAttribute注解的使用

Spring MVC @ModelAttribute 作为方法参数注解

spring学习之@ModelAttribute运用详解

Java Spring 多个 ModelAttribute

如何使用modelAttribute在ajax(jquery)中提交spring表单