四、SpringMVC自定义类型数据转换

本文详细介绍了SpringMVC中数据类型转换和数据验证的流程,包括自定义属性编辑器进行数据绑定,如PhoneNumberEditor,以及通过@InitBinder、WebBindingInitializer、@ControllerAdvice等方式注册PropertyEditor。同时,文章探讨了使用PropertyEditor的局限性,并提出从Spring3开始,可以利用Converter、GenericConverter、ConverterFactory进行更灵活的类型转换、验证和格式化。最后,给出了自定义String到PhoneNumberModel转换器的示例。

数据类型转换和数据验证的流程

这里写图片描述
这里写图片描述

流程

1、首先创建数据绑定器,在此此会创建ServletRequestDataBinder类的对象,并设置messageCodesResolver(错误码解析器);
2、提供第一个扩展点,初始化数据绑定器,在此处我们可以覆盖该方法注册自定义的PropertyEditor(请求参数——>命令对象属性的转换);
3、进行数据绑定,即请求参数——>命令对象的绑定;
4、提供第二个扩展点,数据绑定完成后的扩展点,此处可以实现一些自定义的绑定动作;
5、验证器对象的验证,验证器通过validators注入,如果验证失败,需要把错误信息放入Errors(此处使用BindException实现);
6、提供第三个扩展点,此处可以实现自定义的绑定/验证逻辑;
7、将errors传入功能处理方法进行处理,功能方法应该判断该错误对象是否有错误进行相应的处理。

数据类型转换

请求参数(String)——>命令对象属性(可能是任意类型)的类型转换,即数据绑定时的类型转换,使用PropertyEditor实现绑定时的类型转换。
一、Spring内建的PropertyEditor如下所示:

类名 说明 默认是否注册
ByteArrayPropertyEditor String<——>byte[]
ClassEditor String<——>Class当类没有发现抛IllegalArgumentException
CustomBooleanEditor String<——>Booleantrue/yes/on/1转换为true,false/no/off/0转换为false
CustomCollectionEditor 数组/Collection——>Collection普通值——>Collection(只包含一个对象)如String——>Collection不允许Collection——>String(单方向转换)
CustomNumberEditor String<——>Number(Integer、Long、Double)
FileEditor String<——>File
InputStreamEditor String——>InputStream单向的,不能InputStream——>String
LocaleEditor String<——>Locale,(String的形式为[语言][国家][变量],这与Local对象的toString()方法得到的结果相同)
PatternEditor String<——>Pattern
PropertiesEditor String<——>java.lang.Properties
URLEditor String<——>URL
StringTrimmerEditor 一个用于trim 的 String类型的属性编辑器如默认删除两边的空格,charsToDelete属性:可以设置为其他字符emptyAsNull属性:将一个空字符串转化为null值的选项。 ×
CustomDateEditor String<——>java.util.Date ×

自定义的属性编辑器进行数据绑定

1.模型对象

public class PhoneNumberModel {
    private String areaCode;//区号
    private String phoneNumber;//电话号码

    public String getAreaCode() {
        return areaCode;
    }

    public void setAreaCode(String areaCode) {
        this.areaCode = areaCode;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

2.属性编辑器

PhoneNumberEditor

public class PhoneNumberEditor extends PropertyEditorSupport {
   
   
    Pattern pattern = Pattern.compile("^(\\d{3,4})-(\\d{7,8})$");

    @Override
    public String getAsText() {
        PhoneNumberModel phoneNumber = ((PhoneNumberModel) getValue());
        return phoneNumber == null ? "" : phoneNumber.getAreaCode() + "-" + phoneNumber.getPhoneNumber();
    }

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值