数据类型转换和数据验证的流程
流程
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();
}

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

被折叠的 条评论
为什么被折叠?



