Java笔记之SpringMVC(七):自定义String到Date的类型转换器
0.说在前面
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进行提交