SpringMVC日期時間格式化方式
阿新 • • 發佈:2019-01-06
### 引入
平時,在寫前端頁面時,很有可能會涉及到表單中有日期的情況,一般情況下不同的業務使用的日期格式都有所不同。下面看下一個簡單的例子說明SpringMVC對日期的處理。
jsp頁面如下(簡單的表單,其中有一個輸入框中輸入的是日期時間):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv ="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<form id="addForm" action="<c:url value='/doAdd'/>" method="POST" >
<input type="text" name="name" value="測試"/>
<input type="text" name="birthtime" value="2017-10-10 10:10"/>
<button type="submit" >儲存</button>
</form>
</body>
</html>
``
POJO如下:
```java
public class User{
private String name;
private Date birthtime;
// 屬性的setter/getter方法略
}
<div class="se-preview-section-delimiter"></div>
Controller如下:
@Controller
public class TestFileController {
@RequestMapping("/doAdd")
public void doAdd(@ModelAttribute User user, HttpServletRequest request){
System.out.println(user.getName());
System.out.println(user.getBirthtime());
}
}
<div class="se-preview-section-delimiter"></div>
此時,SpringMVC會爆出異常:
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object ‘user’ on field ‘birthtime’: rejected value [2017-10-10 10:10]; codes [typeMismatch.user.birthtime,typeMismatch.birthtime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.birthtime,birthtime]; arguments []; default message [birthtime]]; default message [Failed to convert property value of type ‘java.lang.String’ to required type ‘java.util.Date’ for property ‘birthtime’; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type java.util.Date for value ‘2017-10-10 10:10’; nested exception is java.lang.IllegalArgumentException]
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:113)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:78)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:111)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:806)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:729)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
此異常是什麼意思呢?很明顯,輸入的字串’2017-10-10 10:10’不能轉換為Date型別。所以下面要做的就是把前端的字串形式的日期轉換為java.util.Date型別。
SpringMVC日期處理
處理前端到控制器的日期有兩種方式:(當前不止兩種了!)
1. 在控制器中使用@InitBind註解
2. 在POJO中日期屬性上新增@DateTimeFormat
方式1:在控制器中使用@InitBind註解
@Controller
public class TestFileController {
@InitBinder
public void initBind(WebDataBinder binder){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
@RequestMapping("/doAdd")
public void doAdd(@ModelAttribute User user, HttpServletRequest request){
System.out.println(user.getName());
System.out.println(user.getBirthtime());
}
}
<div class="se-preview-section-delimiter"></div>
方式2:在POJO中日期屬性上新增@DateTimeFormat
public class User{
private String name;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date birthtime;
// 屬性的setter/getter方法略
}