SpringMVC框架的Converter<S,T>是一个可以将一种数据类型转换成另一种数据类型的接口,这里的S表示源类型,T表示目标类型。一般情况使用框架内置转换器就可以,特殊情况需编写有特定功能的类型转换器。
1.Converter
-
内置的类型转换器
-
标量转换器
StringToBooleanConverter:String到boolean类型转换。
ObjectToStringConverter:Object 到String 转换,调用toString方法转换。
String ToNumberConverterFactory:String 到数字转换(如Integer、Long等)。
Number ToNumber ConverterFactory:数字子类型(基本类型)到数字类型(包装类型
转换。
String ToCharacterConverter:String到Character转换,取字符串第一个字符。
Number ToCharacterConverter:数字子类型到Character转换。
Character ToNumberFactory:Character 到数字子类型转换。
String ToEnumConverterFactory:String到枚举类型转换,通过Enum.valueOf将字符
串转换为需要的枚举类型。
Enum ToStringConverter:枚举类型到String转换,返回枚举对象的name0值。
String ToLocaleConverter:String到java.util.Locale转换。
Properties ToStringConverter:java.util.Properties 到String转换,默认通过ISO-8859-1
解码。
String ToPropertiesConverter:String到java.util.Properties转换,默认使用ISO-8859-1
编码。 -
集合,数组相关转换器
Array TocolectionConverter:任意数组到任意集合(List、Set)转换。
CollectionToArray Converter:任意集合到任意数组转换。
Array ToArrayConverter:任意数组到任意数组转换。
Collection ToCollectionConverter:集合之间的类型转换。
MapToMapConverter:Map之间的类型转换。个“首请田动个法面T饮
Array ToStringConverter:任意数组到String转换。
String ToArayConverter:字符串到数组的转换,默认通过“,”分隔,且去除字符串
的两边空格(trim)。
Array ToObjectConverter:任意数组到Object的转换,如果目标类型和源类型兼容,
直接返回源对象;否则返回数组的第一个元素并进行类型转换。
Object ToArrayConverter:Object到单元素数组转换。
Collection ToStringConverter:任意集合(List、Set)到String 转换。M
String ToCollectionConverter:String 到集合(List、Set)转换,默认通过“,”分隔,
且去除字符串的两边空格(trim)。
Collection ToObjectConverter:任意集合到任意Object的转换,如果目标类型和源类
型兼容,直接返回源对象;否则返回集合的第一个元素并进行类型转换。内下、
ObjectToCollectionConverter:Object到单元素集合的类型转换。
类型转换是在视图与控制器相互传递数据时发生的。Spring MVC框架对于基本类型
如int、long、float、double、boolean以及char等,已经做好了基本类型转换。
-
-
自定义类型转换器
当SpringMVC框架内置的类型转换器不能够满足需求时,开发者可以开发自己的类型转换器
实现自己的类型转换器需有5步:
(1):创建实体类
(2):创建控制器类
(3):创建自定义类型转换器
(4):注册类型转换器
(5):创建相关视图
domain类
public class GoodsModel {
private String goodsname;
private double goodsprice;
private int goodsnumber;
public String getGoodsname() {
return goodsname;
}
public void setGoodsname(String goodsname) {
this.goodsname = goodsname;
}
public double getGoodsprice() {
return goodsprice;
}
public void setGoodsprice(double goodsprice) {
this.goodsprice = goodsprice;
}
public int getGoodsnumber() {
return goodsnumber;
}
public void setGoodsnumber(int goodsnumber) {
this.goodsnumber = goodsnumber;
}
}
创建控制器类 创建ConverterController.java的类文件
@Controller
@RequestMapping("/my")
public class ConverterController {
@RequestMapping("/converter")
public String myConverter(@RequestParam("goods") GoodsModel gm,Model model) {
model.addAttribute("goods", gm);
return "showGoods";
}
}
创建自定义类型转换器
自定义类型转换器需要实现Converter<S,T>接口,重写convert(S)接口方法。convert(S)方法功能是将源数据类型S转换成目标数据类型T。
自定义为GoodsConvert代码
public class GoodsConverter implements Converter<String, GoodsModel>{
@Override
public GoodsModel convert(String source) {
// TODO Auto-generated method stub
GoodsModel goods = new GoodsModel();
String stringValues[] = source.split(",");
if(stringValues !=null && stringValues.length == 3) {
//为Goods实例赋值
goods.setGoodsname(stringValues[0]);
goods.setGoodsprice(Double.parseDouble(stringValues[1]));
goods.setGoodsnumber(Integer.parseInt(stringValues[2]));
return goods;
}else {
throw new IllegalArgumentException(String.format("类型转换失败需要格式'aa,232,232',但是格式是[%s]",source));
}
}
}
创建两个视图界面
input.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!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>Insert title here</title>
<base href="<%=basePath%>">
</head>
<body>
<form action="my/converter" method="post">
请输入商品信息(格式为:apple,10.58,200):
<input type="text" name="goods"/><br>
<input type="submit" value="提交"/>
</form>
</body>
</html>
showGoods.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
您创建的商品信息如下:<br>
<!-- 使用EL表达式取出model中goods的信息 -->
商品名为:${goods.goodsname },
商品价格为:${goods.goodsprice },
商品数量为:${goods.goodsnumber }。
</body>
</html>
2.Formatter
Spring MVC框架的Formatter与Converter<S,T>一样,也是一个可以将一种数据
类型转换成另一种数据类型的接口。但不同的是,Formatter的源数据类型必须是
String 类型,而Converter<S,T>的源数据类型是任意数据类型。
在Web应用中,由HTTP发送的请求数据到控制器中都是以String类型获取。因此,、
在Web应用中选择Formatter比选择Converter<S,T>更加合理。.
内置的格式化转换器
Spring MVC提供几个内置的格式化转换器,具体如下。
·NumberFormatter:实现Number与String之间的解析与格式化。
·CurrencyFormatter:实现Number与String之间的解析与格式化(带货币符号)。
·PercentFormatter:实现Number与String之间的解析与格式化(带百分数符号)。
·DateFormatter:实现Date与String之间的解析与格式化。