@ModelAttribute
注解将请求参数绑定到Model
对象,只支持一个value
属性,类型是String
。
该注解的方法会在所有Controller方法执行前执行,所在一个Controller映射多个URL
时,谨慎使用。个人认为该注解有些鸡肋。
@ModelAttribute 注解指定的属性名的值是该注解方法的返回值。没有指定属性名,属性名默认是方法的返回参数类型的首字母小字单词。如:如返回是 String,则属性名是 string; Integer 类型的属性名是 integer。
Controller 方法可以使用ModelMap
根据 **key(@ModelAttribute指定的属性名)**从 Model 中取值。可以单作参数传递使用。
下面示例代码Controller类映射地址:@RequestMapping("/user")
。
@ModelAttribute有返回值
- 发送请求:http://localhost/user/login?loginName=admin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
@ModelAttribute public String modelAttr(@RequestParam("loginName")String account) { return account; }
@ModelAttribute("name") public String userModel(@RequestParam("loginName") String account,Model model) { return account; }
@RequestMapping("/login") public String login(ModelMap modelMap) { String account = (String) modelMap.get("name"); User user = new User(); user.setAccount(account); modelMap.addAttribute("user", user); return "userList"; }
|
@ModelAttribute没有返回值
- 发请求:http://localhost/user/login?loginName=admin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
@ModelAttribute public void userModel1( @RequestParam("loginName")String account, @RequestParam("password")String password, Model model) { model.addAttribute("account", account); model.addAttribute("password", password); }
@RequestMapping("/login1") public String login1() { return "userList"; }
|
@ModelAttribute返回对象
- 发请求:http://localhost/user/login2?loginName=admin&password=112233
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
@ModelAttribute public User userModel2( @RequestParam("loginName")String account, @RequestParam("password")String password, Model model ) { User user = new User(); user.setAccount(account); user.setPassword(password); return user; }
@RequestMapping("/login2") public String login2(Model model) { return "userList"; }
|
@ModelAttribute注解方法参数
@ModelAttribute属性值与Controller方法绑定。
在 Controller 方法里使用 @ModelAttribute注解形参,形参的值是 @ModelAttribute的注解方法的返回值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
@ModelAttribute("user") public User userModel4(@RequestParam("loginName")String account,String password) { User user = new User(); user.setAccount(account); user.setPassword(password); return user; }
@RequestMapping("/login3") public String login3(@ModelAttribute("user")User user, Model model) { user.setRealName("管理员"); return "userList"; }
|
与@RequestMapping一起使用
首先强调:不建议这么使用,阅读性很差,类的地址映射会成为定位jsp的目录路径。
@ModelAttribute和**@RequestMapping**一起使用,同时作用在方法上,方法返回的就不是视图名了,是 @ModelAttribute 属性名的属性值, @RequestMapping 的映射路径就变成了视图名。
- 发请求:http://localhost/userList
1 2 3 4 5 6 7 8 9 10 11
|
@ModelAttribute("loginName") @RequestMapping("/userList") public String login3(Model model) { return "admin"; }
|