18.7 @ModelAttribute

18.7 @ModelAttribute

前面谈到Spring MVC在每次调用请求处理方法时,都会创建Model类型的一个实例。若打算使用该实例,则可以在方法中添加一个Model类型的参数。事实上,还可以使用在方法中添加ModelAttribute注解类型来访问Model实例。该注解类型也是org.springframework. web.bind.annotation包的成员。

可以用@ModelAttribute来注解方法参数方法。带@ModelAttribute注解的方法会将其输入的或创建的参数对象添加到Model对象中(若方法中没有显式地添加)。例如,Spring MVC在每次调用submitOrder方法时创建一个Order实例

1
2
3
4
5
6
7
8
9
@RequestMapping(
method = RequestMethod.POST
)
public String submitOrder(
@ModelAttribute("newOrder") Order order,
Model model)
{
...
}

输入或创建的Order实例将用newOrder键值添加到Model对象中。如果未定义键值名,则将使用该对象类型的名称。例如,每次调用如下方法,会使用键值orderOrder实例添加到Model对象中:

1
2
public String submitOrder(
@ModelAttribute Order order, Model model)

@ModelAttribute的第二个用途是标注一个非请求的处理方法@ModelAttribute注解的方法会在每次调用该控制器类的请求处理方法时被调用。这意味着,如果一个控制器类有两个请求处理方法,以及一个有@ModelAttribute注解的方法,该方法的调用就会比每个处理请求方法更频繁。
Spring MVC会在调用请求处理方法之前调用带@ModelAttribute注解的方法。@ModelAttribute注解的方法可以返回一个对象或一个void类型。如果返回一个对象,则返回对象会自动添加到Model

1
2
3
4
5
6
@ModelAttribute
public Product addProduct(
@RequestParam String productId)
{
return productService.get(productId);
}

若方法返回void,则还必须添加一个Model类型的参数,并自行将实例添加到Model中。如下面的例子所示:

1
2
3
4
5
@ModelAttribute
public void populateModel(
@RequestParam String id, Model)
model.addAttribute(new Account(id));
}