zoukankan      html  css  js  c++  java
  • 分享知识-快乐自己:SpringMvc中 页面日期格式到后台的类型转换

    日期格式的类型转换:

      以往在 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 配置文件:

    <?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: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">
        <!--指定Controller扫描器-->
        <context:component-scan base-package="controller"/>
        <!--配置试图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    </beans>

    web.xml 配置:

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <!--设置乱码-->
      <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      <!--设置核心控制器-->
      <servlet>
        <servlet-name>mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath*:Spring-*.xml</param-value>
        </init-param>
        <!--优先加载-->
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>mvc</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    </web-app>

    index.jsp 页面:

    <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
    <html>
    <body>
    <form action="/user/index">
        用户名:<input type="text" name="userName">
        密码:<input type="text" name="userPwd">
        日期:<input type="text" name="date">
        <input type="submit" value="提交">
    </form>
    </body>
    </html>

    Welcome.jsp 页面

    <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    用户名:${a}
    </br>
    密码:${b}
    </br>
    日期:${date}
    </br>
    </body>
    </html>

    在这之前我们情趣提交 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<String, Date> {
        @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 配置文件:

    <?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: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">
    
        <!--类型转换器-->
        <mvc:annotation-driven conversion-service="conversionService"/>
        <bean id="dateConvert" class="uitl.MyConvertDate"/>
    
        <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
            <property name="converters">
                <set>
                    <ref bean="dateConvert"/>
                </set>
            </property>
        </bean>
    
    </beans>

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

    下面我们来看第二种处理方式:使用@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());
        }

    提示: 若返回的JSON数据进行页面显示的话,可以配合 @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") 注解指定具体的日期格式  如:(yyyy-MM-dd)

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

  • 相关阅读:
    Dapper数据库字段和model属性映射
    SQLServer性能调优之缓存
    python&django 实现页面中关联查询小功能(基础篇)
    pythonのdjango select_related 和 prefetch_related()
    pythonのdjango 在控制台用log打印操作日志
    pythonのdjango Form简单应用。
    pythonのdjango 信号
    pythonのdjango 缓存
    pythonのdjango CSRF简单使用
    pythonのdjango Session体验
  • 原文地址:https://www.cnblogs.com/mlq2017/p/9690128.html
Copyright © 2011-2022 走看看