转自:
Spring MVC 框架中拥有一个Converter数据类型转换接口,
其中 S:源类型
T:目标类型
下文将讲述Spring MVC框架中,内置的类型转换器和自定义类型转换器的方法分享,如下所示:
1)标量转换器
名称 | 作用 |
---|---|
StringToBooleanConverter | String 到 boolean 类型转换 |
ObjectToStringConverter | Object 到 String 转换,调用 toString 方法转换 |
StringToNumberConverterFactory | String 到数字转换(例如 Integer、Long 等) |
NumberToNumberConverterFactory | 数字子类型(基本类型)到数字类型(包装类型)转换 |
StringToCharacterConverter | String 到 Character 转换,取字符串中的第一个字符 |
NumberToCharacterConverter | 数字子类型到 Character 转换 |
CharacterToNumberFactory | Character 到数字子类型转换 |
StringToEnumConverterFactory | String 到枚举类型转换,通过 Enum.valueOf 将字符串转换为需要的枚举类型 |
EnumToStringConverter | 枚举类型到 String 转换,返回枚举对象的 name 值 |
StringToLocaleConverter | String 到 java.util.Locale 转换 |
PropertiesToStringConverter | java.util.Properties 到 String 转换,默认通过 ISO-8859-1 解码 |
StringToPropertiesConverter | String 到 java.util.Properties 转换,默认使用 ISO-8859-1 编码 |
2)集合、数组相关转换器
名称 | 作用 |
---|---|
ArrayToCollectionConverter | 任意数组到任意集合(List、Set)转换 |
CollectionToArrayConverter | 任意集合到任意数组转换 |
ArrayToArrayConverter | 任意数组到任意数组转换 |
CollectionToCollectionConverter | 集合之间的类型转换 |
MapToMapConverter | Map之间的类型转换 |
ArrayToStringConverter | 任意数组到 String 转换 |
StringToArrayConverter | 字符串到数组的转换,默认通过“,”分割,且去除字符串两边的空格(trim) |
ArrayToObjectConverter | 任意数组到 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回数组的第一个元素并进行类型转换 |
ObjectToArrayConverter | Object 到单元素数组转换 |
CollectionToStringConverter | 任意集合(List、Set)到 String 转换 |
StringToCollectionConverter | String 到集合(List、Set)转换,默认通过“,”分割,且去除字符串两边的空格(trim) |
CollectionToObjectConverter | 任意集合到任意 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回集合的第一个元素并进行类型转换 |
ObjectToCollectionConverter | Object 到单元素集合的类型转换 |
类型转换的应用场景:
常用于视图和控制器相互传递数据时发生的
Spring MVC 框架对于基本类型(例如 int、long、float、double、boolean 以及 char 等)已经做好了基本类型转换
如:insert.jsp post到后台的需求,可由以下方法处理
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class infoontroller {
@RequestMapping("/insert")
public String add(String name, double price, double qty) {
double total = price * qty;
System.out.println(total);
return "info";
}
}
注意事项:
运用内置自动转换器,输入参数值需同接收参数类型相同,否则会产生相应的错误信息
当Spring MVC 框架内置的类型转换器无法满足我们的需求时,我们可自己编写相应的类型转换器
如:
当在页面表单中输入信息来创建信息。当输入“test,89.88,112” 此时后台方法中将自动 创建一个 new info,
并将“test”值自动赋给 name 属性
将“89.88”值自动赋给 price 属性
将“112”值自动赋给 qty 属性
那么如何编写一个自定义类型转换器呢?下文将一一道来,编写自定义转换器需进行以下5个步骤
按照上述步骤采用自定义类型转换器完成需求。
1.创建实体类
在项目的src 目录下创建 com.java265 包,并在该包中创建名为 infoModel 的实体类,代码如下:
package com.java265;
public class infoModel {
private String name;
private double price;
private int qty;
}
2)创建控制器类
在 项目的src 目录下创建 controller 包,
并在该包中创建名为 ConverterController 的控制器类,代码如下:
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.java265.infoModel;
@Controller
@RequestMapping("/my")
public class ConverterController {
@RequestMapping("/converter")
/*
* 使用@RequestParam
* ("infoTest")接收请求参数,然后调用自定义类型转换器Converter将字符串值转换为infoModel的对象infom
*/
public String myConverter(@RequestParam("infoTest") infoModel infom, Model model) {
model.addAttribute("infoTest", infom);
return "showInfo";
}
}
3)创建自定义类型转换器类
自定义类型转换器类需要实现 Converter 接口,重写 convert(S) 接口方法。
convert(S) 方法的功能是将源数据类型 S 转换成目标数据类型 T。在 springMVCDemo03 的 src 目录下创建 converter 包,并在该包中创建名为 GoodsConverter 的自定义类型转换器类,代码如下:
package converter;
import org.springframework.core.convert.converter.Converter;
import com.java265.infoModel;
public class infoConverter implements Converter
public infoModel convert(String source) {
// 创建一个infoTest实例
infoModel infoTest= new infoModel ();
// 以“,”分隔
String stringvalues[] = source.split(",");
if (stringvalues != null && stringvalues.length == 3) {
// 为infoTest实例赋值
infoTest.setname(stringvalues[0]);
infoTest.setprice(Double.parseDouble(stringvalues[1]));
infoTest.setnumber(Integer.parseInt(stringvalues[2]));
return infoTest;
} else {
throw new IllegalArgumentException(String.format(
"类型转换失败, 需要格式'testName, 99.11,188',但格式是[% s ] ", source));
}
}
}
4)注册类型转换器
在项目 的 WEB-INF 目录下创建配置文件 springmvc-servlet.xml,并在配置文件中注册自定义类型转换器,配置文件代码如下:
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
5)创建相关视图
在项目的WebContent 目录下创建信息输入页面 input.jsp,核心代码如下:
在项目的 /WEB-INF/jsp 目录下创建信息显示页面 showInfo.jsp,核心代码如下: