spring mvc jsp传递参数到controller涉及到日期类型数据,需要使用到类型转换器:
目前笔者找到两种类型转换器可以使用:
类型一:实现Convert<Source,Target>接口的方式(Source源数据,Target目标数据类型),实现功能是一种数据类型到另一种数据类型:
数据转换类如下:在不添加DateTimeFormatter.ofPattern("yyyy/MM/dd")时(MM必须大写,小写表示时间分),默认需要输入的String样式“yyyy-MM-dd”
public class StringToLocalDate implements Converter<String,LocalDate> //String转换为LocalDate
{
@Override
public LocalDate convert(String s)
{
return LocalDate.parse(s,DateTimeFormatter.ofPattern("yyyy/MM/dd"));
}
}
spring-servlet.xml配置如下:在mvc:annoation-driven内部conversion-service默认装配的bean为FormattingConversionServiceFactoryBean,所以在使用convert时需要显示的设置该conversion-service对应的bean为ConversionServiceFactoryBean
<mvc:annotation-driven conversion-service="conversionService" />
<!--注册自定义数据类型转换器工厂,并添加自定义的转换器bean-->
<bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="conversionService">
<property name="converters">
<set>
<bean class="com.vastliu.DataConvert.StringToLocalDate"/> //StringToLocalDate是自定义的类型转换器
</set>
</property>
</bean>
到此借用convert实现自定义转换器,需要实现的接口以及需要配置的地方全部完成,可以将Source类型转换成Target类型了。此处笔者使用的是String转换成LocalDate作为示例;
类型二:使用FormattingConversionServiceFactoryBean格式化转换,此处可以使用注解简单的转换,也可以使用自定义类方法转换
注解转换:
需要在Pojo实体的属性上使用注解,笔者使用LocalDate做示例,故需要在数据类型为LocalDate的变量上添加注解如下:
import org.springframework.format.annotation.DateTimeFormat; //导入该注解对应的包
@DateTimeFormat(pattern="yyyy-MM-dd") //pattern是设置传入String的样式类型,非此样式类型的String不能转换成目标类型LocalDate
private LocalDate releaseDate; //发布日期
由于mvc:annoation-driven内部默认就是FormattingConversionServiceFactoryBean该工厂,所以无需显示的设置conversion-service,
<mvc:annotation-driven />
建议还是显示的设置一下
<mvc:annotation-driven conversion-service="conversionService2" />
<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="conversionService2"/>
至此注解转换需要完成的配置等已完成;
自定义类转换:
需要创建一个自定义转换类并实现Formatter<T>接口,如下:
public class LocalDateFormatterForDash implements Formatter<LocalDate>
{
/*声明一个日期时间格式化的属性*/
private DateTimeFormatter dateTimeFormatter;
/*声明一个字符串作为格式化的样式*/
private String datePattern;
/*创建构造器用以初始化时获取需要转换的String样式datePattern,并根据该datePattern样式生成一个DateTimeFormatter对象*/
public LocalDateFormatterForDash(String datePattern)
{
this.datePattern=datePattern;
dateTimeFormatter=DateTimeFormatter.ofPattern(datePattern);
}
/*重写接口提供的方法,将源字符串数据source转换成目标数据类型LocalDate,local是本地化*/
@Override
public LocalDate parse(String source, Locale locale) throws ParseException
{
/*将符合datePattern样式的String转化为LocalDate并返回*/
LocalDate localDate=LocalDate.parse(source,dateTimeFormatter);
return localDate;
}
/*将LocalDate转换成字符串*/
@Override
public String print(LocalDate localDate, Locale locale)
{
return localDate.format(dateTimeFormatter);
}
}
自定义转换器类以及声明并编辑完成,接下来需要让spring来让其发挥作用:
有两种方法:
一是将该类直接添加到FormattingConversionServiceFactoryBean中如下:
<mvc:annotation-driven conversion-service="conversionService" />
<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="conversionService">
<!--添加自定义formatter到formatter仓库中-->
<property name="formatters">
<set>
<bean class="com.vastliu.DataConvert.LocalDateFormatterForDash">
<!--构造器注入String样式yyyy/MM/dd-->
<constructor-arg name="datePattern" value="yyyy/MM/dd"/>
</bean>
</set>
</property>
</bean>
到此直接添加方式已完成相关配置;
二是将该类添加到MyFormatterRegistrar注册类中,在该类中完成注册
MyFormatterRegistrar注册类实现FormatterRegistrar该接口
public class MyFormatterRegistrar implements FormatterRegistrar
{
/*声明需要转换String的样式*/
private String dataPatternForDash;
/*构造器*/
public MyFormatterRegistrar(String dataPatternForDash)
{
this.dataPatternForDash=dataPatternForDash;
}
@Override
public void registerFormatters(FormatterRegistry formatterRegistry)
{
/*将创建的自定义类转换器注册(添加)到注册类中,完成注册(以注册类中的样式)*/
formatterRegistry.addFormatter(new LocalDateFormatterForDash(dataPatternForDash));
}
}
xml配置:
<mvc:annotation-driven conversion-service="conversionService" />
<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="conversionService">
<!--将注册类添加到FormattingConversionServiceFactoryBean-->
<property name="formatterRegistrars">
<set>
<!--初始化自定义注册类时,并传入String样式-->
<bean class="com.vastliu.DataConvert.MyFormatterRegistrar">
<constructor-arg name="dataPatternForDash" value="yyyy-MM-dd"/>
</bean>
</set>
</property>
</bean>
到此借助注册类的方式已经完成相关配置;想分享的数据类型转换的几种方式已经分享完毕,如有纰漏望指正;
ps:自定义转换器针对同一种目标数据类型(如:针对LocalDate自定义了多个转换器)spring默认会使用xml配置中的最后一个转换器执行转换操作。