【720科技SpringMVC】第五次课:Converter 和 Formatter

内容关键词: Converter 和 Formatter、转换器与格式化

知识来源:720科技(张森鹏)

一、知识笔记

    Converter Formatter,可以利用它们来引导 Spring MVC 应用程序中的数据绑定。 Converter 是一般工具,可以将任意类型转换成另一种类型,而 Formatter 则只能将 String转换成另一种 Java 类型。 Formatter 更适用于 Web 层。

1、Converter
    Spring Converter 是可以将一种类型转换成另一种类型的一个对象。
    为了创建 Converter,必须编写实现 org.springframework.core.convert.converter. Converter接口的一个 Java 类。
        public interface Converter<S, T>
    这里的 S 表示源类型, T 表示目标类型。例如,为了创建一个可以将 Long 转换成 DateConverter,要像下面这样声明 Converter 类:
        public class MyConverter implements Converter<Long, LocalDate> {
        }
    在类实体中,需要编写一个来自 Converter 接口的 convert 方法实现。这个方法的签名如下:
        T convert(S source)

2、Formatter

    Formatter 就像 Converter 一样,也是将一种类型转换成另一种类型。但是, Formatter 的源类型必须是一个 String,而 Converter 则适用于任意的源类型。 Formatter 更适合 Web 层,而Converter 则可以用在任意层中。为了转换 Spring MVC 应用程序表单中的用户输入,始终应该选择 Formatter,而不是 Converter

    为了创建 Formatter,要编写一个实现 org.springframework.format.Formatter 接口的 Java 类。下面是这个接口的声明:
        public interface Formatter<T>
    这里的 T 表示输入字符串要转换的目标类型。该接口有 parse print 两个方法,所有实现都必须覆盖它们。
        T parse(String text, java.util.Locale locale)
        String print(
T object, java.util.Locale locale)
    parse 方法利用指定的 Locale 将一个 String 解析成目标类型。 print 方法与之相反,它返回目标对象的字符串表示法。

3、用 Registrar 注册 Formatter

MyFormatterRegistrar
    package formatter;
    import org.springframework.format.FormatterRegistrar;
    import org.springframework.format.FormatterRegistry;

        

    public class MyFormatterRegistrar implements FormatterRegistrar {

        private String datePattern;
        public MyFormatterRegistrar(String datePattern) {
            this.datePattern = datePattern;
        }
        @Override
        public void registerFormatters(FormatterRegistry registry) {
            registry.addFormatter(new LocalDateFormatter(datePattern));
            // register more formatters here
        }
    }


4、选择 Converter, 还是 Formatter
    Converter 是一般工具,可以将一种类型转换成另一种类型。例如,将 String 转换成LocalDate,或者将 Long 转换成 LocalDateConverter 既可以用在 Web 层,也可以用在其他层中。
    Formatter 只能将 String 转换成另一种 Java 类型。例如,将 String 转换成 LocalDate,但它不能将 Long 转换成 LocalDate。因此, Formatter 适用于 Web 层。为此,在 Spring MVC 应用程序中,选择 Formatter 比选择 Converter 更合适。


二、学习参考https://www.cnblogs.com/Faith-zhang/p/7656654.html

spring配置Converter、Formatter日期转换器

1.首先第一种 convertor转换器

package com.converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

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

public class StringDate implements Converter<String, Date>{

    // 日期转换格式
    private String pattern;
    // 构造函数
    public StringDate(String pattern) {
        super();
        this.pattern = pattern;
    }

    @Override
    public Date convert(String arg0) {  
        //  yyyy-MM-dd 
        SimpleDateFormat sd = new SimpleDateFormat(pattern);
        try {
            return sd.parse(arg0);
        } catch (ParseException e) {
            //e.printStackTrace();
            throw new IllegalAccessError("日期转换出错!!");
        }
    }

}
<!-- 日期转换工厂 -->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.converter.StringDate">
                    <constructor-arg type="java.lang.String" value="yyyy-MM-dd"></constructor-arg>
                </bean>
            </list>
        </property>
    </bean>

2.第二种方式 Formatter转换器

package com.converter2;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.springframework.core.convert.converter.Converter;
import org.springframework.format.Formatter;


/**
 * 日期类型转换器
 * @author Administrator
 *
 */
public class StringDate2 implements Formatter<Date>{

    // 日期转换格式
    private String pattern;
    private SimpleDateFormat sd;
    
    // 构造函数
    public StringDate2(String pattern) {
        super();
        this.pattern = pattern;
        sd = new SimpleDateFormat(pattern);
    }
    
    @Override
    public String print(Date object, Locale locale) {
        //加上这句话  就需要按照日期规范去转   类似1999-15-15就会报错
        sd.setLenient(false);
        return sd.format(object);
    }
    @Override
    public Date parse(String text, Locale locale) throws ParseException {
        sd.setLenient(false);
        return sd.parse(text);
    }


}
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="formatters">
            <list>
                <bean class="com.converter2.StringDate2">
                    <constructor-arg type="java.lang.String" value="yyyy-MM-dd"></constructor-arg>
                </bean>
            </list>
        </property>
    </bean>



猜你喜欢

转载自blog.csdn.net/weixin_35338461/article/details/80066090