虽然SpringMVC可以自动绑定多种数据类型,但是有时候有些特殊的数据类型还是会在绑定时发生错误,需要我们自己书写类型转换完成绑定。
SpringMVC中提供两种绑定方式:以时间转换为例。
1、属性编辑器(传统方式)
控制器:
1 @RequestMapping(value="/login.do") 2 public String login(UserBean user){ 3 log.info(user.getUsername()); 4 log.info(user.getBirthday()); 5 return "index"; 6 } 7 // 自定义一个属性编辑器,用于转换时间类型 8 @InitBinder 9 public void converterStringDate(WebDataBinder binder){ 10 binder.registerCustomEditor(Date.class, new DateEditor()); 11 }
可以通过重写PropertyEditorSupport中的setAsText()定义自己的转换规则
1 package com.cy.springannotation.controller; 2 3 import java.beans.PropertyEditorSupport; 4 import java.text.ParseException; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 8 public class DateEditor extends PropertyEditorSupport { 9 10 @Override 11 public void setAsText(String text) throws IllegalArgumentException { 12 Date date = null; 13 try { 14 if(text.contains("-")){ 15 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); 16 date = sf.parse(text); 17 }else { 18 SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy"); 19 date = sf.parse(text); 20 } 21 } catch (ParseException e) { 22 e.printStackTrace(); 23 } 24 this.setValue(date); 25 } 26 27 }
2、类型转换器
Converter是Spring3提供的新的类型转换,相对于属性转换器更强大,可以把任意类型转换,而不是局限于String类型。
控制器:
1 @RequestMapping(value="/login.do") 2 public String login(UserBean user){ 3 log.info(user.getUsername()); 4 log.info(user.getBirthday()); 5 return "index"; 6 } 7
全局类型转换器
1 package com.cy.springannotation.controller; 2 3 import java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 7 import org.springframework.core.convert.converter.Converter; 8 /** 9 * 全局类型转换器 10 * @author acer 11 * 12 */ 13 public class DateConvert implements Converter<String, Date>{ 14 @Override 15 public Date convert(String text) { 16 Date date = null; 17 try { 18 if(text.contains("-")){ 19 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); 20 date = sf.parse(text); 21 }else { 22 SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy"); 23 date = sf.parse(text); 24 } 25 26 } catch (ParseException e) { 27 e.printStackTrace(); 28 } 29 return date; 30 } 31 32 }
类型转换器需要在配置文件中配置:
1 <!--开启注解 --> 2 <mvc:annotation-driven conversion-service="tc" /> 3 4 <!--类型转换器工厂 --> 5 6 <bean id="tc" class="org.springframework.context.support.ConversionServiceFactoryBean"> 7 <property name="converters"> 8 <list> 9 <bean class="com.cy.springannotation.controller.DateConvert" /> 10 </list> 11 </property> 12 </bean>
共同的jsp页面:
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 <title>登录页面</title> 12 <script type="text/javascript" src="<%=basePath%>js/jquery-2.1.4.js"></script> 13 <script type="text/javascript"> 14 15 16 </script> 17 </head> 18 <body> 19 <form action="login.do" method="post"> 20 <table> 21 <tr> 22 <td>用户名:</td> 23 <td><input type="text" name="username"/></td> 24 </tr> 25 <tr> 26 <td>出生日期</td> 27 <td><input type="text" name="birthday"/></td> 28 </tr> 29 <tr> 30 <td colspan="2"> <input type="submit" value="提交"/> </td> 31 </tr> 32 </table> 33 </form> 34 </body> 35 </html>
结果显示: