spring mvc关于jsp页面传递到controller层参数类型转换(格式化)的学习记录--2018年1月

Posted vastliu-blogs-for-java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring mvc关于jsp页面传递到controller层参数类型转换(格式化)的学习记录--2018年1月相关的知识,希望对你有一定的参考价值。


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配置中的最后一个转换器执行转换操作。












































































































以上是关于spring mvc关于jsp页面传递到controller层参数类型转换(格式化)的学习记录--2018年1月的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC:JSP模板执行后获取文本

无法使用 Ajax 将多部分文件从 JSP 传递到 Spring MVC 中的控制器

如何从 <form:select> Spring MVC 传递数据

Spring MVC 控制器如何绑定到 JSP 页面?

JAVA后台 关于如何从后台传递信息在jsp前端

在spring MVC中重定向期间传递模型属性并避免在URL中相同