前言

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;

(十七)springMvc 对表单提交的日期以及JSON中的日期的参数绑定的更多相关文章

  1. php form表单提交时,action url中参数无效的解决方法

    表单提交时get方式的一个错误 <form class="form-inline pull-right" method="get" action=&quo ...

  2. 如何使用AngularJS对表单提交内容进行验证

    AngularJS是一款优秀的前端JS框架,已经被用于Google的多款产品当中.它有着诸多特性,最为核心的是:MVC.模块化.自动化双向数据绑定.语义化标签.依赖注入等……使用它可以大大减少书写代码 ...

  3. springmvc 表单提交

    Spring MVC自带的表单标签比较简单,很多时候需要借助EL和JSTL来完成. 下面是一个比较简单的表单提交页面功能: 1.User model package com.my.controller ...

  4. PHP对表单提交特殊字符的过滤和处理

    PHP关于表单提交特殊字符的处理方法做个汇总,主要涉及htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_str ...

  5. Jquery表单提交后获取返回Json值

    1.给form添加id值: <form action="/News/SaveMessage" method="post" accept-charset=& ...

  6. JSP将表单提交并在本页中显示

    代码如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8& ...

  7. springMvc返回Json中自定义日期格式

    (一)输出json数据 springmvc中使用jackson-mapper-asl即可进行json输出,在配置上有几点: 1.使用mvc:annotation-driven 2.在依赖管理中添加ja ...

  8. JSON中的日期格式化

    Json字符串中的日期格式化函数 ConvertJsonDate: function (jd) { var d = new Date(parseInt(jd.replace("/Date(& ...

  9. 【教训】 form表单提交时,action url中参数无效

    今天提交一个表单,内容参考如下: <form action="add.php?a=123&b=456">     <input type="hi ...

随机推荐

  1. 2019 ASP.NET / ASP.NET Core 学习路线 (有中文翻译)

    1. 点击此处查看 一个了不起的.NET Core 库.工具.框架和软件的集合 2. 以下路线 适用于 ASP NET 与 ASP NET Core (建议另存为到本地, 然后再查看) 点击此处查看 ...

  2. (二)SQL学习之数据定义类SQL

    以mysql为例 对数据库的常用操作 创建数据库:CREATE DATABASE mydb; 删除数据库:DROP DATABASE mydb; 切换数据库:USE mydb; 查询数据库:SHOW ...

  3. 第K个幸运数(京东2017秋招真题)

    题目 4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字.前几个幸运数字为:4,7,44,47,74,77,444,447... 现在输入一个数字K,输出第K个幸 ...

  4. dubbo线程模型配置

    首先了解一下dubbo线程模型 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识.则直接在IO线程上处理更快,因为减少了线程池调度. 但如果事件处理逻辑较慢,或者需要发 ...

  5. springIoC注解

    一.通过注解注入Bean @Component:组件(spring扫描包下有该注解的类) @ComponentScan(包名):组件扫描(spring扫描该包名下的类) @Configuration: ...

  6. Linux openkvm disk expansion

    How to Increase the size of a Linux LVM by expanding the virtual machine disk https://www.rootusers. ...

  7. Centos7搭建OpenNebula云平台

    OpenNebula概述 OpenNebula是专门为云计算打造的开源系统,用户可以使用Xen.KVM.VMware等虚拟化软件一起打造企业云.利用OpenNebula可以轻松构建私有云.混合云.公开 ...

  8. ES6深入浅出-4 迭代器与生成器-2.Symbol 和迭代器

    symbol https://zhuanlan.zhihu.com/p/22652486 Es5中的数据类型,所有的复杂类型都是对象类型. ES6里面增加了symbol类型,用处不多. https:/ ...

  9. C++数据存储方式

    1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区,里面的变量通常是局部变量.函数参数等. 2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去 ...

  10. 转 mysql 存储过程初探

    https://www.cnblogs.com/qmfsun/p/4838032.htmlMySQL命令执行sql文件的两种方法 https://www.cnblogs.com/mark-chan/p ...