@ModelAttribute可以作用在方法或者方法的参数
注:被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
一、作用在方法上
1.@ModelAttribute注释void返回值的方法
此时给@ModelAttribute设置value是没作用的,他用在有返回值的情况下
@ModelAttribute
public void getColor(Model model){
model.addAttribute("yello");//这句将给model中添加一条key:string value:yello
model.addAttribute(1);//这句将给model中添加一条key:integer value:1
}
2.@ModelAttribute注释返回具体类的方法
@ModelAttribute("name")
public String getColor(Model model){
model.addAttribute("yello");//这句将给model中添加一条key:string value:yello
return "color";
}
解释:若@ModelAttribute没有设置value=name,那么return "color";这句将给model中添加一条key:string value=color,这个key是根据返回值类型来的
若@ModelAttribute设置value=name,那么return "color";这句将给model中添加一条key:name value=color
二、作用在方法的参数上
1.对象合并
@ModelAttribute
public User getUser(){
User user = new User();
user.setName("winclpt");
user.setSex("男");
user.setAge(25);
return user;
}
@RequestMapping("update")
public void update(User user){//此处的user来自上面
user.setSex("女");
System.out.println(user.toString());
}
结果:User [name=winclpt, sex=女, age=25]
2.对象合并指定对象名称
@ModelAttribute("MyUser")
public User getUser(){
User user = new User();
user.setName("winclpt");
user.setSex("男");
user.setAge(25);
return user;
}
@RequestMapping("update")
public void update(@ModelAttribute("MyUser") User user){
System.out.println(user.toString());
}
结果:User [name=winclpt, sex=女, age=25]
3.如果你的方法参数里带有@ModelAttribute的参数.表示从JSP Page传回的参数并自动的转化为java对象 ,在转换的时候先匹配@ModelAttribute生成的model中匹配属性进行java对象转换,最后再将JSP Page传过来的参数匹配后赋值给java对象属性
Controller代码如下:
@Controller
@RequestMapping("test")
public class TestController {
@ModelAttribute("MyUser")
public User getUser(){
User user = new User();
user.setName("winclpt");
user.setSex("男");
user.setAge(25);
return user;
}
@RequestMapping("update")
public void update(@ModelAttribute("MyUser") User user){
System.out.println(user.toString());
}
@RequestMapping("index")
public String index(){
return "index";
}
}
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE>
<html>
<head>
<title>spring mvc</title>
</head>
<body>
<h3>modelattrubie</h3>
<form method="post" action="/springweb/test/update">
<label>年龄:</label><input type="text" name="age" value="${user.age }"/>
<input type="submit" value="更改"/>
</form>
</body>
</html>
当表单提交的时候,进入/springweb/test/update,参数中的user来自@ModelAttribute("MyUser"),页面传过来的age属性覆盖原有的user.age
所以结果如下:User [name=winclpt, sex=男, age=334]
三、ModelAttribute和RequestMapping同时作用在一个方法
@Controller
@RequestMapping("test")
public class TestController {
@RequestMapping("winclpt")
@ModelAttribute
public String doTest(){
return "winclpt";
}
这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称由RequestToViewNameTranslator根据请求"/test/winclpt"转换为逻辑视图/test/winclpt.jsp
