SpringMVC自定義類型轉(zhuǎn)換器

我們在使用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。雖然可以這樣谎亩,但不建議炒嘲。我們通常用\color{red}{org.springframework.format.support.FormattingConversionServiceFactoryBean}

為什么要這樣用呢?這樣用的好處是什么呢匈庭?
  使用FormattingConversionServiceFactoryBean可以讓SpringMVC支持@NumberFormat@DateTimeFormat等Spring內(nèi)部自定義的轉(zhuǎn)換器夫凸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市阱持,隨后出現(xiàn)的幾起案子夭拌,更是在濱河造成了極大的恐慌,老刑警劉巖紊选,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啼止,死亡現(xiàn)場離奇詭異,居然都是意外死亡兵罢,警方通過查閱死者的電腦和手機(jī)献烦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卖词,“玉大人巩那,你說我怎么就攤上這事〈蓑冢” “怎么了即横?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長裆赵。 經(jīng)常有香客問我东囚,道長,這世上最難降的妖魔是什么战授? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任页藻,我火速辦了婚禮桨嫁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘份帐。我一直安慰自己璃吧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布废境。 她就那樣靜靜地躺著畜挨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪噩凹。 梳的紋絲不亂的頭發(fā)上巴元,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音栓始,去河邊找鬼务冕。 笑死血当,一個胖子當(dāng)著我的面吹牛幻赚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播臊旭,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼落恼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了离熏?” 一聲冷哼從身側(cè)響起佳谦,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滋戳,沒想到半個月后钻蔑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡奸鸯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年咪笑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娄涩。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡窗怒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蓄拣,到底是詐尸還是另有隱情扬虚,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布球恤,位于F島的核電站辜昵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咽斧。R本人自食惡果不足惜堪置,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一贷洲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晋柱,春花似錦优构、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碑诉,卻和暖如春彪腔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背进栽。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工德挣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人快毛。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓格嗅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唠帝。 傳聞我的和親對象是個殘疾皇子屯掖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容