您的位置:首页 > 编程语言 > Java开发

SpringMVC 4.0 @ModelAttribute 注解(附源码分析流程)

2017-07-21 14:15 441 查看
@Controller
public class Hello {

/**
* 该标记可以在调用其他函数的时候 先运行
* @ModelAttribute注解也可以用来修饰目标方法的POJO的入参,其属性值有如下作用:
* 1>SpringMVC会使用value属性值在implicitModel中查找对应的对象,若存在则会直接传入到目标方法的入参中
* 2>SrpingMVC会value为key,POJO的类型作为value,存入到request中
* @param id
* @param map
*/
@ModelAttribute
public void getUser(@RequestParam(value="id",required=false) Integer id,
Map<String, Object> map){
if(null != id)
{
User user = new User();
map.put("user", user);
}
}

/**
* @ModelAttribute 注解执行流程
* 1.执行@ModelAttribute直接修饰的方法 springmvc 识别了方法里面的map参数
* 2.SpringMVC 从map中取出了User对象,并把表单的请求参数赋给User对象的对应属性
* 3.SpringMVC 把上述对象传入目标的参数 也就是带有User 的对应请求的方法中去 这样不用重新创建一个新的对象
*
* @param user
* @param request
* @param response
* @return forward
*/
@RequestMapping("/pojo")
public String pojo(User user, HttpServletRequest request,
HttpServletResponse response) {

request.setAttribute("user", user);
System.out.println("pojo" + user);
return "pojo";
}

}


表单

<form action="pojo">
username:<input type="text" name="username"></input><br/>
<!--password:<input type="password" name="password"></input><br/>  -->
phone:<input type="hidden" name="phone" value="123456"></input><br/>
city:<input type="text" name="address.city"></input><br/>
province:<input type="text" name="address.province"></input><br/><br/>
<input type="submit" name="提交"/>
</form>


源码分析(反正也没人来看这里的分析)

一.调用@ModdelAttribute 注解修饰的方法,实际上把@ModdelAttribute方法中Map的数据放入到implictiModel中

二.解析请求处理器的目标参数,实际上该目标参数来自于,WebDataBinder对象的target属性

1.创建WebDataBinder对象 :

1>.确定objectName属性:若传入的attrName 属性值为空串“”,则objectName为类名第一
个字母小写,注意:attrName 若目标方法的POJO属性使用了@ModelAttribute来修饰,则
attrName 值即为@ModelAttribute的value属性值


2>.确定traget属性:在implicitModel中查找attrName对应的值,若存在可获取,若不存
在:验证当前Handler是否使用了@SessionAttribute 进行修饰,若使用了,则尝试从
Session中获取attrName所对应的属性,若session中没有对应的属性值则会抛出异常。若
Handler没有使用@SessionAttributes进行修饰,或@SessionAttributes中没有使用
value值指定key和attrName相匹配,则通过反射创建了POJO对象


2.SpringMVC把表单的请求赋值给了WebDataBinder的target对应属性。

3.SpringMVC会把WebDataBinder的attrName和target给到implicitModel

4.把WebDataBinder的target作为参数传递给目标方法的入参

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  源码 spring mvc