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

0.说在前面

1.新建converter.jsp

转换器页面

日期:

提交


${converteredDate }

2.新建ConverterController类

packagecom.springmvc.demo.controller;importjava.util.Date;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.servlet.ModelAndView;

@Controllerpublic classConverterController {

@RequestMapping("/initConverter.action")publicString Init(){return "converter";

}

@RequestMapping("/converter.action")publicModelAndView converter(Date myDate){

System.out.println(myDate.getTime());

ModelAndView mav=newModelAndView();

mav.addObject("converteredDate", myDate);

mav.setViewName("converter");returnmav;

}

}

256047c65c0b40d6f2e8ed4ff8c963cd.png

8d4143ac03319c38bbb13216c31ab29d.png

229b3e3b9c0b7874ee94dd1833f64d05.png

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

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

736697830d312bdf85e7eba1453cb9c8.png

cb6902a8a6a7331f812683b8476bef2f.png

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类

packagecom.springmvc.demo.converter;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;importorg.springframework.core.convert.converter.Converter;public class String2DateConverter implements Converter{

@OverridepublicDate 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();

}returndate;

}

}

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

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">

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

c9eae59c4f2225f541768fda5e1b990f.png

62c3ac43bb71716d28464fa667b06ff8.png

f4ac642acb14833cae2716287408fcc7.png

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

8.说明

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

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

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

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

packagecom.springmvc.demo.converter;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;importorg.springframework.core.convert.converter.Converter;public class String2DateConverter implements Converter{

@OverridepublicDate 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();

}

}returndate;

}

}

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

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

9607b687a2d41abd4da73d296a461f15.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值