系統:WIN8.1
開發工具:MyEclipse 8.6
框架:Spring3.2.9、SpringMVC3.2.9、MyBatis3.2.8
使用SpringMVC開發的時候,頁面如果有日期格式的數據,后臺接受也是java.util.Date,則報告400錯誤。下面是解決方案的演示示例:
這個是實體類,里面createDate就是java.util.Date類型
1 import java.util.Date; 2 3 public class User { 4 5 private int userId; 6 private String userName; 7 private Date createDate; 8 9 public User() {}10 11 public User(int userId, String userName, Date createDate) {12 super();13 this.userId = userId;14 this.userName = userName;15 this.createDate = createDate;16 }17 18 public User(String userName, Date createDate) {19 super();20 this.userName = userName;21 this.createDate = createDate;22 }23 24 public int getUserId() {25 return userId;26 }27 28 public void setUserId(int userId) {29 this.userId = userId;30 }31 32 public String getUserName() {33 return userName;34 }35 36 public void setUserName(String userName) {37 this.userName = userName;38 }39 40 public Date getCreateDate() {41 return createDate;42 }43 44 public void setCreateDate(Date createDate) {45 this.createDate = createDate;46 }47 48 @Override49 public String toString() {50 return "User [createDate=" + createDate + ", userId=" + userId51 + ", userName=" + userName + "]";52 }53 }
頁面代碼
1 <form action="regUser" method="post">2 userName:<input type="text" name="userName"/><br>3 createDate:<input type="text" name="createDate"/><br>4 double類型:<input type="text" name="dd"/><br>5 <input type="submit" value="注冊">6 </form>
因為對于原生基本類型的form表單綁定,會出錯。需要指定具體的類型編輯器。用法如下:首先在BaseController中增加方法initBinder,并使用注解@InitBinder標注,那么spring mvc在綁定表單之前,都會先注冊這些編輯器。剩下的控制器都繼承該類。CustomDateEditor spring自己已經提供了。代碼如下:
1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 4 import org.springframework.beans.propertyeditors.CustomDateEditor; 5 import org.springframework.stereotype.Controller; 6 import org.springframework.web.bind.WebDataBinder; 7 import org.springframework.web.bind.annotation.InitBinder; 8 9 import sun.beans.editors.DoubleEditor;10 import sun.beans.editors.FloatEditor;11 import sun.beans.editors.IntEditor;12 import sun.beans.editors.LongEditor;13 14 @Controller15 public class BaseController {16 17 @InitBinder 18 public void initBinder(WebDataBinder binder) { 19 20 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); 21 binder.registerCustomEditor(int.class, new IntEditor());22 binder.registerCustomEditor(long.class, new LongEditor()); 23 binder.registerCustomEditor(double.class, new DoubleEditor()); 24 binder.registerCustomEditor(float.class, new FloatEditor()); 25 }26 27 28 }
上面的代碼不僅僅有日期格式的編輯器,還有基礎類型的編輯器,這樣就解決了SpringMVC中controller方法接受參數的時候,基礎類型報錯的問題了。
下面是測試用代碼,繼承BaseController之后就可以直接運行了。接受的參數有實體類和基礎類型。
1 import org.springframework.stereotype.Controller; 2 import org.springframework.web.bind.annotation.RequestMapping; 3 4 import com.kickstarter.entity.User; 5 6 @Controller("userController") 7 public class UserController extends BaseController{ 8 9 @RequestMapping(value="regUser")10 public String dateTest(User user ,double dd){11 12 System.out.println( user.toString() );13 System.out.println( dd );14 return "index"; 15 }16 }
以上,問題解決。然后我們切換第二種方式,刪除 BaseController這個類,直接在User實體類中的createDate字段上加上注解,注意第10行代碼:
1 import java.util.Date; 2 3 import org.springframework.format.annotation.DateTimeFormat; 4 5 public class User { 6 7 private int userId; 8 private String userName; 9 10 @DateTimeFormat(pattern="yyyy-MM-dd")11 private Date createDate;12 13 public User() {}14 15 public User(int userId, String userName, Date createDate) {16 super();17 this.userId = userId;18 this.userName = userName;19 this.createDate = createDate;20 }21 22 public User(String userName, Date createDate) {23 super();24 this.userName = userName;25 this.createDate = createDate;26 }27 28 public int getUserId() {29 return userId;30 }31 32 public void setUserId(int userId) {33 this.userId = userId;34 }35 36 public String getUserName() {37 return userName;38 }39 40 public void setUserName(String userName) {41 this.userName = userName;42 }43 44 public Date getCreateDate() {45 return createDate;46 }47 48 public void setCreateDate(Date createDate) {49 this.createDate = createDate;50 }51 52 @Override53 public String toString() {54 return "User [createDate=" + createDate + ", userId=" + userId55 + ", userName=" + userName + "]";56 }57 }
這樣也可以解決日期格式報400問題。而且不管頁面是否有數據都可以正常使用。
|
新聞熱點
疑難解答