JSP页面代码: <form action="springmvc/ModelAttribute" method="POST"> <input type="hidden" name="id" value="1"/> age:<input type="text" name="age" value="22"/><br><br> username:<input type="text" name="username" value="Tom"/><br><br> email:<input type="text" name="email" value="tom@163.com"/><br><br> <input type="submit" value="Test ModelAttribute"> </form> 控制器层代码: @Controller @RequestMapping("/springmvc") //@SessionAttributes(value={"user"},types=String.class) public class SpringMVCTest02 { private static final String SUCCESS ="success"; /** * 18.测试@ModelAttribute注解 * @param user * @return */ @RequestMapping(value="/ModelAttribute",method=RequestMethod.POST) public String test18(UserBean user) { System.out.println("模拟需要进行修改的user对象:"+user); return SUCCESS; } @ModelAttribute public void getUser(@RequestParam(value="id",required=false) Long id, Map<String, Object> map) { if (id != null) { UserBean user = new UserBean(); user.setAge((short)21); user.setId(new Long(1)); user.setUsername("Jerry"); user.setPassword("123456"); user.setEmail("jerry@163.com"); System.out.println("模拟从数据库获取的User对象:"+user); map.put("user", user); } } } 这是控制台输出: 模拟从数据库获取的User对象:UserBean [id=1, age=21, email=jerry@163.com, username=Jerry, password=123456, address=null] 模拟需要进行修改的user对象:UserBean [id=1, age=22, email=tom@163.com, username=Tom, password=null, address=null] 需求是把获取到password赋值给为null的password
/**
* 18.测试@ModelAttribute注解
* @param user
* @return
*/
@RequestMapping(value="/ModelAttribute",method=RequestMethod.POST)
public String test18(UserBean user,Map<String,Object> map) {
String pwd=map.get("user1").getPassword();
user.setPassword(pwd);
System.out.println("模拟需要进行修改的user对象:"+user);
return SUCCESS;
}
@ModelAttribute
public void getUser(@RequestParam(value="id",required=false) Long id,
Map<String, Object> map) {
if (id != null) {
UserBean user = new UserBean();
user.setAge((short)21);
user.setId(new Long(1));
user.setUsername("Jerry");
user.setPassword("123456");
user.setEmail("jerry@163.com");
System.out.println("模拟从数据库获取的User对象:"+user);
map.put("user1", user);
}
}
这样不知道可以不可以....
/** * 18.测试@ModelAttribute注解: * 1.运行流程: * ① ModelAttribute注解修饰的方法从数据库中获取到对象的相关数据,把数据放入到Map中,键为:userBean. * ② SpringMVC从Map中取出UserBean对象,并把表单参数赋给该UserBean对象对应的属性 * ③ SpringMVC把上述对象传给目标方法的入参 * * 注意:@ModelAttribute修饰的方法中,放入到Map中的键和目标方法入参类型的第一个字母小写的字符串 * * 2.源码分析流程: * (1) 先调用被@ModelAttribute注解修饰的方法——把该方法中Map中的数据implicitModel中 * (2) 解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性 * ① 创建WebDataBinder对象: * > 确定objectName属性:如果传入的attrName的属性值为"",则objectName为类名的第一个字母小写; * 如果目标方法的POJO类参数使用@ModelAttribute来修饰,则attrName值为@ModelAttribute注解 * 的value属性的属性值 * > 确定target属性——在implicitModel中查找attrName对应的属性值:如果存在就放行;如果不存在则验证 * 当前控制器是否被@SessionAttributes修饰,如果是,则尝试从Session中获取attrName对应的属性值, * 如果Session中没有对应的属性就会抛出异常;如果当前控制器没有被@SessionAttributes修饰,或 * 在@SessionAttributes中没有使用value值指定的key和attrName匹配,则通过反射创建一个POJO * ② SpringMVC把表单请求的参数赋给了WebDataBinder的target对应的属性 * ③ SpringMVC会把attrName和target赋给implicitModel * ④ 把WebDataBinder的target作为参数传给目标方法的入参 * * 3.SpringMVC确定目标方法POJO入参的过程 * (1)确定一个key:在implicitModel中查找key对应的对象, * @param user * @return */ @RequestMapping(value="/ModelAttribute",method=RequestMethod.POST) public String test18(@ModelAttribute("user") UserBean user) { System.out.println("模拟需要进行修改的user对象:"+user); return SUCCESS; } @ModelAttribute public void getUser(@RequestParam(value="id",required=false) Long id, Map<String, Object> map) { if (id != null) { UserBean user = new UserBean(); user.setAge((short)21); user.setId(new Long(1)); user.setUsername("Jerry"); user.setPassword("123456"); user.setEmail("jerry@163.com"); System.out.println("模拟从数据库获取的User对象:"+user); map.put("user", user); } }