SpringMVC-08-类型转换器(Converter)

仰翰采
2023-12-01

2.8 类型转换器(Converter)

  • Spring MVC 框架的 Converter<S,T> 是一个内置的可以将一种数据类型转换成另一种数据类型的接口,这里 S 表示源类型,T 表示目标类型。

注意:在使用内置类型转换器时,请求参数输入值-源类型与接收参数类型-目标类型要兼容,否则会报 400 错误。请求参数类型与接收参数类型不兼容问题需要学习输入校验后才可解决。

  • 日期字符串格式多,但Spring 会使用户输入的日期样式与当前语言区域的日期样式相同。若希望 Spring 在将输入的日期字符串转换为到 LocalDate 时,使用不同的日期样式,则需要编写一个 Converter,才能将字符串转换成日期。

java.time.LocalDate 类是 Java 8 的一个新类型,用来替代 java.util.Date。还需使用新的 Date/Time API 来替换旧有的 Date 和 Calendar 类。

  • 内置的类型转换器: Spring MVC 框架有许多内置的类型转换器用于完成常用的类型转换
  • 标量转换器,如下面所示:
名称作用
StringToBooleanConverterString 到 boolean 类型转换
ObjectToStringConverterObject 到 String 转换,调用 toString 方法转换
StringToNumberConverterFactoryString 到数字转换(例如 Integer、Long 等)
NumberToNumberConverterFactory数字子类型(基本类型)到数字类型(包装类型)转换
StringToCharacterConverterString 到 Character 转换,取字符串中的第一个字符
NumberToCharacterConverter数字子类型到 Character 转换
CharacterToNumberFactoryCharacter 到数字子类型转换
StringToEnumConverterFactoryString 到枚举类型转换,通过 Enum.valueOf 将字符串转换为需要的枚举类型
EnumToStringConverter枚举类型到 String 转换,返回枚举对象的 name 值
StringToLocaleConverterString 到 java.util.Locale 转换
PropertiesToStringConverterjava.util.Properties 到 String 转换,默认通过 ISO-8859-1 解码
StringToPropertiesConverterString 到 java.util.Properties 转换,默认使用 ISO-8859-1 编码
  • 数组、集合转换器
名称作用
ArrayToCollectionConverter任意数组到任意集合(List、Set)转换
CollectionToArrayConverter任意集合到任意数组转换
ArrayToArrayConverter任意数组到任意数组转换
CollectionToCollectionConverter集合之间的类型转换
MapToMapConverterMap之间的类型转换
ArrayToStringConverter任意数组到 String 转换
StringToArrayConverter字符串到数组的转换,默认通过“,”分割,且去除字符串两边的空格(trim)
ArrayToObjectConverter任意数组到 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回数组的第一个元素并进行类型转换
ObjectToArrayConverterObject 到单元素数组转换
CollectionToStringConverter任意集合(List、Set)到 String 转换
StringToCollectionConverterString 到集合(List、Set)转换,默认通过“,”分割,且去除字符串两边的空格(trim)
CollectionToObjectConverter任意集合到任意 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回集合的第一个元素并进行类型转换
ObjectToCollectionConverterObject 到单元素集合的类型转换

类型转换是在视图与控制器相互传递数据时发生的。Spring MVC 框架对于基本类型(例如 int、long、float、double、boolean 以及 char 等)已经做好了基本类型转换.

  • 自定义类型转换器:当然程序猿可以开发自己的类型转换器

步骤:

  • 创建实体类。
  • 创建控制器类。
  • 创建自定义类型转换器类。
  • 注册类型转换器。
  • 创建相关视图。
  • 举例:

  • 实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    String username;
    String pwd;
}
  • 控制器类
@Controller
@RequestMapping("/sys")
public class ModelController {

    @RequestMapping("/result")
    protected String afterMethod(@RequestParam("user") User user,Model model){
        model.addAttribute("user",user);
        return "result";
    }
}
  • 自定义类型转换器类
@Component
public class ConvertController implements Converter<String, User> {
    @Override
    public User convert(String source) {
        // 创建User实例
        User user = new User();
        // 以“,”分隔
        String stringvalues[] = source.split(",");
        if (stringvalues != null && stringvalues.length == 2) {
            // 为user实例赋值
            user.setUsername(stringvalues[0]);
            user.setPwd(stringvalues[1]);
            return user;
        } else {
            throw new IllegalArgumentException(String.format("类型转换失败, 需要格式'username, pwd',但格式是[% s ] ", source));
        }
    }
}
  • springmvc-servlet.xml中注册类型转换器。
<mvc:annotation-driven conversion-service="conversionService"/>
<!--注册类型转换器UserConverter -->
<bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="conversionService">
    <property name="converters">
       <list><bean class="com.zk.controller.ConvertController"/></list>
    </property>
</bean>
  • index.jsp页面
<form action="/sys/result" method="post">
   请输入用户信息(格式为username,pwd):
   <input type="text" name="user" />
  <input type="submit" value="提交">
</form>
  • /web-inf/jsp/result.jsp
<body>
结果:${user.username}:${user.pwd}
</body>
  • 启动服务器进行测试。

下一篇:SpringMVC-09-传递参数的几种方式

 类似资料: