我們在使用SpringMVC時,常常需要把表單中的參數映射到我們對象的屬性中,我們可以在預設的spring-servlet.xml加上如下的配置即可做到普通資料類型的轉換,如将String轉換成Integer和Double等:
<mvc:annotation-driven />
或
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
其實 <mvc:annotation-driven /> 标簽會預設建立并注冊一個RequestMappingHandlerMapping(在Spring3.2之前是DefaultAnnotationHandlerMapping) 和 RequestMappingHandlerAdapter (Spring3.2之前是AnnotationMethodHandlerAdapter),當然,如果上下文有對應的顯示實作類,将該注解注冊的覆寫掉。該注解還會建立一個ConversionService,即FormattingConversionServiceFactoryBean。
但如果你想将字元串映射成對象中的時間對象Date,Spring預設沒有提供這種功能,需要你自己實作,即自定義轉換器:
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.convert.converter.Converter;
/**
* 字元串到日期的轉換器
* @author manzhizhen
*
* 2015年6月4日
*/
public class StringToDateConverter implements Converter<String, Date>{
public StringToDateConverter() {
System.out.println("轉換器我出生啦");
}
@Override
public Date convert(String source) {
if(StringUtils.isBlank(source)) {
return null;
}
Date date = null;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
date = format.parse(source.trim());
} catch (Exception e) {
try {
format = new SimpleDateFormat("yyyyMMddHHmmss");
date = format.parse(source.trim());
} catch (Exception e1) {
try {
format = new SimpleDateFormat("yyyy-MM-dd");
date = format.parse(source.trim());
} catch (Exception e2) {
}
}
}
return date;
}
}
測試用的資料對象如下:
package com.manzhizhen.beans;
import java.io.Serializable;
import java.util.Date;
/**
* 傳參對象
* @author 易振強
*
* 2015年6月10日
*/
public class ParamObj implements Serializable {
private static final long serialVersionUID = -7850639976682528281L;
private Date date;
private Double ratio;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Double getRatio() {
return ratio;
}
public void setRatio(Double ratio) {
this.ratio = ratio;
}
}
控制器的測試代碼如下:
package com.manzhizhen.controllers;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.manzhizhen.beans.ParamObj;
/**
* 測試控制器
* @author manzhizhen
*
* 2015年6月10日
*/
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value="/inputstr.htm", method=RequestMethod.POST)
public ModelAndView deal(HttpServletRequest request, ParamObj paramObj) {
ModelAndView mv = new ModelAndView();
System.out.println(paramObj);
mv.setViewName("/test/test.jsp");
return mv;
}
@ExceptionHandler(Exception.class)
public void ExceptionHandler(Exception e) {
System.out.println(e);
}
}
測試頁面index.jsp:
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8" language="java" %>
<html>
<head></head>
<body style="width:80%;margin:10 auto">
<form action="test/inputstr.htm" method="post" >
<input type="text" value="2015-01-02" id="date" name="date"/>
<input type="text" value="3.04" id="ratio" name="ratio"/>
<input type="submit" value="submit" />
</form>
</body>
</html>
準備好以上内容後,我們開始對SpringMVC的預設配置檔案spring-servlet.xml進行配置了,加上如下内容:
<bean id="myConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.manzhizhen.converters.StringToDateConverter"/>
</list>
</property>
</bean>
<mvc:annotation-driven conversion-service="myConversionService" />
注意,隻能配置一個mvc:annotation-driven,誰先配置誰先生效,是以請去掉其他的 <mvc:annotation-driven />。