自定义类型转换与格式化

在SpringMVC中,已经内置了许多足以应对实际开发中的类型转换的转换器。当时对于一些特定的功能,我们就需要自定义特定功能的类型转换器。

自定义类型转换器

假如前台传来这样一条字符串:“apple,10.58,200”,该字符串表示一个商品信息,后台需要自动创建一个Goods对象,并将“apple”值自动赋值给goodsName属性,将“10.58”值给goodsPrice属性,将“200”值赋给goodsNumber属性。要实现上述功能,就要编写自定义类型转换器类。
流程:

  • 创建实体类
  • 创建控制器类
  • 创建自定义类型转换器类
  • 注册类型转换器
  • 创建相关视图
创建实体类 Goods
public class Goods {
    private String goodsName;
    private double goodsPrice;
    private int goodsNumber;
	//省略setter和getter方法
}
创建控制器ConverterController
//....
@Controller
@RequestMapping("/test")
public class ConverterController {
    @RequestMapping("/converter")
    /**
     * 使用@RequestParam("goods")接收请求参数  (goods表单元素的name属性)
     * 然后调用自定义类型转换器GoodsConverter将字符串值转为Goods的对象goods
     * */
    public String testConverter(@RequestParam("goods") Goods goods, Model model) {
        model.addAttribute("goods", goods);
        return "/showGoods.jsp";
    }
}
创建自定义类型转换器GoodsConverter

自定义类型转换器需要实现Converter接口,重写convert(S)接口方法。该方法的功能是将源数据类型S转换成目标数据类型T。

import org.springframework.core.convert.converter.Converter;
import pojo.Goods;

public class GoodsConverter implements Converter<String, Goods> {
    @Override
    public Goods convert(String s) {
        Goods goods=new Goods();
        //以“,”作为分隔符,分隔自字符串
        String strlist[] =s.split(",");
        if (strlist != null && strlist.length == 3) {
            //为Goods实例赋值
            goods.setGoodsName(strlist[0]);
            goods.setGoodsPrice(Double.parseDouble(strlist[1]));
            goods.setGoodsNumber(Integer.parseInt(strlist[2]));
            return goods;
        } else {
            throw new IllegalArgumentException(String.format("类型转换失败,需要格式为'apple,10.58,200',但格式为[%S]", s));
        }
    }
}
注册类型转换器

在配置文件中配置类型转换器服务,需要配置的类
org.springframework.context.support.ConversionServiceFactoryBean
以及为它指定converters属性的值为自定义类型转换类。
同时还需要开启监听自动转换服务。

    
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="converter.GoodsConverter"/>
            list>
        property>
    bean>
    <mvc:annotation-driven conversion-service="conversionService"/>
创建相关视图 input.jsp 和 showGoods.jsp

input.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/test/converter">
        请输入商品信息(格式为 apple,10.58,200 ):
        <input type="text" name="goods" id="goods">
        <button type="submit">提交</button>
    </form>
</body>
</html>

showGoods.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
您创建的商品信息如下:<br>
商品名称为:${goods.goodsName}<br>
商品价格为:${goods.goodsPrice}<br>
商品数量为:${goods.goodsNumber}<br>
</body>
</html>

测试

自定义类型转换与格式化_第1张图片
自定义类型转换与格式化_第2张图片

Formatter

SpringMVC框架的Formatter< T>Converter 一样,也是一个可以将一种数据类型转换成另一种数据类型的接口。两者的区别在于,Formatter< T>的源数据类型必须是String类型,而Converter的源数据类型可以是任意类型。

内置的格式化转换器

Spring MVC提供几个内置的格式化转换器:

  • NumberFormatter:实现Number与String之间的解析与格式化。
  • CurrencyFormatter :实现Number与String之间的解析与格式化(带货币符号)。
  • PercentFormatter :实现Number与String之间的解析与格式化(带百分数符号)。
  • DateFormatter :实现Date 与String 之间的解析与格式化。
自定义格式化转换器

自定义格式化转换器需要实现Formatter< T>接口,并且重写该接口的两个方法:

  • public T parse(String s ,java.util.Loale locale)
  • public String parse(T object, java.util.Loale locale)

其中,T 表示由字符串转换的目标类型。parse方法的功能是利用指定的Locale将一个String类型转换成目标类型;print 方法 用于返会目标对象的字符串表示。

你可能感兴趣的:(Spring学习笔记)