八、请求处理之自定义类型参数绑定原理

请求处理之自定义类型参数绑定原理

  这篇我们学习自定义参数绑定的原理,同样,先来做一个测试,有如下一个表单,表单对应下边两个类的属性,发送 saveuser 请求测试一下

/**
 *     姓名: <input name="userName"/> <br/>
 *     年龄: <input name="age"/> <br/>
 *     生日: <input name="birth"/> <br/>
 *     宠物姓名:<input name="pet.name"/><br/>
 *     宠物年龄:<input name="pet.age"/>
 */

@Data
public class Person {
    
    private String userName;
    private Integer age;
    private Date birth;
    private Pet pet;
    
}

@Data
public class Pet {

    private String name;
    private String age;

}

/**
     * 数据绑定:页面提交的请求数据(GET、POST)都可以和对象属性进行绑定
     * @param person
     * @return
     */
    @PostMapping("/saveuser")
    public Person saveuser(Person person){

        return person;
    }

在这里插入图片描述
可以看到,我们提交的数据和对象自动就绑定包装好了

接下来,我们就是来探索它的原理是什么,走起…

照样前边分析过的不在赘述,直接看它获取的是哪个参数解析器

HandlerMethodArgumentResolverComposite.classgetArgumentResolver 方法,debug发现它拿到的是 ServletModelAttributeMethodProcessor ,也就是说,自定义类型的参数,我们用这个处理器

在这里插入图片描述
在这里插入图片描述
拿到了参数解析器,我们来看它如何处理

step into 来到 ModelAttributeMethodProcessor.classresolveArgument 方法,前边一系列判断之后,调用了 createAttribute() 方法,这个方法为我们创建了一个空Person对象

在这里插入图片描述
然后就是进行绑定,利用 WebDataBinder 将请求中的所有数据,绑定到指定的JavaBean里边
在这里插入图片描述
在这里插入图片描述
WebDataBinder 利用它里面的 Converters 将请求数据转成指定的数据类型。然后封装到JavaBean中

在这里插入图片描述
bindRequestParameters 方法中,利用反射,获取我们请求里边的每一个参数值,然后找到我们JavaBean中的属性,将值封装到属性里边

在这里插入图片描述
进入bind()方法
在这里插入图片描述
进入doBind()方法
在这里插入图片描述
用我们的属性值
在这里插入图片描述
省略中间一些包装,到下边方法里边,就行转换器转换
在这里插入图片描述
用我们的转换器 Converter 转换好后,最后设置到JavaBean属性中,这就是们自定义类型参数绑定原理

如果你想要将传来的字符串,按照你的方式转换,也可以定制化 Converter , 方法就是给容器中放入自己的 WebMvcConfigurer ,重写里边的 addFormatters 方法,在里边添加自己的 Converter规则,快去试试吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anton丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值