springmvc學習筆記(26)——自定義型別轉換器
阿新 • • 發佈:2018-12-15
資料繫結流程
使用springmvc框架有諸多好處,其中較為突出的就是它的資料繫結。
當我們的前端傳過來一個表單的時候,我們只需要使用一個類物件(如Student物件)就接收,springmvc將幫我們把屬性一一對應的填充進去。這就是資料繫結。
資料繫結過程中,springmvc幫我們把前端傳來的字串,轉化為屬性對應的資料型別(如String->Integer)
- 那麼,springmvc是如何實現資料繫結的呢,我們來簡單分析一下。
- springmvc將request物件以及目標方法的引數傳給WebDataBinderFactory 例項,得到一個DataBinder
- DataBinder呼叫 ConversionService元件來完成資料型別的轉換,資料格式化。
- 呼叫Validator元件對資料進行合法性校驗,並最終生成資料繫結結果BindingData物件
- Spring MVC 抽取 BindingResult 中的入參物件和校驗錯誤物件,將它們賦給處理方法的響應入參
下面配上一張示意圖(該圖來自尚矽谷)
自定義型別轉換器
控制層
@RequestMapping("/testConverter") public String testConverter(@RequestParam("student")Student student){ StudentDao.add(student); return "redirect:/student"; }
前端
介面中只有一個input,輸入一串字串
<form action="testConverter" method="post">
<input type="text" name="student" />
<input type="submit" value="add"/>
</form>
springmvc如何將String轉化為Student物件
寫一個自己的型別轉換器
package com.zj.converter; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.ConverterFactory; import org.springframework.stereotype.Component; import com.zj.model.Address; import com.zj.model.Student; @Component public class StudentConverter implements Converter<String, Student> { @Override public Student convert(String source) { //將String型別轉化為Student型別 //source形式: 123-tom-男-福建省-泉州市 Student student = null; if(source!=null){ String[] values = source.split("-"); if(values!=null && values.length==5){ student = new Student(); student.setStudentId(Integer.parseInt(values[0])); student.setName(values[1]); student.setSex(values[2]); student.setAddress(new Address(values[3], values[4])); } } return student; } }
這個類實現了spring的Converter,記得給它加上@Component註解,讓springmvc幫我們建立bean
在springmvc配置檔案中配置
<!-- 在這裡啟用轉換器 -->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 定義自定義型別轉換器的bean -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 這裡是我們自己定義的型別轉換器 -->
<!-- 注意,這裡首字母要小寫,因為springmvc幫我們建立bean的時候,是以類名首字母小寫命名 -->
<ref bean="studentConverter"/>
</set>
</property>
</bean>
按以上的方法,就可以輕鬆的實現自定義型別轉換器啦。