首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring MVC @ModelAttribute方法

Spring MVC @ModelAttribute方法
EN

Stack Overflow用户
提问于 2014-07-29 16:57:10
回答 2查看 32.5K关注 0票数 15

关于Spring MVC @ModelAttribute方法的问题,在控制器@RequestMapping方法中设置模型属性与使用@ModelAttribute方法单独设置属性相比,哪个被认为更好,使用更多?

从设计的角度来看,从以下几个方面考虑哪种方法更好:

方法1

代码语言:javascript
复制
@ModelAttribute("message")
public String addMessage(@PathVariable("userName") String userName, ModelMap model) {

  LOGGER.info("addMessage - " + userName);
  return "Spring 3 MVC Hello World - "  + userName;
}

@RequestMapping(value="/welcome/{userName}", method = RequestMethod.GET)
public String printWelcome(@PathVariable("userName") String userName, ModelMap model) {

  LOGGER.info("printWelcome - " + userName);
  return "hello";
}   

方法2

代码语言:javascript
复制
@RequestMapping(value="/welcome/{userName}", method = RequestMethod.GET)
public String printWelcome(@PathVariable("userName") String userName, ModelMap model) {

  LOGGER.info("printWelcome - " + userName);

  model.addAttribute("message", "Spring 3 MVC Hello World - "  + userName);

  return "hello";
}   
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-29 18:00:20

其中一个并不比另一个更好。它们都有另一个目的。

  • Method:如果您需要特定控制器的模型始终填充某些属性,则当您想要绑定来自请求的数据并隐式地将其添加到模型中时,方法级别的@ModelAttribute会使更多的sense.
  • Parameter:在参数上使用它。

回答你关于更好的方法的问题

我会说方法2更好,因为数据是特定于该处理程序的。

票数 14
EN

Stack Overflow用户

发布于 2014-07-29 17:10:54

@ModelAttribute annotation有两个用途,具体取决于其使用方式:

方法级的

在方法级别使用@ModelAttribute为模型提供参考数据。@ModelAttribute注释的方法在选择的@RequestMapping注释的处理程序方法之前执行。它们有效地使用特定属性预先填充隐式模型,这些属性通常是从数据库加载的。这样的属性已经可以通过所选处理程序方法中的带@ModelAttribute注释的处理程序方法参数进行访问,可能会对其应用绑定和验证。

换句话说,使用@ModelAttribute注释的方法将填充模型中指定的“键”。这发生在方法参数级别的@RequestMapping之前

方法参数级别的

当您将@ModelAttribute放在方法参数上时,@ModelAttribute会将模型属性映射到特定的带注释的方法参数。这就是控制器如何获得对保存在表单中输入的数据的对象的引用。

示例

方法级

代码语言:javascript
复制
@Controller
public class MyController {
    @ModelAttribute("productsList")
    public Collection<Product> populateProducts() {
        return this.productsService.getProducts();
    }
   }

因此,在上面的示例中,在执行@RequestMapping之前填充了模型中的“productsList”。

方法参数级

代码语言:javascript
复制
@Controller
public class MyController {
    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(@ModelAttribute("product") Product myProduct, BindingResult result, SessionStatus status) {

        new ProductValidator().validate(myProduct, result);
        if (result.hasErrors()) {
            return "productForm";
        }
        else {
            this.productsService.saveProduct(myProduct);
            status.setComplete();
            return "productSaved";
        }
    }
}

有关示例的详细信息,请查看。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25011568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档