- Spring定义了3种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到ConversionServiceFactoryBean中。
- Converter<S,T>:将S类型转换为T类型。
- ConverterFactory:将相同系列的多个“同质”Converter封装在一起,如果希望一种类型转换成另一种类型及其子类对象(例如String转换为Number及Number的子类(Integer,Long,Double等)),可以使用该转换器工厂。
- GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换。
定义了一个实现Converter接口的对象
package com.znsd.springmvc.dao;
import org.springframework.core.convert.converter.Converter;
public class Demo implements Converter<String,User>{
@Override
public User convert(String arg0) {
String[] split = arg0.split("-");
User u=new User();
u.setName(split[0]);
u.setPass(split[1]);
u.setSex(split[2]);
return u;
}
}
实体类
public class User {
private String name;
private String pass;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [name=" + name + ", pass=" + pass + ", sex=" + sex + "]";
}
}
然后我们在Spring MVC的配置文件中对上述Converter进行配置:
<!-- 将自定义转换器加入到IOC容器 -->
<bean id="zhuj" class="com.znsd.springmvc.dao.Demo"></bean>
<!-- 将自定义类型转换器添加到conversionServiceFactoryBean中 -->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="zhuj"/>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService" />
创建jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="f"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<f:form action="update" method="post" >
<input name="user">
<input type="submit" value="注册">
</f:form>
</body>
</html>
@Controller中处理这个请求:
当页面无法完成数据绑定或者类型转换时,springmvc会抛出异常,异常信息可以使用BindingResult来进行获取。
@RequestMapping(value="/update",method=RequestMethod.POST)
public String updat( User user,BindingResult resilt)
{
if(resilt.getErrorCount()>0)
{
for (FieldError fieldError : resilt.getFieldErrors()) {
System.out.println(fieldError.getDefaultMessage());
}
}
System.out.println(user);
return "update";
}
这样在用户信息一栏输入类似于“xiaoming-123456-男”的输入就可以在@Controller中直接得到一个包含这些信息的User对象了。