- ConversionService是Spring类型转换体系的核心接口。
- 可以利用ConversionSeviceFactoryBean在Spring的IOC容器中定义ConversionService.Spring将自动识别出IOC容器中的ConversionService,并在Bean属性配置及Spring MVC处理方法入参绑定等场合使用它进行数据的转换
- 可通过ConversionServiceFactoryBean的converters属性注册自定义的类型转换器
Spring支持的转换器
- Spring定义了3中类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到ConversionServiceFactoryBean中:
- Converter<S,T>:将S类型对象转为T类型对象
- ConverterFactory:将相同系列多个“同质”Converter封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将String转换为Number及Number子类(Integer、Long、Double等)对象)可使用该转换器工厂类
- GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换
自定义转换器示例
- <mvc:annotation-driven conversion-service = “conversionService”/>会将自定义的ConversionService注册到Spring MVC的上下文中
演示:
第一步:写一个表单,用一个text直接接收一个字符串,使其转化为一个类
<form action="testConversionServiceConverer" method="post">
<!--lastname-email-gender-department.id 例如:GG-gg@atguigu.com-0-105-->
Employee:<input type="text" name="employee"/>
<input type="submit" value="Submit"/>
</form>
第二步:新建一个包com.springmvc.test ,创建一个SpringMVCTest.java,写好相应的方法
SpringMVCTest.java
package com.springmvc.test;
import com.springmvc.crud.dao.EmployeeDao;
import com.springmvc.crud.entities.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class SpringMVCTest {
@Autowired
private EmployeeDao employeeDao;
@RequestMapping("/testConversionServiceConverer")
public String testConverter(@RequestParam("employee")Employee employee){
System.out.println("save: "+employee);
employeeDao.save(employee);
return "redirect:/emps";
}
}
这里不难发现,我们发送的是一个字符串,这里的接收方法接受的是一个类。所以需要一个转换器,先把字符串转换成类。
第三步:创建一个包com.springmvc.converters ,新建一个类EmployeeConverter
package com.springmvc.converters;
import com.springmvc.crud.entities.Department;
import com.springmvc.crud.entities.Employee;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
@Component //添加到IOC容器里面
public class EmployeeConverter implements Converter<String,Employee> {
@Override
public Employee convert(String source) {
//[email protected]
if(source!=null){
String[] vals = source.split("-");
if(vals!=null&&vals.length==4){
String lastName = vals[0];
String email = vals[1];
Integer gender =Integer.parseInt(vals[2]);
Department department = new Department();
department.setId(Integer.parseInt(vals[3]));
Employee employee = new Employee(null,lastName,email,gender,department);
System.out.println(source+"--convert--"+employee);
return employee;
}
}
return null;
}
}
第四步:在配置文件springmvc.xml中将这个转换器配置到转换器体系里面
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!--配置ConversionService-->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="employeeConverter"/>
</set>
</property>
</bean>
第五步:演示