SpringMVC_数据绑定_自定义类型转换器

在这里插入图片描述

1、类型转换器概述
在这里插入图片描述

  • ConversionService 是 Spring 类型转换体系的核心接口。
  • 可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个
    ConversionService. Spring 将自动识别出 IOC 容器中的 ConversionService,并在 Bean 属性配置及 Spring MVC 处理方法入参绑定等场合使用它进行数据的转换
  • 可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器

例如:

   <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.czl.component.MyStringToEmployeeConverter"></bean>
            </set>
        </property>
    </bean>

2、Spring 支持的转换器类型
Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到 ConversionServiceFactoryBean 中:

  • Converter<S,T>:将 S 类型对象转为 T 类型对象
  • ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类(Integer、Long、Double 等)对象)可使用该转换器工厂类
  • GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换

3、 自定义转换器示例

需求:字符串转换为对象。

1)写一个表单,用一个text直接接收一个字符串,使其转化为一个类

 <!-- 解决问题:
                 1.数据类型转换
                 2.数据格式
                 3.数据校验                 
                 自定义类型转换器:
                         将字符串转换为Employee对象,完成添加功能         

<form action="${path}/quickAdd" method="post">
    <input type="text" name="empinfo" value="empAdmin-admin@qq.com-1-101">
    <input type="submit" value="快速添加">
</form>

2)控制器方法

  @RequestMapping("/quickAdd")// String -> Employee 需要类型转换器帮忙
    public String quickAdd(@RequestParam("empinfo") Employee employee){
        System.out.println(employee);
        employeeDao.save(employee);
        return "redirect:/emps";
    }

3)自定义类型转换器

package com.czl.component;

import com.czl.bean.Employee;
import com.czl.dao.DepartmentDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.converter.Converter;

@Component
public class MyStringToEmployeeConverter implements Converter<String, Employee> {
    @Autowired
    DepartmentDao departmentDao;
     /**
	 * 自定义的转换规则
	 */
    @Override
    public Employee convert(String s) {

        Employee employee = new Employee();
        if(s.contains("-")){
            String[] split = s.split("-");
            employee.setLastName(split[0]);
            employee.setEmail(split[1]);
            employee.setGender(Integer.parseInt(split[2]));
            employee.setDepartment(departmentDao.getDepartment(Integer.parseInt(split[3])));
            return employee;

        }
        return null;
    }
}

4)声明类型转换器服务,将这个Converter配置在ConversionService中

<!-- 告诉SpringMVC别用默认的ConversionService,
			而用我自定义的ConversionService、可能有我们自定义的Converter; -->
	<!-- 以后写自定义类型转换器的时候,就使用FormattingConversionServiceFactoryBean来注册;
	既具有类型转换还有格式化功能 -->
	   <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.czl.component.MyStringToEmployeeConverter"></bean>
            </set>
        </property>
    </bean>

5)、告诉SpringMVC使用这个ConversionService

<!-- conversion-service="conversionService":使用我们自己配置的类型转换组件 -->
	<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

6)、源码上WebDataBinder上的ConversionService组件就替换了;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值