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

一、前言

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

二、案例

♦新建产品录入界面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>

♦响应输出界面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>

♦新建控制器处理类ProductHandler

/**
 * @author queen
 * @since 2017-11-12
 */
@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";
	}
}

♦新建Product实体类

/**
 * @author queen
 * @since 2017-11-12
 */
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 + "]";
	}

}

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

  • Converter<S,T>:将 S 类型对象转为 T 类型对象
  • ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类(Integer、Long、Double 等)对象)可使用该转换器工厂类
  • 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;
	}
}

♦配置springmvc.xml
<mvc:annotation-driven conversion-service=“conversionService”/> 会将自定义的 ConversionService 注册到Spring MVC 的上下文中
SpringMVC教程之自定义类型转换器的照片 - 1
♦启动服务运行
SpringMVC教程之自定义类型转换器的照片 - 3
控制台打印如下:

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

前面一节数据绑定流程过程中会涉及到ConversionService类型转换器,我们Debug一下源码,看自定义的转换器有没有注册进去,如下:
SpringMVC教程之自定义类型转换器的照片 - 5
至此,我们关于SpringMVC教程之自定义类型转换器介绍完毕。想要了解更多关于SpringMVC开发的教程,请参考http://www.marsitman.com/springmvc
博客地址:http://www.marsitman.com/springmvc/springmvc-custom-converter.html
版权声明:本文为博主原创文章,允许转载,但转载必须标明出处。

 

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!



点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注