跳至主要內容

6. SpringMVC 转换器,日期格式转换器

安图新大约 3 分钟

6. SpringMVC 转换器,日期格式转换器

1. SpringMVC 字符串向日期 Date 格式转换

springMVC 默认不支持页面上的日期字符串(类似 2020-10-14 和 2020/10/14 之类的)到后台的 Date 的转换。(会报 400 错误)

比如 jsp 页面设置一个接收 date 数据的 input。

<% pageContext.setAttribute("path",request.getContextPath()); %>
<form action="${path}/testDate.do" method="get">
    请选择日期:<input type="date" name="date">
    <br/>
    <input type="submit" value="提交"/>
</form>

后台 controller 接收数据进行跳转

	@RequestMapping(path="/testDate.do",method = RequestMethod.GET)
    //该参数接收浏览器提交的日期字符
    public String testDate(Date date, Model model){


        System.out.println("testDate date="+date);
        model.addAttribute("date",date);
        return "stringToDateConverter";
    }

运行结果 400 错误
 

有两种方式实现转换:1. 配置日期转换注解 2. 配置全局日期转换器。

1.1 通过注解@DateTimeFormat()实现日期格式转换。

注解日期类型转换器(在需要进行日期格式转换的 Date 属性上添加注解):@DateTimeFormat("需要转换的格式")
   如果一个类中有很多个 Date 属性,那么不推荐使用这种方式,毕竟注解需要在每个 Date 上写,需要写很多。

 出生日期<input type="date" name="birthday"/><br/>

public User{


private int id;
  private String username;
  private double password;
  //注解将yyyy-MM-dd的形式转换为Date数据,具体什么格式要看传入参数格式,就是发送请求,查看请求参数的表单数据,看birthday数据的格式
  @DateTimeFormat(pattern = "yyyy-MM-dd")
  private Date birthday;
}

查看请求头,发现传入的日期格式为
yyyy-MM-dd格式,具体是怎么样的看请求信息就行。 

1.2 编写自定义转换器实现 Converter,通过重写方法进行类型转换。[全局使用]

如果有很多的 Date 属性,建议使用这种方式

1.2.1 编写自定义转换器实现 Converter 接口
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

 /*自定义类型参数转换器: 将字符串日期格式转成Date类型的数据.
      Converter<S,T>  S: 代表的是源,将要转换的数据类型  T:目标类型,将会转成什么数据类型
 */
 //日期格式转换器
public class DateFormatConverter implements Converter<String,Date>{


  //转换方法
  //String source 将会传递过来的日期的字符串
  public Date convert(String source) {


   //参数填写为你想要转换的数据格式SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {Date date = sdf.parse(source);return date;} catch (ParseException e) {


​      e.printStackTrace();}return null;
  }

1.2.2 springmvc.xml 中配置转换工厂,将转换器设置到 converters 集合中,并将转换器放入注解驱动中
    <!-- 1. 配置类型转换器  -->
    <!-- 创建类型转换器对象 id可以随便取,class是你的转换器类路径 -->
    <bean id="stringToDateConverter" class="com.xgf.converter.StringToDateConverter"/>
    <!-- 把转换器对象放入SpringMVC转换器工厂中 -->
    <bean id="conversionServiceFactory" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <!-- 引入日期转换器对象(上面创建的) -->
                <ref bean="stringToDateConverter"/>
                <!-- 或者直接将转换器类写到这里面 -->
                <!--<bean id="stringToDateConverter" class="com.xgf.converter.StringToDateConverter"/>-->
            </set>
        </property>
    </bean>

    <!--2. 把转换器工厂放入到注解驱动,转换器才会生效  -->
    <mvc:annotation-driven conversion-service="conversionServiceFactory" />

运行结果(转换成功)
 

注意事项【***】

上述代码中的<mvc:annotation-driven conversion-service="conversionServiceFactory" />一定要放到 springmvc 的注解驱动<mvc:annotation-driven/>后面,不然就会报 400 错误。(你都没有开启注解驱动,怎么放进去呢?)

Failed to convert value of type ‘java.lang.String’ to required type ‘java.util.Date’;
Failed to convert from type [java.lang.String] to type [java.util.Date] for value ‘2020-10-01’

2. SpringMVC 日期格式化标签,date 向指定格式转换(在 jsp 中使用)

2.1 需要 jstl 依赖
		<dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

2.2 在 jsp 页面导入标签

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

2.3 调用日期格式化标签 fmt 标签(是导入你设置的前缀)

<fmt:formatDate value="${User.birthday}" pattern="yyyy-MM-dd-"/>
这样你传入后端的日期数据格式就是 yyyy-MM-dd 格式了

2.4 后台就在日期上加@DateTimeFormat(pattern = "yyyy-MM-dd")注解就行
//这个pattern需要和你传入的数据格式一致
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date date;

上次编辑于:
贡献者: Andy