ModelAttribute注解是SpringMVC中用来修饰控制器方法的一个标签,有ModelAttribute注解的方法将在所有控制器映射方法之前执行。它的主要使用场景和作用是:当从浏览器的表单返回的实体类数据缺失,不完整的时,我们用该方法对获取的数据进行预处理,确保缺失数据的字段能够使用数据库对象原来的数据。注意ModelAttribute注解方法只对缺失数据进行补充,而不会改变从浏览器返回的字段的数据内容。
举例:
public class User implements Serializable {
private String nickName;
private Integer age;
private Date birthday;
}
<%-- ModelAttribute注解--%>
ModelAttribute注解<br>
<form action="/formTest/getModelAttribute" method="post">
username:<input type="text" name="nickName"><br>
password:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
如上图所示,浏览器并没有返回Date类型的数据。那么此时我们通常这样写控制器方法:
/**
* 测试@ModelAttribute注解
* @return
*/
@RequestMapping(value = "/getModelAttribute",method = RequestMethod.POST)
public String getModelAttribute(@ModelAttribute("user") User user){
System.out.println("getModelAttribute");
System.out.println(user.toString());
return "success";
}
/**
* 若注解方法,则该方法会在所有的@RequestMapping方法之前执行。
*
* @return
*/
@ModelAttribute
//这是有返回值的@方法
// public User showUser(String nickName){
// System.out.println("showUser....");
// //通过nickName查询数据库(模拟)
// User user = new User();
// user.setNickName(nickName);
// user.setAge(20);
// user.setBirthday(new Date());
// //当我们根据数据库对象的原数据进行修正之后,返回的user将被接下来的映射处理方法的参数获得,注意变量名要相同
// //它只会把我们获取对象中不存在的内容,缺失的字段进行补充,不影响浏览器传回的值
// return user;
//
// }
//这是没有返回值的方法
//必须要将参数放入一个map结构,再由映射方法在参数前进行@ModelAttribute(key)的修饰来取出,这样变量名更灵活
public void showUser(String nickName, Map<String,User> map){
System.out.println("showUser....");
//通过nickName查询数据库(模拟)
User user = new User();
user.setNickName(nickName);
user.setAge(20);
user.setBirthday(new Date());
//当我们根据数据库对象的原数据进行修正之后,返回的user将被接下来的映射处理方法的参数获得,注意变量名要相同
//它只会把我们获取对象中不存在的内容,缺失的字段进行补充,不影响浏览器传回的值
map.put("user",user);
}
这里有两种写法,一种是带返回参数的方法,它的返回值类型和变量名必须和映射方法所要封装的类型和变量名完全相同,这样映射方法的封装参数将直接获取对应的变量名对象;另一种是不带返回参数的方法,它要求ModelAttribute方法带上一个Map类型的参数作为公共域,将对象放入公共域中,再在映射方法的参数前加上ModelAttribute(value/name = "key")来获取对象并赋值。
ModelAttribute修饰的方法,获取参数的过程和映射方法是一样的,它承担了一个预处理的工作,应用场景比较固定,想要进行其他预处理操作也可以。
同时ModelAttribute方法不会影响那些不需要该方法预处理的控制器映射方法的执行,即使ModelAttribute没有获取封装数据也不会影响后续方法的正常执行。