天天看點

springmvc 之 自定義類型轉換

1,自定義類型轉換

配置xml

<!-- 注冊自定義的轉換類 -->
<bean id="myconverter" class="com.springmvc.conver.MyConver">
    <!-- 将自定義類型轉換器添加到conversionServiceFactoryBean中 -->
<bean id="conversionService"    
    class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
    <ref bean="myconverter"/><!-- 将自定義轉換類引入轉換器 -->
</set>
</property>
</bean>
<!-- 注冊類型轉換器 -->
<mvc:annotation-driven conversion-service="conversionService" />
           

定義自己的轉換類

Spring定義了3種類型的轉換器接口,實作任意一個轉換器接口都可以作為自定義轉換器注冊到ConversionServiceFactoryBean中。

Converter<S,T>:将S類型轉換為T類型。

ConverterFactory:将相同系列的多個“同質”Converter封裝在一起,如果希望一種類型轉換成另一種類型及其子類對象(例如String轉換為Number及Number的子類(Integer,Long,Double等)),可以使用該轉換器工廠。

GenericConverter:會根據源類對象及目标類對象所在的宿主類中的上下文資訊進行類型轉換。

這裡将字元串類型的時間轉換為date類型

@Component
public class MyConverter implements Converter<String, Date> {
	@Override
	public Date convert(String text) {
		Date date = null;
		try {
		    if (text.contains("-")) {
			    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
			    date = sf.parse(text);
		    } else {
			    SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
			    date = sf.parse(text);
		    }
		} catch (Exception e) {
		    e.printStackTrace();
		}
		return date;
	}
}
           

接收資料的方法

@RequestMapping(value = "/getDate",method = RequestMethod.POST)
	public String getDate(Date date) {
		System.out.println(date);
		return "redirect:/list";
	}
           

如果轉換失敗也可以用BindingResult來捕獲

@RequestMapping(value = "/getDate",method = RequestMethod.POST)
public String register(Date date,BindingResult result){
	if(result.getErrorCount() > 0){
		for (FieldError error : result.getFieldErrors()) {
		    System.out.println(error.toString());
		}
	}
	System.out.println("date:" + date);
	return “register";
}
           

資料格式化

對屬性的輸入/輸出格式化,其本質來講依然屬于類型轉換的範疇。

Spring在格式化子產品中定義了一個實作ConversionService接口的FormattingConversionService實作類,該實作類擴充了GenericConversionService,是以它即具有類型轉換的功能又具有格式化的功能。

FormattingConversionService擁有一個FormattingConversionServiceFactoryBean工廠類,後者用于構造前者。

FormattingConversionServiceFactoryBean内部已經注冊了:

支援數字類型的屬性用@NumberFormat注解。

支援日期類型的屬性使用@DateTimeFormat注解。

<!-- 注冊格式化工廠 -->
<bean id="myconverter" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 引用格式化工廠 -->
<mvc:annotation-driven conversion-service="format" />
           

裝配了FormattingConverstionServiceFactoryBean後,就可以在SpringMVC形參綁定及模型資料輸出時使用注解驅動了。

日期格式化

@DateTimeFormat注解可以對日期類型進行格式化。

pattern屬性:類型為字元串,指定解析/格式化字段資料的模式。如”yyyy-MM-dd hh:mm:ss“。

iso屬性:解析格式化的ISO模式。

ISO.DATE 等于 (yyyy-MM-dd)

ISO.TIME 等于(hh:mm:ss.SSSZ)

ISO.DATE_TIME 等于 (yyyy-MM-dd hh:mm:ss.SSSZ)

ISO.NONE 等于 (不使用)

style屬性:字元串類型,通過樣式指定日期時間的格式,由兩位字元組成,第一位表示日期的格式,第二位表示時間的格式。

S:短日期時間格式

M:中日期時間格式

L:長日期時間格式

F:完整日期時間格式

-:忽略日期時間格式

如:

//加在需要轉換格式的屬性類的字段上
	//@DateTimeFormat(iso = ISO.DATE_TIME)
	//@DateTimeFormat(style = "F")
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private Date date;
           

數字格式化

@NumberFormat可對類似數字類型的屬性進行标注,它擁有兩個互斥的屬性。

patten:類型為String,自定義樣式,如”#,##”,#代表數字。

style:類型為NumberFormat.Style。用于指定樣式類型,包括三種。

Style.NUMBER:正常數字類型。

Style.CURRENCY:貨币類型。

Style.PERCENT:百分比類型。

用法和上面的日期格式化相同

關于mvc:annotation-driven

<mvc:annotation-driven />會自動注冊以下三個Bean對象。

RequestMappingHandlerMapping

RequestMappingAdapter

ExceptionHandlerExceptionResolver

還将提供一下支援

支援使用ConversionService執行個體對表單參數進行執行個體轉換。

支援使用@NumberFormatannotation、@DataFormatannotation注解完成資料類型的格式化。

支援使用@Valid注解對JavaBean執行個體進行JSR303驗證。

支援使用@ReuqestBody和@ResponseBody注解。

<!--配置直接通路頁面-->
<!--可以直接相應的轉發頁面,而無需再經過控制器-->
<mvc:view-controller path="/viewpath" view-name="viewname" />
<!--實際開發中通常都需要配置mvc:annotation-driven标簽(注解驅動)-->
<mvc:annotation-driven />
<!--當靜态資源檔案被攔截需要配置該标簽-->
<mvc:default-servlet-handler/>
           

繼續閱讀