我們在使用SpringMVC時,常常需要把表單中的參數(shù)映射到我們對象的屬性中翔烁,我們可以在默認(rèn)的spring-servlet.xml加上如下的配置即可做到普通數(shù)據(jù)類型的轉(zhuǎn)換,如將String轉(zhuǎn)換成Integer和Double等:
<mvc:annotation-driven />
或
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
其實 <mvc:annotation-driven /> 標(biāo)簽會默認(rèn)創(chuàng)建并注冊一個 RequestMappingHandlerMapping(在Spring3.2之前是DefaultAnnotationHandlerMapping) 和 RequestMappingHandlerAdapter (Spring3.2之前是AnnotationMethodHandlerAdapter)怀泊,當(dāng)然拯刁,如果上下文有對應(yīng)的顯示實現(xiàn)類,將該注解注冊的覆蓋掉纵揍。該注解還會創(chuàng)建一個ConversionService顿乒,即 FormattingConversionServiceFactoryBean。
如果想把一個字符串轉(zhuǎn)換成指定的日期格式泽谨,spring沒有提供這樣默認(rèn)的功能璧榄,我們需要自定義類型轉(zhuǎn)換器特漩。
規(guī)定將字符串轉(zhuǎn)換成日期類的格式為: yyyyMMdd,那么接下來就寫一個類型轉(zhuǎn)換器骨杂,需要實現(xiàn)一個接口org.springframework.core.convert.converter.Converter
package com.howick.springmvc.converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;
public class DateTypeConverter implements Converter<String, Date>{
//泛型S表示source源類型 涂身,T表示target目標(biāo)類型
@Override
public Date convert(String source) {
Date date=null;//聲明返回類型
if(source!=null||!"".equals(source))
{
//source--date
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");//這里指定的模式和客戶端提交的數(shù)據(jù)模式要一樣
try {
date=sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
}
return date;
}
}
接下來編寫控制器
package com.howick.springmvc.controller;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class UserController {
@RequestMapping("/test.do")
public void test(@RequestParam(value="id")Integer ids,
@RequestParam(value="username")String usernames,Date birthday)
{
System.out.println("ids:"+ids);
System.out.println("usernames:"+usernames);
System.out.println("birthday:"+birthday);
}
}
這里可以看到,參數(shù)的名字為birthday搓蚪,所以要為請求定義一個birthday參數(shù)蛤售,該參數(shù)傳入需要轉(zhuǎn)換的字符串
除此之外,我們還需要在springmvc配置文件中配置妒潭,如下內(nèi)容悴能。讓轉(zhuǎn)換器生效
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 掃描注解 -->
<context:component-scan base-package="com.howick"></context:component-scan>
<!-- 視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 將轉(zhuǎn)換器注入到適配器,要先管理進(jìn)來 自定義轉(zhuǎn)換雳灾,可以做很多的轉(zhuǎn)換漠酿,他類似于工廠 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 自定義轉(zhuǎn)換器集合 -->
<property name="converters">
<set>
<bean class="com.howick.springmvc.converter.DateTypeConverter" />
</set>
</property>
</bean>
</beans>
也可以使用配置ConversionServiceFactoryBean。雖然可以這樣谎亩,但不建議炒嘲。我們通常用
為什么要這樣用呢?這樣用的好處是什么呢匈庭?
使用FormattingConversionServiceFactoryBean可以讓SpringMVC支持@NumberFormat和@DateTimeFormat等Spring內(nèi)部自定義的轉(zhuǎn)換器夫凸。