zoukankan      html  css  js  c++  java
  • (十七)springMvc 对表单提交的日期以及JSON中的日期的参数绑定


    前言

    springMVC 提供强大的参数绑定功能,使得我们从 request 中获取参数解放出来 ;

    前端一般有两种形式提交数据到后台:Ajax提交表单数据、Ajax提交JSON 格式数据

    springMvc 也都支持它们的参数绑定;

    但是springmvc 也不是什么形式,都能进行绑定的,比如今天要讲的日期类型,就是一个;

    今天讲的,日期,都是前端 传字符串形式 的日期,后台使用 java.util.Date 接收的情况;这种情况应该也是最常见的了,毕竟前端一般也不会自己费事的把字符串转成日期,再传给后台;


    Ajax提交表单数据

    针对这种情况,在 po 类的 日期字段 上,添加注解 @DateTimeFormat(pattern="yyyy/MM/dd") 根据自己情况,写具体的日期格式;

    上面的仅仅对一个 po 类有效,如果你有很多 po 类,都有日期,则直接写一个日期转换类,然后注册到 springMvc 的配置文件里面,一劳永逸 ;

    转换类如下:

    import org.springframework.core.convert.converter.Converter;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * 完成日期绑定,全局的 ,替换掉  @DateTimeFormat(pattern = "yyyy/MM/dd")
     *
     * @author yiaz
     * @date 2019年1月15日10:05:36
     */
    public class DateConverter implements Converter<String, Date> {
        /**
         * 日期转换类
         */
        private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd");
    
        @Override
        public Date convert(String source) {
            try {
                return simpleDateFormat.parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
    //        转换失败,就返回 null  ;
            return null;
        }
    
    }
    
    

    注册到配置文件里面

     <!--配置 自定义 参数绑定(日期转换)-->
        <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="conversionService">
            <!--写上自定义的转换器-->
            <property name="converters">
                <list>
                    <!--日期 转换 -->
                    <bean class="cn.hyc.utils.DateConverter"/>
                </list>
            </property>
        </bean>
    
     <!--添加到 MVC 注解里面-->
    <mvc:annotation-driven validator="validator" conversion-service="conversionService">
    

    这样就 OK 了


    Ajax提交JSON 格式数据

    在使用 @Request 进行 JSON 数据参数绑定的时候,对日期,需要另作操作;

    否则就会报 400 bad request,请求也不会进后台方法;

    po 类的 日期字段的get方法 上 添加 @JsonFormat(pattern="yyyy/MM/dd")


    解决输出JSON乱码的问题

    我们发现即使,我们在 web.xml 中配置了解决乱码的拦截器,但是输出JSON 到前台的时候,JSON 中的中文还会乱码 ;

    这与我们配置的过滤器无关了,我 猜测 是在JSON转换器内部,它默认了ISO-8859编码,导致过滤器在拿到数据的时候,就已经是乱码的数据了。它再使用UTF8编码,最终也还是乱码,除非它能智能的先ISO-8859解码,再UTF8编码。

    为了解决这个问题,我们需要在springMvc.xml 中的 MVC 注解标签中配置JSON转换器,制定编码为UTF8

        <mvc:annotation-driven validator="validator" conversion-service="conversionService">
            <mvc:message-converters>
                <!-- 处理请求返回json字符串的中文乱码问题 -->
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            </mvc:message-converters>
        </mvc:annotation-driven>
    

    控制JSON输出日期格式

    默认JSON对日期的转换是个毫秒数,距离 1970-01-01 的毫秒数,比如:187982355421 这样的long数字 ;

    而我们显然不想要这样的数据,我们想要 2019-12-122008/08/08 这样的格式;

    不同的 JSON 对这方面的实现不一样,博主使用的是 阿里fastJson ,使用 @JSONField(format = "yyyy/MM/dd") 注解,在 po 类的日期字段上,即可控制输出的JSON中的日期格式 ;


    小记

    注意哦,对日期进行绑定的时候,JSON 是在 字段 get 方法 上添加注解,表单是在 字段 上添加注解!


    最后在附加一点;

    上面的方法,都是前台传来 JSON ,然后转成对象,指定 JSON 中的日期格式,以便正确的转换日期对象;

    如果反过来呢,对象转成JSON,直接转换的话 data 类型,就会被转成 183138913131 这样long 类型的一串数字,我们也可以指定转成 JSON 串中 data 的格式:@JSONField(format = "yyyy-MM-dd")


    后记:

      /**
         * JSON -> 对象,指定JSON 中日期格式,以便转成对象
         */
        @DateTimeFormat(pattern = "yyyy/MM/dd")
        /**
         * 对象 -》 JSON 指定转换以后的字符串中日期对象的格式
         */
        @JSONField(format = "yyyy-MM-dd")
        private Date newsTime;
    
  • 相关阅读:
    cookie和session会话技术
    hdoj 1176 免费馅饼
    nyoj 14 会场安排问题
    hdoj 1575 Tr A
    poj 1163 The Triangle
    hdoj 2157 How many ways??
    贪心Poj1328
    贪心 序列
    差分约束Poj 3169 Layout
    差分约束Poj3159 Candies
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665604.html
Copyright © 2011-2022 走看看