Spring支持的转换器类型
Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到ConversionServiceFactroyBean 中:
– Converter:将 S 类型对象转为 T 类型对象。
– ConverterFactory:将相同系列多个 “同质” Converter 封装在一 起。如果希望将一种类型的对象转换为另一种类型及其子类的对 象(例如将 String 转换为 Number 及 Number 子类 (Integer、Long、Double 等)对象)可使用该转换器工厂类 。
– GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换。
ConversionService 转换器
• ConversionService 是 Spring 类型转换体系的核心接口。
• 可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个 ConversionService。Spring 将自动识别出 IOC 容器中的 ConversionService,并在 Bean 属性配置及 Spring MVC 处理方法入参绑定等场合使用它进行数据的转换 。
• 可通过 ConversionServiceFactoryBean 的 converters 属性 注册自定义的类型转换器。
注意:
1、在进行数据转换时必须实现Converter<S,T>接口。
2、在dispatcher-servlet.xml中配置ConversionServiceFactoryBean属性及其、配置<mvc:annotation-driven conversion-service=""></mvc:annotation-driven>属性(将自定义的 ConversionService 注册到 Spring MVC 的上下文中)。
例如
index.jsp
<%--
Created by IntelliJ IDEA.
User: 23369
Date: 3/31/2019
Time: 3:03 PM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="testConversionService">
用户信息<input type="text" name="userinfo">
<input type="submit" value="提交">
</form>
</body>
</html>
UserInfo.class(JavaBean)
package com.user;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class UserInfo {
private String username;
private String userpass;
private String useremail;
private String userage;
private Address address;
public UserInfo() {
super();
}
public UserInfo(String username, String userpass, String useremail, String userage, Address address) {
this.username = username;
this.userpass = userpass;
this.useremail = useremail;
this.userage = userage;
this.address = address;
}
@Override
public String toString() {
return "UserInfo{" +
"username='" + username + '\'' +
", userpass='" + userpass + '\'' +
", useremail='" + useremail + '\'' +
", userage=" + userage +
", address=" + address +
'}';
}
}
TestConversionService .class
package com.hello2;
import com.user.UserInfo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class TestConversionService {
private String success = "success";
private UserInfo userInfo;
@RequestMapping("testConversionService")
public String testConversionService(@RequestParam("userinfo") UserInfo userInfo){
System.out.println(userInfo.toString());
return success;
}
}
UserInfoConverter.class(实现Converter<S,T>接口)
package com.hello2;
import com.user.Address;
import com.user.UserInfo;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
@Component
public class UserInfoConverter implements Converter<String, UserInfo> {
//实现具体的JavaBean类
@Override
public UserInfo convert(String s) {
//判断传递过来的内容是否为空
if (s != null){
//对传递过来的内容进行数据分割
String[] values = s.split("-");
//如果传递过来的内容不为空,且符合字符数组长度
if(values != null && values.length == 6){
String username = values[0];
String userpass = values[1];
String useremail = values[2];
//将字符型数组转换成整型
Integer userage = Integer.parseInt(values[3]);
Address address = new Address();
address.setProcity(values[4]);
address.setCity(values[5]);
UserInfo userInfo = new UserInfo(username,userpass,useremail,userage.toString(),address);
System.out.println("原来信息内容"+s + "转化之后的内容"+userInfo);
//返回转换成功的内容
return userInfo;
}
}
return null;
}
}
dispatcher-servlet.xml
<!--能够让其扫描到该转化器-->
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"></mvc:annotation-driven>
<!--配置ConversionService-->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="userInfoConverter"/>
</set>
</property>
</bean>