您的位置:首页 > 娱乐 > 八卦 > Spring MVC数据绑定和响应——简单数据绑定(四)自定义类型转换器

Spring MVC数据绑定和响应——简单数据绑定(四)自定义类型转换器

2024/12/23 8:09:26 来源:https://blog.csdn.net/W_Fe5/article/details/139903200  浏览:    关键词:Spring MVC数据绑定和响应——简单数据绑定(四)自定义类型转换器

一、自定义类型转换器使用场景

        Spring MVC默认提供了一些常用的类型转换器,这些类型转换器,可以将客户端提交的参数自动转换为处理器形参类型的数据。然而默认类型转换器并不能将提交的参数转换为所有的类型。此时,就需要开发者自定义类型转换器,来将参数转换为程序所需要的类型。

二、Converter接口的使用

        Spring框架提供了org.springframework.core.convert.converter.Converter接口作为类型转换器,开发者可以通过实现Converter接口来自定义类型转换器。Converter接口的代码如下所示。

public interface Converter<S, T> {T convert(S source);
}

        在上述代码中,泛型参数中的S表示源类型,T表示目标类型,而convert( )方法将源类型转换为目标类型返回,方法内的具体转换规则可由开发者自行定义。

        下面通过案例演示自定义类型转换器转换特殊数据类型并完成数据绑定,该案例要求实现Date类型的数据绑定,案例具体实现步骤如下所示。

1、创建DateConverter类,并在类中定义convert()方法, 实现String类型转到Date类型的转换。

public class DateConverter implements Converter<String, Date> {private String datePattern = “yyyy-MM-dd";// 定义日期格式@Overridepublic Date convert(String source) {SimpleDateFormat sdf = new SimpleDateFormat(datePattern);try {		return sdf.parse(source);} catch (Exception e) {throw new IllegalArgumentException(“无效的日期格式,请使用这种格式:"+datePattern);} }
}

2、为了让Spring MVC知道并使用DateConverter转换器类,还需要在配置文件spring-mvc.xml中配置类型转换器。

<!-- 配置创建 spring 容器要扫描的包 --><context:component-scan basepackage="com.test.controller"/><!-- 配置视图解析器 --><bean class=
"org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/></bean><!-- 配置类型转换器工厂 --><bean id="converterService" class= "org.springframework.context.support.ConversionServiceFactoryBean"><!-- 给工厂注入一个新的类型转换器,配置自定义类型转换器 --><property name="converters"><array><bean class="com.test.convert.DateConverter"/></array></property></bean><mvc:annotation-driven conversion-service="converterService"/></beans>

三、配置类型转换器工厂或配置格式化工厂

        要将自定义类型转换器注册到程序中,除了可以将自定义转换器配置在类型转换器工厂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保留的元素如下所示。

<!-- 配置创建 spring 容器要扫描的包 -->
<context:component-scan base package="com.itheima.controller"/>
<!-- 配置视图解析器 -->
<bean	class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/>
</bean>
<mvc:annotation-driven />

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;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com