SpringMVC教程之自定义类型转换器

一.前言
  ConversionService是Spring 类型转换体系的核心接口。 可以利用 ConversionServiceFactoryBean 在 Spring的IOC容器中定义一个 ConversionService. Spring 将自动识别出IOC 容器中的 ConversionService,并在 Bean 属性配置及Spring MVC 处理方法入参绑定等场合使用它进行数据的转换可通过 ConversionServiceFactoryBean的converters属性注册自定义的类型转换器。
下面通过案例,介绍如何自定义类型转换器,将形如:number-qty 例如Num1000-9999 字符串转换成product对象。

 

二.案例
1.新建产品录入界面welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试页面</title>
</head>
<body>
    <form action="product/saveProduct" method="Post">
        <!--number-qty 例如Num1000-9999  -->
        产品: <input type="text" name="product"/>
        <br>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

2.响应输出界面product.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>success</title>
</head>
<body>
    ${product }
</body>
</html>

3.新建控制器处理类ProductHandler

@RequestMapping("/product")
@Controller
public class ProductHandler {
    //模拟保存产品信息操作
    /*@RequestMapping(value = "/saveProduct", method = RequestMethod.POST)
    public String saveProduct(Product product) {
        System.out.println("保存产品:" + product);
        return "product";
    }*/
    
    @RequestMapping(value = "/saveProduct", method = RequestMethod.POST)
    public String saveProduct(Product product) {
        //经过转换之后的产品实体类
        System.out.println("保存产品:" + product);
        return "product";
    }
}

4.新建Product实体类

public class Product {
    // 编码
    private String number;
    // 库存
    private Integer qty;
    
    public Product() {
        
    }

    public Product(String number, Integer qty) {
        this.number = number;
        this.qty = qty;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Integer getQty() {
        return qty;
    }

    public void setQty(Integer qty) {
        this.qty = qty;
    }

    @Override
    public String toString() {
        return "Product [number=" + number + ", qty=" + qty + "]";
    }
}

5.编写类型转换器ProductConverter
  Spring 定义了3种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到ConversionServiceFactroyBean 中:

  a.Converter<S,T>:将 S 类型对象转为 T 类型对象
  b.ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类(Integer、Long、Double 等)对象)可使用该转换器工厂类
  c.GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换

@Component
public class ProductConverter implements Converter<String, Product>{
    @Override
    public Product convert(String source) {
        if(source != null){
            String [] vals = source.split("-");
            //number-qty例如:Num1000-9999
            if(vals != null && vals.length == 2){
                String number = vals[0];
                Integer qty = Integer.parseInt(vals[1]);    
                
                Product product = new Product(number, qty);
                System.out.println(source + "--convert--" + product);
                return product;
            }
        }
        return null;
    }
}

6.配置springmvc.xml
  <mvc:annotation-driven conversion-service=“conversionService”/> 会将自定义的 ConversionService 注册到Spring MVC 的上下文中。

7.启动服务运行

  控制台打印如下:

Num1000-9999--convert--Product [number=Num1000, qty=9999]
保存产品:Product [number=Num1000, qty=9999]

  数据绑定流程过程中会涉及到ConversionService类型转换器,我们Debug一下源码,看自定义的转换器有没有注册进去,如下:

  至此,我们关于SpringMVC教程之自定义类型转换器介绍完毕。

 

文章来源:http://www.marsitman.com/springmvc/springmvc-custom-converter.html

posted on 2018-04-22 20:56  bijian1013  阅读(483)  评论(0)    收藏  举报

导航