Java笔记之SpringMVC(七):自定义String到Date的类型转换器

0.说在前面

  基于SpringMVC(六):拦截器项目

1.新建converter.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>转换器页面</title>
</head>
<body>
    <form action="converter.action" method="post">
        日期:<input type="text" name="myDate"/>
        <button type="submit">提交</button>
    </form>
    <hr>
    <span>${converteredDate }</span>
</body>
</html>

2.新建ConverterController类

package com.springmvc.demo.controller;

import java.util.Date;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ConverterController {
    @RequestMapping("/initConverter.action")
    public String Init(){
        return "converter";
    }
    
    @RequestMapping("/converter.action")
    public ModelAndView converter(Date myDate){
        System.out.println(myDate.getTime());
        ModelAndView mav=new ModelAndView();
        mav.addObject("converteredDate", myDate);
        mav.setViewName("converter");
        return mav;
    }
}

3.访问http://localhost:8080/springmvc_demo/initConverter.action,跳转到converter.jsp,输入yyyy/MM/dd格式的日期字符串进行提交

从页面展示和后台打印可以看出yyyy/MM/dd格式的日期字符串会被SpringMVC自动进行日期类型转换.

4.输入yyyy-MM-dd格式的日期字符串,再进行提交

preHandle在Controller之前被调用......
四月 08, 2020 10:55:20 上午 org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver logException
警告: Resolved [org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.Date': no matching editors or conversion strategy found]
afterCompletion在视图被访问之后被调用......

从页面信息和后台打印的信息可以看出yyyy-MM-dd格式的日期字符串SpringMVC并不能自动转换成日期类型,这就需要自定义类型转换器.

5.新建包com.springmvc.demo.converter,在其中新建String2DateConverter类

package com.springmvc.demo.converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.core.convert.converter.Converter;

public class String2DateConverter implements Converter<String, Date>{
    
    @Override
    public Date convert(String dateString) {
        System.out.println("进入String2DateConverter转换器了,开始进行转换......");
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
        Date date=null;
        try {
            date= format.parse(dateString);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

}

6.修改springmvc.xml,添加类型转换器的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
        
    <!-- 开启注解扫描, base-package配置Controller所在的基础包-->
    <context:component-scan base-package="com.springmvc.demo.controller"></context:component-scan>
    
    <!-- 开启SpringMVC的注解驱动,设置转换器服务,使转换器服务生效 -->
    <mvc:annotation-driven conversion-service="converterService"></mvc:annotation-driven>
    <!-- 设置转换器服务工厂实体类-->
    <bean id="converterService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <!-- 对converters属性进行操作 -->
        <property name="converters">
            <list>
                <!-- 添加自定义的类型转换器 -->
                <bean class="com.springmvc.demo.converter.String2DateConverter"></bean>
            </list>
        </property>
    </bean>
    
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    
    <!-- 配置文件上传解析器,设置最大文件大小为10M(10*1024*1024) -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"></property>
    </bean>
    
    <!-- 配置拦截器,其中可以配置多个拦截器 -->
    <mvc:interceptors>
        <!-- 在其中完成一个拦截器的配置 -->
        <mvc:interceptor>
            <!--拦截器拦截的请求,这里配置的是所有SpringMVC的请求  -->
            <mvc:mapping path="/*.action"/>
            <!-- 拦截器放行的请求,对该请求不进行拦截 -->
            <mvc:exclude-mapping path="/login.action"/>
            <!-- 配置使用的拦截器类 -->
            <bean class="com.springmvc.demo.interceptor.RequestInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

</beans>

7.重新输入yyyy-MM-dd格式的日期字符串,再进行提交

从页面和后台上的信息可以看出,yyyy-MM-dd格式的日期字符串被成功转换成了日期类型.

8.说明

  (1).在7的基础上再输入yyyy/MM/dd格式的日期字符串就又不能转换了;

  (2).一般项目中的日期格式都是统一的,如果是yyyy/MM/dd格式的就不需要自定义类型转换器,如果是yyyy-MM-dd格式的就可以使用这种方式自定义类型转换器;

  (3).如果真是遇到了多种格式的日期格式,可以定义拦截器,在preHandle方法中对日期字段处理成统一的格式,再参考(2)中说的进行后续操作.

  (4).也可以在转换器类中做些格式判断,修改String2DateConverter类如下:

package com.springmvc.demo.converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.core.convert.converter.Converter;

public class String2DateConverter implements Converter<String, Date>{
    
    @Override
    public Date convert(String dateString) {
        System.out.println("进入String2DateConverter的2.0版本了,开始进行转换......");
        SimpleDateFormat format=null;
        Date date=null;
        if(dateString!=null){
            //匹配yyyy/MM/dd格式的日期字符串
            if(dateString.matches("\\d{4}/\\d{2}/\\d{2}")){
                format=new SimpleDateFormat("yyyy/MM/dd");
            //匹配yyyy-MM-dd格式的日期字符串
            }else if(dateString.matches("\\d{4}-\\d{2}-\\d{2}")){
                format=new SimpleDateFormat("yyyy-MM-dd");
            }
            try {
                date= format.parse(dateString);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        
        return date;
    }

}

再分别进行yyyy/MM/dd和yyyy-MM-dd格式的日期字符串数据提交,就都可以了.当然,其中的正则表达式写的并不严谨,可以自行弥补不足,正确输入的两种格式的日期字符串还是可以满足的.

例如分别输入2020/04/08和2020-04-08进行提交

 

posted @ 2020-04-08 11:47  安徒生敲代码  阅读(832)  评论(0编辑  收藏  举报