javaee论坛

普通会员

225648

帖子

98

回复

112

积分

楼主
发表于 2017-06-26 06:46:30 | 查看: 80 | 回复: 1
@ModelAttribute可用在方法或方法参数中。
在方法上使用@ModelAttribute注解,表示此方法的目的在于添加一个或多个模型属性。这种方法所支持的参数类型与@RequestMapping一样,不同的是,它不能直接映射到request。另外,在同一个控制器里,@ModelAttribute会在@RequestMapping之前调用。如:

< class="ttyprint">// 添加一个属性// 方法的返回值会以 "account"键添加到model// 可通过@ModelAttribute("myAccount")自定义@ModelAttributepublic Account addAccount(@RequestParam String number) { return accountManager.findAccount(number);}// 添加多个属性@ModelAttributepublic void populateModel(@RequestParam String number, Model model) { model.addAttribute(accountManager.findAccount(number)); // 再添加多个……}

@ModelAttribute 用来将常用属性填充到模型里。
上面展示了@ModelAttribute方法的两种使用方式。第一种,在方法里隐式添加一个属性并返回;第二种,方法里接收Model参数,并将任意个属性添加到Model中。

一个控制器可以有多个@ModelAttribute方法。在同一个控制器中,所有@ModelAttribute方法都会在@RequestMapping方法之前调用。因此对于一个controller映射多个URL的用法来说,要谨慎使用。
有一个比较常见的用法,是把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。比如验证,比如权限。

当模型属性名称没有显式定义时,默认使用参数类型名称作为模型属性名称。如上例中,当方法返回 Account 对象时,其默认的模型属性名称是”account”。我们也可以通过设置@ModelAttribute注解的 “value” 属性来自定义。

@ModelAttribute 注解也可用在 @RequestMapping 方法中。这种情况下,@RequestMapping 方法的返回值将解析为模型属性,而不是视图名称。

在方法参数上使用@ModelAttribute

@ModelAttribute注解的方法参数,表示该参数会从Model中查找。如果该参数不在Model中,此参数会先执行初始化然后添加到Model里;如果参数存在Model里,此参数字段会填充所有匹配其名称的请求参数。这就是大家熟知的Spring MVC数据绑定。

< class="ttyprint">@PostMapping("/owners/{ownerId}/pets/{petId}/edit")public String processSubmit(@ModelAttribute Pet pet) { }

上述所给例子,Pet实例可以在哪里获取?有以下几种选择:
- 如果使用了@SessionAttributes,那Pet实例就已经存到Model里了,可直接从Model中获取。
- 如果同一个控制器里有@ModelAttribute方法,可能已经把Pet实例存到模型里了,可直接从Model中获取。
- 可以从URI模版变量和类型转换器获取
- 可以使用默认构造器初始化


普通会员

0

帖子

27

回复

29

积分
沙发
发表于 2022-05-11 03:25:04

围观

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017