分享知识-快乐自己:SpringMvc中 页面日期格式到后台的类型转换

2021-06-19 20:03

阅读:451

YPE web->

标签:obj   path   Servle   --   ignore   升级版   class   转换   字符串   

日期格式的类型转换:

  以往在 from 表单提交的时候,都会有字符串、数字、还有时间格式等信息。 往往如果是数字提交的话底层会自动帮我们把类型进行了隐式转换。

  但是日期格式的却不能自动转换,这就需要我们自己来处理。这里介绍三种方式转换。

案例目录结构:

技术分享图片

 

各类中的内容及配置:

ControllerWelcome 类:

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

import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * @author asus
 */
@Controller
@RequestMapping("/user")
public class ControllerWelcome{
    @RequestMapping("/index")
    public ModelAndView demo(String userName, String userPwd, Date date)
    {
        String format = new SimpleDateFormat("yyyy-MM-dd").format(date);
        System.out.println(format);
        System.out.println("userName:>"+userName);
        System.out.println("userName:>"+userPwd);
        System.out.println("userName:>"+date);
        ModelAndView modelAndView=new ModelAndView("Welcome");
        modelAndView.addObject("a",userName);
        modelAndView.addObject("b",userPwd);
        modelAndView.addObject(date);
        return modelAndView;
    }
}

Spring-view.xml 配置文件:


       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    package="controller"/>
    
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        

web.xml 配置:

span>app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
Archetype Created Web ApplicationencodingFilterclass>org.springframework.web.filter.CharacterEncodingFilterclass>
    encodingUTF-8forceEncodingtrueencodingFilter    /*mvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath*:Spring-*.xml1mvc/

index.jsp 页面:



用户名: 密码: 日期:

Welcome.jsp 页面

Title
用户名:${a}

密码:${b}

日期:${date}


在这之前我们情趣提交 from 表单的时候肯定会报错,因为入参的类型不匹配,无法转换Date类型。(默认为 2018/05/05 格式可以自动转换,但是 2018-05-05、... 就不能转换了会报如下图所示的错:)

技术分享图片

技术分享图片

 

下面我们来看第一种处理方式:基于XML 配置的方式

添加自定义类型转换类:

package uitl;
import org.springframework.beans.TypeMismatchException;
import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;
import java.util.regex.Pattern;
/**
 * 自定义类型转换
 * @author asus
 */
public class MyConvertDate implements Converter {
    @Override
    public Date convert(String source) {
        SimpleDateFormat simpleDateFormat = getDate(source);
        Date date = null;
        try {
            date = simpleDateFormat.parse(source);
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return date;
    }
    private SimpleDateFormat getDate(String source) {
        SimpleDateFormat simpleDateFormat = null;
        if (Pattern.matches("\\d{4}/\\d{2}/\\d{2}",source)) {
            simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
        } else if (Pattern.matches("\\d{4}-\\d{2}-\\d{2}",source)) {
            simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        } else if (Pattern.matches("\\d{4}\\d{2}\\d{2}",source)) {
            simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        } else {
            throw new TypeMismatchException("", Date.class);//三种类型不匹配则报异常
        }
        return simpleDateFormat;
    }
}

添加 Spring-conversion.xml 配置文件:


       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    
    class="uitl.MyConvertDate"/>

    class="org.springframework.context.support.ConversionServiceFactoryBean">
        

 输入我们自定义的三种格式都可以转换。

 

下面我们来看第二种处理方式:使用@InitBinder装配自定义编辑器(使用第二种就不要上述的配置文件了)

添加一个编辑器类:BaseControllerDate

package controller;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import uitl.MyEditor;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 使用@InitBinder装配自定义编辑器
 * @author asus
 */
public class BaseControllerDate{
    /**
     * 在服务器启动的时候就会加载该方法
     * @param
     */
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder)
    {
        System.out.println("InitBinder装配自定义编辑器父级的我被加载了------------");
        webDataBinder.registerCustomEditor
                (Date.class,new CustomDateEditor(
                        new SimpleDateFormat("yyyy-MM-dd"),true));
    }
}

 让Controller 层去集成 BaseControllerDate 类。但是这种方式也只能实现一种格式,有局限性。

 

下面我们来看第三种处理方式:使用@InitBinder装配自定义编辑器升级版+编辑器类

添加:MyEditor 类:

package uitl;
import org.springframework.beans.propertyeditors.PropertiesEditor;
import org.springframework.beans.TypeMismatchException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;
/**
 * 自定义编辑器
 * @author asus
 */
public class MyEditor extends PropertiesEditor {
    @Override
    public void setAsText(String source) throws IllegalArgumentException {

        SimpleDateFormat sdf=getDate(source);
        Date date=null;
        try {
            date = sdf.parse(source);
            setValue(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    private SimpleDateFormat getDate(String source) {
        SimpleDateFormat sdf=null;
        if (Pattern.matches("\\d{4}/\\d{2}/\\d{2}",source)){
            sdf=new SimpleDateFormat("yyyy/MM/dd");
        }else if (Pattern.matches("\\d{4}-\\d{2}-\\d{2}",source)){
            sdf=new SimpleDateFormat("yyyy-MM-dd");
        }else if(Pattern.matches("\\d{4}\\d{2}\\d{2}",source)){
            sdf=new SimpleDateFormat("yyyyMMdd");
        }else {
            throw  new TypeMismatchException("",Date.class);
        }
        return  sdf;
    }
}

修改 BaseControllerDate类为:

@InitBinder
    public void initBinder(WebDataBinder wdb){
        System.out.println("----------------");
        wdb.registerCustomEditor(Date.class,new MyEditor());
    }

 

 

以上就是对日期格式类型的转换,若有不足之处请多多指教;

 

分享知识-快乐自己:SpringMvc中 页面日期格式到后台的类型转换

标签:obj   path   Servle   --   ignore   升级版   class   转换   字符串   

原文地址:https://www.cnblogs.com/mlq2017/p/9690128.html


评论


亲,登录后才可以留言!