欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringMVC中数据绑定及自定义类型转换器

程序员文章站 2022-05-30 20:33:47
...

这篇博客记录一下SpringMVC中的数据绑定,以及如何自定义类型转换器

数据绑定

  • Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象.
  • DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数据格式化工作。将 Servlet 中的请求信息填充到入参对象中
  • 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果 BindingData 对象
  • ④Spring MVC 抽取 BindingResult 中的入参对象和校验错误对象,将它们赋给处理方法的响应入参

Spring MVC 通过反射机制对目标处理方法进行解析,将请求消息绑定到处理方法的入参中。数据绑定的核心部件是 DataBinder,运行机制如下:
SpringMVC中数据绑定及自定义类型转换器

自定义类型转换器

类型转换器概述

  • ConversionService 是 Spring 类型转换体系的核心接口。
  • 可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个
  • ConversionService. Spring 将自动识别出 IOC 容器中的 ConversionService,并在 Bean 属性配置及 Spring MVC 处理方法入参绑定等场合使用它进行数据的转换
  • 可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器
    例如:
<bean id="factoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
            	<!--将自定义的转换器类MyConverter注册到SpringMVC中-->
                <bean class="com.hu.converter.MyConverter"></bean>  
            </set>
        </property>
    </bean>

Spring 支持的转换器类型

Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到 ConversionServiceFactoryBean 中:
  • Converter<S,T>:将S类型对象转换为T类型对象
  • ConverterFactory:将多个Converter封装在一起。如果希望将一种类型的对象转换为另一种类型的及其子类的对象(例如将String转换为Number及Number子类(Integer、Long、Double等对象))可使用该转换器工厂类
  • GenericConverTer:会根据源类对象及目标类对象所在宿主类中的上下文信息进行类型转换

自定义转换器

创建一个实体类Employ
public class Employ {
    private String userName;
    private int age;
    private String hobby;
    private double salary;
    private double height;

    public Employ(String userName, int age, String hobby, double salary, double height) {
        this.userName = userName;
        this.age = age;
        this.hobby = hobby;
        this.salary = salary;
        this.height = height;
    }

    @Override
    public String toString() {
        return "employ{" +
                "userName='" + userName + '\'' +
                ", age=" + age +
                ", hobby='" + hobby + '\'' +
                ", salary=" + salary +
                ", height=" + height +
                '}';
    }

    public Employ() {
    }
    // get、set、toString方法省略
    ...
}

controller层
用SpringMVC默认的自定义类型转换器,如果前端通过超链接传递 path?xxx=XXX&yyy=YYY,SpringMVC会将参数自动封装到对象中

@RequestMapping("/testDataBinding")
    public String testBinding(Employ employ){
        System.out.println(employ);
        return "show";
    }

前端页面
使用这个超链接发送请求

<a href="/testDataBinding?userName=张三&age=123&hobby=打篮球&salary=123456789&height=175.5">Test DataBinding </a> 

发送请求后,控制台打印
SpringMVC中数据绑定及自定义类型转换器
这里我们想要解析的字符串格式:lastName-age-hobby-salary-height

首先,创建自己的自定义转换器类

MyConverter

public class MyConverter implements Converter<String, Employ> { // 将String类型转换为Employ类型
    @Override
    public Employ convert(String s) { //字符串s代表的就是参数字符串
        if (s != null) {
            String[] split = s.split("-"); // 使用 "-" 分割字符串,获取对应的参数
            Employ employ = new Employ(split[0], Integer.parseInt(split[1])
                    , split[2], Double.parseDouble(split[3]), Double.parseDouble(split[4]));  // 创建对象
            System.out.println(s + "---convert---" + employ);
            return employ; // 返回
        }
        return null; // 如果没有带参数,就返回为null
    }
}

然后,将这个转换器类注册到SpringMVC容器中

//会将自定义的factoryBean注册到 Spring MVC 的上下文中
<mvc:annotation-driven conversion-service="factoryBean"></mvc:annotation-driven>

    <bean id="factoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.hu.converter.MyConverter"></bean>
            </set>
        </property>
    </bean>

配置完以上,就可以尝试发送参数格式为:lastName-age-hobby-salary-height 的请求

  <a href="/testDataBinding?employ=张三-123-打篮球-123456789-175.5">Test DataBinding </a>

控制台
SpringMVC中数据绑定及自定义类型转换器