Spring MVC默认提供了一些常用的类型转换器,这些类型转换器,可以将客户端提交的参数自动转换为处理器形参类型的数据。然而默认类型转换器并不能将提交的参数转换为所有的类型。此时,就需要开发者自定义类型转换器,来将参数转换为程序所需要的类型。
Spring框架提供了org.springframework.core.convert.converter.Converter接口作为类型转换器,开发者可以通过实现Converter接口来自定义类型转换器。Converter接口的代码如下所示。
- public interface Converter
{ - T convert(S source);
- }
在上述代码中,泛型参数中的S表示源类型,T表示目标类型,而convert( )方法将源类型转换为目标类型返回,方法内的具体转换规则可由开发者自行定义。
下面通过案例演示自定义类型转换器转换特殊数据类型并完成数据绑定,该案例要求实现Date类型的数据绑定,案例具体实现步骤如下所示。
- public class DateConverter implements Converter
{ - private String datePattern = “yyyy-MM-dd";// 定义日期格式
- @Override
- public Date convert(String source) {
- SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
- try { return sdf.parse(source);
- } catch (Exception e) {
- throw new IllegalArgumentException(
- “无效的日期格式,请使用这种格式:"+datePattern);} }
- }
-
"com.test.controller"/> -
- "org.springframework.web.servlet.view.InternalResourceViewResolver">
-
"prefix" value="/WEB-INF/pages/"/> -
"suffix" value=".jsp"/> -
"converterService" class= - "org.springframework.context.support.ConversionServiceFactoryBean">
-
-
"converters">"com.test.convert.DateConverter"/> -
"converterService"/>
三、配置类型转换器工厂或配置格式化工厂
要将自定义类型转换器注册到程序中,除了可以将自定义转换器配置在类型转换器工厂ConversionServiceFactoryBean中,也可以将自定义转换器配置在格式化工厂org.springframework.format.support.FormattingConversionServiceFactoryBean中,通过格式化工厂对数据格式化。
3、在UserController.java类中定义方法getBirthday(),用于绑定客户端请求中的日期数据,getBirthday()方法代码如下所示。
- /**
- * 使用自定义类型数据绑定日期数据
- */
- @RequestMapping("/getBirthday")
- public void getBirthday(Date birthday) {
- System.out.println("birthday="+birthday);
- }
4、启动chapter12项目,在浏览器中访问地址http://localhost:8080/chapter12/getBirthday?birthday=2020-11-11,访问后,控制台打印信息如图所示。
birthday=Wed Nov 11 00:00:00 CST 2020
四、日期类型的格式转换
在上述案例中,日期类型的格式转换是基于XML配置自定义转换器实现的。除了XML方式之外,还可以通过@DateTimeFormat注解来简化日期类型的格式转换。使用@DateTimeFormat注解完成日期类型的格式转换无需自定义转换器,也无需在配置文件中定义转换器工厂或格式化工厂,只需将@DateTimeFormat定义在方法的形参前面或成员变量上方,就可以为当前参数或变量指定类型转换规则。
接下来使用@DateTimeFormat注解修改上述案例,完成Date类型的数据绑定,具体实现步骤如下。
1、修改UserController.java类中getBirthday()方法,修改后getBirthday()方法的具体代码如下所示。
- /**
- * 使用@DateTimeFormat注解绑定日期数据
- */
- @RequestMapping("/getBirthday")
- public void getBirthday(@DateTimeFormat(
- pattern = "yyyy-MM-dd")Date birthday) {
- System.out.println("birthday="+birthday);
- }
2、删除spring-mvc.xml中的转换器工厂,删除后spring-mvc.xml保留的元素如下所示。
package="com.itheima.controller"/> "org.springframework.web.servlet.view - .InternalResourceViewResolver">
-
"prefix" value="/WEB-INF/pages/"/> -
"suffix" value=".jsp"/>
3、启动chapter12项目,在浏览器中访问地址http://localhost:8080/chapter12/getBirthday?birthday=2020-11-11,使用@DateTimeFormat注解时控制台打印信息如图所示。
birthday=Wed Nov 11 00:00:00 CST 2020
如果getBirthday()方法的形参是User类型,且birthday是User类的属性,也可以将形参上的@DateTimeFormat注解改写在birthday属性的上方,数据绑定效果是一样的,格式如下。
- @DateTimeFormat(pattern = "yyyy-MM-dd")
- private Date birthday;