对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

模型

你可以使用 @ModelAttribute 注解:spring-doc.cadn.net.cn

  • xref page 方法的方法参数上, 用于从模型中创建或访问一个 Object,并通过 WebDataBinder 将其绑定到请求。spring-doc.cadn.net.cn

  • 作为 @Controller@ControllerAdvice 类中的方法级注解,用于在调用任何 @RequestMapping 方法之前帮助初始化模型。spring-doc.cadn.net.cn

  • @RequestMapping 方法上,用于标记其返回值是一个模型属性。spring-doc.cadn.net.cn

本节讨论@ModelAttribute方法——即前述列表中的第二项。 一个控制器可以包含任意数量的@ModelAttribute方法。所有这些方法都会在同一个控制器中的@RequestMapping方法之前被调用。@ModelAttribute方法还可以通过@ControllerAdvice在多个控制器之间共享。更多详情请参见控制器通知(Controller Advice)一节。spring-doc.cadn.net.cn

@ModelAttribute 方法具有灵活的方法签名。它们支持许多与 @RequestMapping 方法相同的参数,但不包括 @ModelAttribute 本身或任何与请求体相关的参数。spring-doc.cadn.net.cn

以下示例展示了一个 @ModelAttribute 方法:spring-doc.cadn.net.cn

@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {
	model.addAttribute(accountRepository.findAccount(number));
	// add more ...
}
@ModelAttribute
fun populateModel(@RequestParam number: String, model: Model) {
	model.addAttribute(accountRepository.findAccount(number))
	// add more ...
}

以下示例仅添加一个属性:spring-doc.cadn.net.cn

@ModelAttribute
public Account addAccount(@RequestParam String number) {
	return accountRepository.findAccount(number);
}
@ModelAttribute
fun addAccount(@RequestParam number: String): Account {
	return accountRepository.findAccount(number)
}
当未显式指定名称时,将根据 Object 类型选择一个默认名称,如 Conventions 的 Javadoc 中所述。 您始终可以通过使用重载的 addAttribute 方法,或通过 @ModelAttribute 上的 name 属性(针对返回值)来分配一个显式名称。

你也可以在 @ModelAttribute 方法上将 @RequestMapping 用作方法级别的注解, 此时 @RequestMapping 方法的返回值将被解释为模型属性。 这通常不是必需的,因为在 HTML 控制器中这是默认行为, 除非返回值是一个 String,否则该字符串会被解释为视图名称。 @ModelAttribute 还可以自定义模型属性的名称,如下例所示:spring-doc.cadn.net.cn

@GetMapping("/accounts/{id}")
@ModelAttribute("myAccount")
public Account handle() {
	// ...
	return account;
}
@GetMapping("/accounts/{id}")
@ModelAttribute("myAccount")
fun handle(): Account {
	// ...
	return account
}