1. 程式人生 > >springmvc學習筆記(26)——自定義型別轉換器

springmvc學習筆記(26)——自定義型別轉換器

資料繫結流程

使用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>


按以上的方法,就可以輕鬆的實現自定義型別轉換器啦。