@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