0%

6.2.2 Spring支持的转换器 示例 使用ConversionService转换数据

6.2.2 Spring支持的转换器

Springorg.springframework.core.convert.converter包中定义了3种类型的转换器接口,我们可以实现其中任意一种转换器接口,并将它作为自定义转换器注册到ConversionServiceFactoryBean当中。这3种类型转换器接口如下所示:

Converter接口

Converter<S,T>接口是Spring中最简单的一个转换器接口,该接口中只有一个方法:

1
此处有代码后面补上

该方法负责S类型的对象转换为T类型的对象

ConverterFactory接口

如果希望将一种类型的对象转换为另一种类型及其子类对象,比如将String转换为Number以及Number的子类IntegerDouble等对象,就需要一系列的Converter,如StringToIntegerStringToDouble等。ConverterFactory<S,R>接口的作用就是将相同系列的多个Converter封装在一起。该接口中也只有一个方法:

1
此处有代码后面补上

S为转换的源类型,R为目标类型的基类,TR的子类。

GenericConverter

Converter<S,T>接口只是负责将一个类型对象转换为另一个类型的对象,它并没有考虑类型对象上下文信息,因此并不能完成”复杂”类型的转换工作。GenericConverter接口会根据源类对象及目标类对象的上下文信息进行类型转换。该接口中定义了两个方法:

1
此处有代码后面补上

ConvertiblePair封装了源类型和目标类型,而TypeDescriptor包含了需要转换的类型对象的上下文信息,因此GenericConverter接口的convert()方法可以利用这些上下文信息完成类型转换的工作。

示例 使用ConversionService转换数据

域对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 域对象,实现序列化接口
public class User
implements Serializable
{
private static final long serialVersionUID = 1L;
private String loginname;
private Date birthday;
public User()
{
super();
// TODO Auto-generated constructor stub
}
// 此处省略getter和setter方法,请自己补上
@Override
public String toString()
{
return "User [loginname=" + loginname + ", birthday=" + birthday + "]";
}
}

User提供了loginnamebirthday属性,用于接收JSP页面传入的数据。注意,birthday属性的类型是一个java.util.Date,而JSP页面传入的控件数据类型都是String,这里就需要将String转换成Date对象

测试链接

1
<a href="registerForm">测试registerForm</a>

请求处理方法

1
2
3
4
5
6
@GetMapping(value = "/registerForm")
public String registerForm()
{
// 跳转到注册页面
return "registerForm";
}

登录表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

<form action="register" method="post">
<table>
<tr>
<td>
<label>登录名: </label>
</td>
<td>
<input type="text" id="loginname" name="loginname">
</td>
</tr>
<tr>
<td>
<label>生日: </label>
</td>
<!-- 将会提交给请求处理方法中与name属性值同名的域对象的属性 -->
<td>
<input type="text" id="birthday" name="birthday">
</td>
</tr>
<tr>
<td>
<input id="submit" type="submit" value="登录">
</td>
</tr>
</table>
</form>

表单处理方法

1
2
3
4
5
6
7
8
9
@PostMapping(value = "/register")
// 前台页面的控件的值,将会自动赋值给user对象中的同名属性中
public String register(@ModelAttribute
User user, Model model)
{
System.out.println(user);
model.addAttribute("user", user);
return "success";
}

register方法只是简单地接收请求数据,并将数据转换并设置到User对象当中,转换工作使用自定义的转换器来完成,转换器的使用方法如下所示:

自定义转换器

这里的转换器通过实现Converter<S,T>接口的方法实现,Converter<String, Date>可以将String类型的数据转换为Date类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 实现Converter<S,T>接口
//Converter<String, Date>可以将String类型的数据转换为Date类型
public class StringToDateConverter
implements Converter<String, Date>
{
// 日期类型模板:如yyyy-MM-dd
private String datePattern;
public void setDatePattern(String datePattern)
{
this.datePattern = datePattern;
}
// Converter<S,T>接口的类型转换方法
@Override
public Date convert(String date)
{
try
{
SimpleDateFormat dateFormat = new SimpleDateFormat(
this.datePattern);
// 将日期字符串转换成Date类型返回
return dateFormat.parse(date);
} catch (Exception e)
{
e.printStackTrace();
System.out.println("日期转换失败!");
return null;
}
}
}

使用自定义转换器

有了自定义转换器,接下来就要使用这个转换器了,在Spring配置文件中配置转换器的bean就行了.

在Sping配置文件中创建自定义转换器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 自定义的类型转换器 -->
<bean
id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 使用converters属性来注册自定义转换器 -->
<property name="converters">
<list>
<!-- 给自定义的转换器StringToDateConverter的bean赋值`yyyy-MM-dd` -->
<bean
class="org.fkit.converter.StringToDateConverter"
p:datePattern="yyyy-MM-dd"></bean>
</list>
</property>
</bean>

在Spring配置文件中装配自定义转换器

1
2
<!-- 装配自定义的类型转换器 -->
<mvc:annotation-driven conversion-service="conversionService" />

springmvc-config.xml配置文件中,使用了mvc:annotation-driven标签,该标签可以简化Spring MVC的相关配置,使用mvc:annotation-driven标签可以自动注册RequestMappingHandlerMappingRequestMappingHandlerAdapter两个Bean,这是SpringMVC@Controllers注解分发请求所必需的。
除此之外,mvc:annotation-driven标签还会注册一个默认的ConversionService(FormattingConversionServiceFactoryBean),以满足大多数类型转换的需求。现在由于需要注册一个自定义的StringToDateConverter转换类,因此,需要显式定义一个ConversionService覆盖mvc:annotation-driven中的默认实现类,而这一步需要在,mvc:annotation-driven标签设置converters属性来完成。

填写表单

这里有一张图片
输入登录名和生日信息,单击”登录”按钮,转换器会自动将输入的日期字符串转换成Date类型,并将其设置到User对象的birthday属性当中。控制台输出如下所示:

1
User [loginname=小明, birthday=Thu Sep 06 00:00:00 CST 126]

可以看到,User对象的birthday属性已经获得JSP页面传入的日期值。

成功页面

1
2
3
4
5
登录名:${requestScope.user.loginname }
<br> 生日:
<fmt:formatDate value="${requestScope.user.birthday}"
pattern="yyyy年MM月dd日" />
<br>

成功显示效果

这里有一张图片

原文链接: 6.2.2 Spring支持的转换器 示例 使用ConversionService转换数据