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

@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作为参数传递给目标方法的入参
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值