Spring MVC @ModelAttribute方法

时间:2014-07-29 08:57:10

标签: spring-mvc modelattribute

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

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

方法1

@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

@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";
}   

2 个答案:

答案 0 :(得分:19)

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

在方法级别

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

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

在方法参数级别

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

<强>实施例

方法级别

@Controller
public class MyController {
    @ModelAttribute("productsList")
    public Collection<Product> populateProducts() {
        return this.productsService.getProducts();
    }
   }

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

方法参数级别

@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";
        }
    }
}

通过示例查看here以获取详细信息。

答案 1 :(得分:14)

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

  • 方法:如果您需要始终使用某些属性填充特定控制器的模型,则方法级@ModelAttribute更有意义。
  • 参数:如果要绑定请求中的数据并将其隐式添加到模型,请在参数上使用它。

回答关于更好方法的问题

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