Spring MVC之@ModelAttribute
@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/**
* 没有指定属性名,属性名默认是方法的返回参数类型的首字母小字单词
* 如返回是String,则属性名是string; Integer类型的属性名是integer
* @param account
* @param model
* @return
*/
//string = account
public String modelAttr( String account){
return account;
}
/**
* 请求参数值绑定指定的属性名
* @param account
* @param model
* @return
*/
//name = account
public String userModel( String account,Model model){
return account;
}
/**
* modelMap根据绑定的属性名取出参数值
* @param model
* @return
*/
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/**
* 提前执行,把参数封装到Model对象中
* Controller方法页面也能取的该Model里面的值
* @param account
* @param password
* @param model
*/
public void userModel1(
String account,
String password,
Model model) {
model.addAttribute("account", account);
model.addAttribute("password", password);
}
//可以@ModelAttribute存到Model的值
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/**
* 返回对象类型,没指定属性名,隐式属性名是返回的对象名小写单词
* @param account
* @param password
* @param model
* @return
*/
public User userModel2(
String account,
String password,
Model model
) {
User user = new User();
user.setAccount(account);
user.setPassword(password);
return user;
}
//可以取到@ModelAttribute 封装到Model的值
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属性与Controller方法绑定
* @param account
* @param password
* @return
*/
public User userModel4( String account,String password){
User user = new User();
user.setAccount(account);
user.setPassword(password);
return user;
}
/**
* user值是@ModelAttribute("user")方法的返回值。
* 该方法的user对象与@ModelAttribute("user")方法的返回值绑定
* @param user
* @param model
* @return
*/
public String login3( 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/**
* 不建议这么使用,阅读性很差,类的地址映射会成为定位jsp的目录路径
* URL [/WEB-INF/jsp/user/userList.jsp],user是类映射路径
* @param model
* @return
*/
//属性名:loginName
//视图名:userList
public String login3(Model model) {
return "admin"; //属性值:admin
}
Spring MVC之@ModelAttribute
http://blog.gxitsky.com/2018/01/12/SpringMVC-16-modelattribute/