这一部分翻译自 Spring 5.0.0.M1 文档中的 Using @ModelAttribute on a method 一节。这一节的演示示例在这个项目的 mvc 分支中的 ModelAttrController.java 文件中。html
注解@ModelAttribute
能够用在方法或者方法参数上。这一节解释它用在方法上,下一节解释把它用在方法参数上。java
用在方法上的@ModelAttribute
指示那个方法的目的是添加一个或多个模型属性(model attributes)。这样的方法和@RequestMapping
方法支持的参数类型相同,可是不能直接映射到请求。在控制器中的@ModelAttribute
方法的调用时机是在同一个控制器中的@RequestMapping
方法以前。下面是几个例子:git
// 添加一个属性 // 这个方法的返回值被添加到名为 “account” 的模型下 // 你能够自定义这个名字,像这样 @ModelAttribute("myAccount") @ModelAttribute public Account addAccount(@RequestParam String number) { return accountManager.findAccount(number); } // 添加多个属性 @ModelAttribute public void populateModel(@RequestParam String number, Model model) { model.addAttribute(accountManager.findAccount(number)); // add more ... }
@ModelAttribute
方法用于构建带有经常使用属性的模型,好比用状态或者宠物类型填充一个下拉框,或者取回一个命令对象如 Account,把它用做 HTML 表单数据。后一种状况在下一节会进行更深刻的讨论。spring
注意,有两种形式的@ModelAttribute
方法。第一种,方法经过返回属性来隐式地添加属性。第二种,方法接受一个Model
参数,并把任何数量的属性添加给它。你能够根据须要选择其中的任何一种。mvc
一个控制器能够有任何数量的@ModelAttribute
方法。全部的这些方法都在同一个控制器中的@RequestMapping
方法以前调用。【很遗憾,我如今尚未找到关于一个控制器中有多个@ModelAttribute
方法时,这些方法的调用顺序的说明。之后找到的话会补上】app
@ModelAttribute
方法也能够定义在一个带有@ControllerAdvice
注解的类中,这些方法应用于不少控制器。详情参见“使用@ControllerAdvice
和@RestControllerAdvice
通知控制[2]”一节 .net
在不显式指定属性名的时候发生了什么?这种状况下,被赋值的模型属性的缺省名称是基于其类型的。好比,若是一个方法返回一个 Account 类型的对象的话,那么缺省名就是“account”。你能够经过注解@ModelAttribute
的值来改变。若是直接添加属性到模型的话,请使用合适的方法 addAttribute(..) 的重载。翻译
注解@ModelAttribute
也能够用在@RequestMapping
方法上。这种状况下,@RequestMapping
方法的返回值被拦截为一个模型属性,而不是一个视图名。关于视图,参见源文档的18.13.3节“视图——RequestToViewNameTranslator”。code