Spring -- 自定义转换器
Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到 ConversionServiceFactoryBean 中:
Converter<S,T>:将 S 类型对象转为 T 类型对象;
ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类(Integer、Long、Double 等)对象)可使用该转换器工厂类;
GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换。
举个例子来实现下自定义转换器:
例如Employee对象,现在在页面提交的时候内容是“zhangsan,aaa@qq.com,1,101”,需要转化为Employee对象进行保存。
首先先看Employee对象:
public class Employee { private Integer id; private String lastName; private String email; private Integer gender; private Date birth; private Department department; }
“zhangsan”赋给lastName;
“aaa@qq.com”赋给email;
“1”给gender;
“101”给Department ;
再看下Department的结构:
public class Department { private Integer id; private String departmentName; }
上面的JavaBean省略了构造和get set细节,具体代码里面应该写上,博客里面就不累赘。
然后自定义转换器:
import org.springframework.core.convert.converter.Converter; import com.soyoungboy.bean.Department; import com.soyoungboy.bean.Employee; /** * string转Employee * @author MSI1 * */ public class StringToEmployeeConverter implements Converter<String, Employee> { @Override public Employee convert(String str) { String strTrim = str.trim(); if (strTrim != null && !strTrim.equals("")) { String[] strs = strTrim.split(","); // zhangsan,aaa@qq.com,1,101,将字符串转化为字符串数组,然后通过构造函数拼装进指定属性 Employee employee = new Employee(null, strs[0], strs[1], Integer.parseInt(strs[2]), new Department(Integer.parseInt(strs[3]), "")); return employee; } return new Employee(); } }
配置文件里面配置:
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <bean class="com.atguigu.StringToEmployeeConverter"></bean> </property> </bean>
将自定义的转换器注册到Spring上下文中去。
jsp界面:
<form action="${ctp }/quickadd" method="post"> <!-- 员工的所有信息全部写上;用-分隔 zhangsan-aaa@qq.com-1-101 --> 员工信息:<input name="empInfo" value="zhangsan,aaa@qq.com,1,101" style="width: 300px;"/> <input type="submit" value="快速添加"/> </form>
测试代码:
@RequestMapping("/quickadd") public String quickAdd(@RequestParam("empInfo")Employee emp){ System.out.println(emp); employeeDao.save(emp); return "redirect:/emps"; }