1. 程式人生 > >第四十章:Spring MVC框架之型別轉換13

第四十章:Spring MVC框架之型別轉換13

SpringMVC將“把請求引數注入到POJO物件”這個操作稱為“資料繫結”。
資料型別的轉換和格式化就發生在資料繫結的過程中。
型別轉換和格式化是密不可分的兩個過程,很多帶格式的資料必須明確指定格式之後才可以進行型別轉換。
最典型的就是日期型別。

1.使用SpringMVC內建的型別轉換器
①配置MVC註解驅動

<mvc:annotation-driven/>

②在需要進行轉換的欄位上標記特定的註解

@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birthday;
@NumberFormat(pattern="#,###,###.#")
private double salary;

2.轉換失敗後處理
①BindingResult

SpringMVC在捕獲到型別轉換失敗錯誤時會將相關資訊封裝到BindingResult物件傳入到目標handler方法中。

//Return if there were any errors.
boolean hasErrors();

在handler可以通過hasErrors()方法判斷是否有錯誤。如果有則跳轉到指定的頁面。當然如果有需要也可以獲取其他相關資訊。

使用BindingResult檢測繫結失敗錯誤

@RequestMapping("/convert")
public String convertFail(Employee employee, BindingResult bindingResult) {    	
	//檢測是否存在“資料繫結”錯誤
	boolean hasErrors = bindingResult.hasErrors();
	if(hasErrors) {    		
		return "error";    		
	}    	
	System.out.println(employee);    	
	return "target";
}

※千萬注意:這裡傳入Employee和BindingResult這兩個引數時中間不能有別的入參宣告。
②頁面顯示

[1]要藉助SpringMVC的form:form標籤

[2]在form:form標籤中要明確指定modelAttribute屬性。

[3]使用form:errors標籤,通過path屬性指定要顯示錯誤訊息的屬性名

在頁面上結合SpringMVC的表單標籤顯示錯誤訊息

<form:form modelAttribute="employee">
	<form:input path="age"/><form:errors path="age"/>
</form:form>

自動的型別轉換
HTTP協議本身是無型別的,請求體、響應體傳輸的資料都是字串。
String ageFromRequest = request.getParameter(“age”)
SpringMVC框架為了幫助我們簡化開發在底層為我們實現了自動的型別轉換
@RequestParam(“age”) Integer ageFromAnnotaion
使用想要的型別接收即可
※當然,如果轉換失敗,也會返回錯誤頁面400

3.自定義型別轉換器
①Converter<S,T>介面

自定義型別轉換器要實現Converter<S,T>這個介面
②配置FormattingConversionServiceFactoryBean

在FormattingConversionServiceFactoryBean的converters屬性中配置自定義型別轉換器的全類名

<bean id="conversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.mvc.converters.EmpConverter"/>
        </set>
    </property>
</bean>

③配置mvc:annotation-driven

<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>