Spring MVC中如何进行类型Converter呢?

Java-框架王 SpringMVC 发布时间:2021-05-14 23:13:05 阅读数:15233 1
Spring MVC 框架中拥有一个Converter<S,T>数据类型转换接口,
  其中 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. 创建实体类
  2. 创建控制器类
  3. 创建自定义类型转换器类
  4. 注册类型转换器
  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<S,T> 接口,重写 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<String, infoModel> {
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,并在配置文件中注册自定义类型转换器,配置文件代码如下:

 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
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">
<!-- 使用扫描机制扫描控制器类,控制器类都在controller包及其子包下 -->
<context:component-scan base-package="controller" />
<!--注册类型转换器infoConverter-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="converter.infoConverter"/>
</list>
</property>
</bean>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>

5)创建相关视图

在项目的WebContent 目录下创建信息输入页面 input.jsp,核心代码如下:

<form action="${pageContext.request.contextPath}/my/converter" method= "post">
    请输入商品信息(格式为test,88.91,88):
    <input type="text" name="info" /><br>
    <input type="submit" value="提交" />
</form>

在项目的 /WEB-INF/jsp 目录下创建信息显示页面 showInfo.jsp,核心代码如下:
  
<body>
您创建的商品信息如下:
<!-- 使用EL表达式取出model中的info信息 -->
商品名称为:${infoTest.name }
商品价格为:${infoTest.price }
商品名称为:${infoTest.qty }
</body>

采用以下URL访问页面

http://localhost:8080/项目名称/input.jsp 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringMVC/2021-05-14/437.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者