前面的章节我们介绍过,使用SpringMVC框架进行web开发时,前端页面传输的数据会自动封装到业务方法的参数中。此项工作是由HandlerAdapter组件完成的。
我们知道http表单中的所有请求参数都是String类型的,如果业务参数是String或者int类型,HandlerAdapter可以自动完成数据转换,但如果参数是其他数据类型,比如Date类型,HandlerAdapter是不会将String类型转换为Date类型的,我们需要实现Converter接口来协助SpringMVC完成数据类型的转换。
代码:
1.创建DateConverter转换器,实现org.springframework.core.convert.converter.Converter接口,
泛型为<String,Date>,将String类型的数值转换为Date类型。
import org.springframework.core.convert.converter.Converter;
public class DateConverter implements Converter<String,Date>{
private String pattern;
public DateConverter(String pattern){
this.pattern = pattern;
}
public Date convert(String source) {
// TODO Auto-generated method stub
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
try {
return simpleDateFormat.parse(source);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
2.springmvc.xml中配置conversionService bean。
bean的类名称必须是org.springframework.context.support.ConversionServiceFactoryBean。
bean必须包含一个converters属性,它将列出在应用程序中用到的所有定制Converter。将我们自定义的DateConverter添加到converters中,
通过有参构造函数创建DateConverter。
同时annotation-driven元素的conversion-service属性赋bean名称。
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.southwind.utils.DateConverter">
<!-- 调用有参构造函数创建bean -->
<constructor-arg type="java.lang.String" value="yyyy-MM-dd"/>
</bean>
</list>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService"/>
3.创建addDate.jsp,form表单提交数据到后台。
<form action="dateConverterTest" method="post">
请输入日期:<input type="text" name="date"/><font style="font-size:13px">(yyyy-MM-dd)</font><br/>
<input type="submit" value="提交"/>
</form>
4.创建业务方法。
@RequestMapping(value="/dateConverterTest")
@ResponseBody
public String dateConverterTest(Date date){
return date.toString();
}
5.运行代码。
成功。
除了Date类型的转换,还可以自定义数据格式,比如注册一个Student,前端页面按照"id-name-age"的形式输入String类型的数据,通过转换器,可以将该String类型的数据直接转换为Student对象。
1.创建Student实体类。
public class Student {
private int id;
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
2.创建addStudent.jsp。
<form action="studentConverterTest" method="post">
学生信息:<input type="text" name="student"/><font style="font-size:13px">(id-name-age)</font><br/>
<input type="submit" value="提交"/>
</form>
3.创建业务方法。
@RequestMapping(value="/studentConverterTest")
@ResponseBody
public String studentConverterTest(Student student){
return student.toString();
}
4.创建StudentConverter转换器。
import org.springframework.core.convert.converter.Converter;
import com.southwind.entity.Student;
public class StudentConverter implements Converter<String,Student>{
public Student convert(String source) {
// TODO Auto-generated method stub
String[] args = source.split("-");
Student student = new Student();
student.setId(Integer.parseInt(args[0]));
student.setName(args[1]);
student.setAge(Integer.parseInt(args[2]));
return student;
}
}
5.springmvc.xml中配置StudentConverter转换器。
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<!-- 日期转换器 -->
<bean class="com.southwind.utils.DateConverter">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd"/>
</bean>
<!-- Student转换器 -->
<bean class="com.southwind.utils.StudentConverter"></bean>
</list>
</property>
</bean>
6.运行程序。
成功。
源码:
链接: https://pan.baidu.com/s/1ggA6mUf
密码: b8jk