SpringMVC的参数绑定-日期格式转换
1、springMVC默认不支持页面上的日期字符串到后台的Date的转换
- 前台表单
出生日期<input type="date" name="birthday2"/><br/>
- 实体类 与 表单提交数据(字符串)的对应
2、有两种方式解决
(1)使用注解实现
注解日期类型转换器
@DateTimeFormat("格式")
只用修改 birthday2 日期属性,添加一个@DateTimeFormat(“格式”)
public class Person {
private int id;
private String username;
private String password;
private String city;
private Birthday birthday;
@DateTimeFormat(pattern ="yyyy-MM-dd")
private Date birthday2;
}
注解后面的格式怎么写?根据请求发送的真实数据写
如:“2020-10-14” 就写成 “yyyy-MM-dd”
(2)第二种自己编写 转换类,配置到springMVC(全局日期转换器)
编写自定义日期类型转换器实现步骤:
- 编写自定义转换器实现Converter重写方法,进行转换
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
//1:将页面上提交的日期字符串,转成Date对象
public class DateTimeFormatConverter implements Converter<String, Date> {
public Date convert(String s) {
System.out.println("convert "+s);
//2:转换器
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(s);//2020-10-14
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
- springmvc.xml中配置转换工厂,将我们的转换器设置到converters集合中
<!--注册转换器,并注入自定义的转换器-->
<bean id="formattingConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<!--配置自己自定义的转换器-->
<bean id="dateTimeFormatConverter" class="cn.cyl.util.DateTimeFormatConverter"></bean>
</set>
</property>
</bean>
- 将转换工厂对象挂载到处理器适配器上(挂载到注解驱动)
<!--springmvc注解驱动标签,引入转换器-->
<mvc:annotation-driven conversion-service="formattingConversionService"/>
3、后台Date数据到页面的转换
后台Date数据
List<Person> list = new ArrayList<Person>();
list.add(new Person(1,"jack","123456","北京",new Birthday(1998,1,1),new Date()));
list.add(new Person(2,"rose","123456","changsha",new Birthday(1998,2,2),new Date()));
前台表单
<c:forEach items="${list}" var="item" >
<tr>
<%--此格式输出的是系统日期格式--%>
<td>${item.birthday2}</td>
</tr>
</c:forEach>
前台显示
- 在前台表单添加日期格式化标签
(1)导入标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
(2)调用日期格式化标签
<fmt:formatDate value="${item.birthday2}" pattern="yyyy年MM月dd日"/>
前台表单
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:forEach items="${list}" var="item" >
<tr>
<%--调用日期格式化标签--%>
<td><fmt:formatDate value="${item.birthday2}" pattern="yyyy年MM月dd日"/></td>
</tr>
</c:forEach>
前台显示
注意:如果是要数据回显的话,就这样
生日:<input type="date" name="birthday" value="<fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd"/>">
将value的值设为这样就行