1. 程式人生 > >SpringMVC_15_自定義型別轉換器

SpringMVC_15_自定義型別轉換器

  • ConversionService是Spring型別轉換體系的核心介面。
  • 可以利用ConversionSeviceFactoryBean在Spring的IOC容器中定義ConversionService.Spring將自動識別出IOC容器中的ConversionService,並在Bean屬性配置及Spring MVC處理方法入參繫結等場合使用它進行資料的轉換
  • 可通過ConversionServiceFactoryBean的converters屬性註冊自定義的型別轉換器

Spring支援的轉換器

  • Spring定義了3中型別的轉換器介面,實現任意一個轉換器介面都可以作為自定義轉換器註冊到ConversionServiceFactoryBean中:
    • Converter<S,T>
      :將S型別物件轉為T型別物件
    • ConverterFactory:將相同系列多個“同質”Converter封裝在一起。如果希望將一種型別的物件轉換為另一種型別及其子類的物件(例如將String轉換為Number及Number子類(Integer、Long、Double等)物件)可使用該轉換器工廠類
    • GenericConverter:會根據源類物件及目標類物件所在的宿主類中的上下文資訊進行型別轉換

自定義轉換器示例

  • <mvc:annotation-driven conversion-service = “conversionService”/>
    會將自定義的ConversionService註冊到Spring MVC的上下文中

演示:

第一步:寫一個表單,用一個text直接接收一個字串,使其轉化為一個類

<form action="testConversionServiceConverer" method="post">
    <!--lastname-email-gender-department.id 例如:GG-gg@atguigu.com-0-105-->
    Employee:<input type="text" name="employee"/>
    <input type=
"submit" value="Submit"/> </form>

第二步:新建一個包com.springmvc.test ,建立一個SpringMVCTest.java,寫好相應的方法

SpringMVCTest.java

package com.springmvc.test;

import com.springmvc.crud.dao.EmployeeDao;
import com.springmvc.crud.entities.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class SpringMVCTest {

    @Autowired
    private EmployeeDao employeeDao;

    @RequestMapping("/testConversionServiceConverer")
    public String testConverter(@RequestParam("employee")Employee employee){
        System.out.println("save: "+employee);
        employeeDao.save(employee);

        return "redirect:/emps";
    }

}

這裡不難發現,我們傳送的是一個字串,這裡的接收方法接受的是一個類。所以需要一個轉換器,先把字串轉換成類。

第三步:建立一個包com.springmvc.converters ,新建一個類EmployeeConverter

package com.springmvc.converters;



import com.springmvc.crud.entities.Department;
import com.springmvc.crud.entities.Employee;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@Component  //新增到IOC容器裡面
public class EmployeeConverter implements Converter<String,Employee> {

    @Override
    public Employee convert(String source) {
	//[email protected]
        if(source!=null){
            String[] vals = source.split("-");
            if(vals!=null&&vals.length==4){
                String lastName = vals[0];
                String email = vals[1];
                Integer gender =Integer.parseInt(vals[2]);
                Department department = new Department();
                department.setId(Integer.parseInt(vals[3]));

                Employee employee = new Employee(null,lastName,email,gender,department);
                System.out.println(source+"--convert--"+employee);
                return employee;
            }
        }
        return  null;
    }
}

第四步:在配置檔案springmvc.xml中將這個轉換器配置到轉換器體系裡面

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!--配置ConversionService-->
<bean id="conversionService"
      class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <ref bean="employeeConverter"/>
        </set>
    </property>
</bean>

第五步:演示

在這裡插入圖片描述

在這裡插入圖片描述