坐着竹筏漂流
2018-01-11 12:50
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);
}
}SpringMVC数据绑定入门
70563 学习 · 66 问题
相似问题