SpringMVC确定目标方法POJO类型入参的过程

	/**
	 * 1:由@ModelAttribute标记的方法,会在每个目标方法执行前被springMVC调用
	 * 2:@ModelAttribute注解也可以来修饰目标方法POJO的入参,其value属性值有如下作用:
	 * 1)SpringMVC会使用value属性值在implicitModel中查找对应的对象,若存在,则会直接传入到目标方法的入参
	 * 2)SpringMVC会以value为key,POJO类型的对象为value,存入到request中
	 * @param id
	 * @param map
	 */
	@ModelAttribute
	public void getUser(@RequestParam(value="id",required=false) Integer id,
			Map<String, Object> map) {
		System.out.println("@ModelAttribute被调用");
		if(id!=null) {
			User user=new User("Tom", "123456", "12@123", "12", "1");
			System.out.println("从数据库中获取一个对象:"+user);
			map.put("abc",user);
		}
	}
	/**
	 * 运行流程
	 * 1:执行@ModelAttribute修饰的方法:从数据库中取出对象,把对象放入Map中,键为user
	 * 2:SpringMVC从map中取出user对象,并把表单的请求参数赋给该User对象的对应属性
	 * 3:SpringMVC把上述对象传入目标方法的参数
	 * 
	 * 注意:在@ModelAttribute修饰的方法中,放入Map时的键需要跟目标方法入参类型的第一个字母小写的字符串一致
	 * 
	 * SpringMVC确定目标方法POJO类型入参的过程
	 * 1:确定key
	 * 1)若目标方法的POJO类型参数没有使用@ModelAttribute,则key为POJO类名的第一个字母小写
	 * 2)若使用了@ModelAttribute,则为@ModelAttribute的value属性值
	 * 2:在implicitModel中查找key对应的对象,若存在,则作为入参传入(若在@ModelAttribute标记的方法中保存过,且key和1确定的key一致,则会获取到),
	 * 若不存在key对应的对象,则检查当前的Handler是否使用
	 * @SessionAttributes修饰,若使用了该注解,且该注解的value属性值中包含了key,则会从HttpSession中获取key对应的属性值,
	 * 若存在,则直接传入目标方法的入参,若不存在,则抛出异常
	 * 3:若Handler没有标识@SessionAttributes,或该注解的value值中不包含key,则会 通过反射创建POJO类型的参数,传入为目标方法
	 * 的参数
	 * 4:SpringMVC会把key和POJO类型对象保存到implicitModel中,进而会保存到request中
	 * 
	 * 
	 * 源码分析流程:
	 * 1:调用@ModelAttribute修饰的方法,实际上把@ModelAttribute 方法中map中的数据放在了implicitModel中。
	 * 2:解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性
	 * 1)创建WebDataBinder对象
	 * ①确定objectname属性:若传入的attrName属性值为"",则objectName为类名第一个字母小写的字符串
	 * 注意:attrName若目标方法的POJO属性使用了@ModelAttribute来修饰,则attrName值即为@ModelAttribute的value属性值
	 * ②确定target属性:
	 * > 在implicitModel中查找attrName对应的属性值,若存在,则OK;若不存在,则验证当前Handler是否使用了@SessionAttributes修饰,若使用了,
	 * 则尝试从session中获取attrName对应的属性值,若session中没有对应的属性值,则抛出异常
	 * >若Handler中没有使用@SessionAttributes进行修饰或@SessionAttributes中没有使用value值指定的键和attrName相互匹配,则通过反射创建POJO对象
	 * 2)SpringMVC把请求表单的请求参数赋给了WebDataBinder对应的属性
	 * 3)SpringMVC会把WebDataBinder的attrName和target给到implicitModel,进而传到request域对象中
	 * 4)把WebDataBinder的target作为参数传递给目标方法的入参
	 * @param user
	 * @return
	 */
	@RequestMapping("/testModelAttribute")
	public String testModelAttribute(@ModelAttribute("abc") User user) {
		System.out.println("修改:"+user);
		return SUCCESS;
	}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值