由 String 型字符串转为实体 Employee
例如:
G-gg@qq.com-0-103 convert Employee [id=null, lastName=G, email=gg@qq.com, gender=0, department=Department [id=103, departmentName=null]]
要转换为的实体类型
Employee.java
package com.jxust.springmvc.crud.entities;
public class Employee {
private Integer id;
private String lastName;
private String email;
private Integer gender;
private Department department;
//省略getter and setter toString
}
Department.java
package com.jxust.springmvc.crud.entities;
public class Department {
private Integer id;
private String departmentName;
public Department() {
super();
}
public Department(Integer id, String departmentName) {
super();
this.id = id;
this.departmentName = departmentName;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
@Override
public String toString() {
return "Department [id=" + id + ", departmentName=" + departmentName + "]";
}
}
自定义转换器
EmployeeConverter.java
package com.jxust.springmvc.converters;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import com.jxust.springmvc.crud.entities.Department;
import com.jxust.springmvc.crud.entities.Employee;
/**
* 自定义类型转换器 String to Employee
* @author Peng
* @Date2016年12月2日下午5:46:28
*/
@Component
public class EmployeeConverter implements Converter<String, Employee> {
@Override
public Employee convert(String source) {
if (source != null) {
// G-gg@qq.com-0-103
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;
}
}
转换器在xml文件中的配置
.
.
<!-- 静态资源交给默认的Servlet-->
<mvc:default-servlet-handler/>
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- 配置ConversionService -->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 可以使用 ConversionService
使用FormattingConversionServiceFactoryBean,自己定义的和系统默认的转换器都可以使用-->
<property name="converters">
<set>
<!-- 自定义的转换器类 -->
<ref bean="employeeConverter"></ref>
</set>
</property>
</bean>
.
.
<mvc:annotation-driven></mvc:annotation-driven>
会自动注册 RequestMappingHandlerMapping、RequestMappingHandlerAdapter
和ExceptionHandlerExceptionResolver三个bean
还提供了以下的支持
-支持使用ConversionService 示例对表单参数进行类型转换
-支持使用@NumberFormatannotation、@DateTimeFormat 注解完成数据类型的格式化
-支持使用 @Valid 注解对 JavaBean 实例进行JSR 303验证
-支持使用@RequestBody 和 @ResponseBody 注解
测试转化器
jsp页面
测试转换器
<form action="${pageContext.request.contextPath}/testConversionSrviceConverer" method="post">
<!-- lastName-email-gender-department.id 例如:GG-gg@qq.com-0-103 -->
Employee:<input type="text" name="employee"/>
<input type="submit" value="Submit">
</form>
controller
从输入参数可以看出,要求是 String 型数据,转为 Employee 型数据,配置了自定义类型转换器,会自动转换
@RequestMapping("/testConversionSrviceConverer")
public String testConverter(@RequestParam("employee") Employee employee ){
System.out.println("employee"+employee);
..
return "success";
}