资讯专栏INFORMATION COLUMN

spring-mvc的Conveter和Formatter

geekzhou / 2730人阅读

摘要:的可以将一种类型转换成另一种类型。的类名称必须为。这个必须包含一个属性,它列出要在应用程序中使用的所有定制。在使用时,必须编写一个实现接口的类。方法相反,它是返回目标对象的字符串表示法。为此,在应用程序中,选择比选择更合适。

1. Converter

Spring的Converter可以将一种类型转换成另一种类型。
在使用时,必须编写一个实现org.springframework.core.convert.converter.Converter接口的java类。这个接口的声明如下

public interface Converter {
    T convert(S var1);
}

这里的S表示源类型,T表示目标类型。
下面展示了一个将String类型转换成Date类型的Converter

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.convert.converter.Converter;

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

public class StringToDateConverter implements Converter{
    private static final Log logger = LogFactory.getLog(StringToDateConverter.class);
    private String datePattern;

    public StringToDateConverter(String datePattern) {
        this.datePattern = datePattern;
    }

    public Date convert(String s) {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat(datePattern);
            dateFormat.setLenient(false);
            return dateFormat.parse(s);
        } catch (ParseException e) {
            throw new IllegalArgumentException("invalid date format. Please use this pattern"" + datePattern + """);
        }
    }
}

为了使用Spring MVC应用程序定制的Converter,需要在配置文件中添加一个conversionService bean。Bean的类名称必须为org.springframework.context.support.ConversionServiceFactoryBean。这个bean必须包含一个converters属性,它列出要在应用程序中使用的所有定制Converter。下面bean声明注册了上面StringToDateConverter。


    
        
            
                
            
        
    

之后,还需要给annotation-driven元素的conversion-service属性赋上bean名称,如下

2. Formatter

Formatter和Converter一样,也是将一种类型转换成另一种类型。但是,Formatter的源类型必须是一个String。
在使用时,必须编写一个实现org.springframework.format.Formatter接口的java类。这个接口的声明如下

public interface Formatter extends Printer, Parser {
}
public interface Printer {
    String print(T var1, Locale var2);
}
public interface Parser {
    T parse(String var1, Locale var2) throws ParseException;
}

这里的T表示输入字符串要转换的目标类型。
parse方法利用指定的Locale将一个String解析成目标类型。print方法相反,它是返回目标对象的字符串表示法。
下面展示了一个将String类型转换成Date类型的Formatter

import org.springframework.format.Formatter;

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

public class DateFormatter implements Formatter{
    private String datePattern;
    private SimpleDateFormat dateFormat;

    public DateFormatter(String datePattern) {
        this.dateFormat = dateFormat;
        dateFormat = new SimpleDateFormat(datePattern);
        dateFormat.setLenient(false);
    }
    public Date parse(String s, Locale locale) throws ParseException {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat(datePattern);
            dateFormat.setLenient(false);
            return dateFormat.parse(s);
        } catch (ParseException e) {
            throw new IllegalArgumentException("invalid date format. Please use this pattern"" + datePattern + """);
        }
    }

    public String print(Date date, Locale locale) {
        return dateFormat.format(date);
    }
}

为了使用Spring MVC应用程序定制的Formatter,需要在配置文件中添加一个conversionService bean。Bean的类名称必须为org.springframework.format.support.FormattingConversionServiceFactoryBean。这个bean可以用一个formatters属性注册Formatter,用一个converters属性注册Converter。下面bean声明注册了上面DateFormatter。


    
        
            
                
            
        
    

之后,还需要给annotation-driven元素的conversion-service属性赋上bean名称,如下

3. 用Registrar注册Formatter

注册Formatter的另一种方法是使用Registrar。
下面就用Registrar来注册前面的DateFormatter。
先需要实现org.springframework.format.FormatterRegistrar接口,如下

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;
    }

    public void registerFormatters(FormatterRegistry formatterRegistry) {
        formatterRegistry.addFormatter(new DateFormatter(datePattern));
        //register more formatters here
    }
}

有了Registrar,就不需要在Spring MVC配置文件中注册Formatter,只要在配置文件中注册Registrar就行,如下


    
        
            
                
            
        
    
4. 选择Converter还是Formatter

Converter是一般工具,可以将一种类型转换成另一种类型。例如,将String转换成Date,或者将Long转换成Date。Converter既可以用在web层,也可以用在其它层中。
Formatter只能将String转成成另一种java类型。例如,将String转换成Date,但它不能将Long转换成Date。所以,Formatter适用于web层。为此,在Spring MVC应用程序中,选择Formatter比选择Converter更合适。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64816.html

相关文章

  • spring-MVC源码解读(一)

    摘要:处理器是继前端控制器的后端控制器,在的控制下对具体的用户请求进行处理。由于涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发。 1、mcv整体架构和流程 showImg(https://segmentfault.com/img/bV55Qq?w=860&h=406); 用户发送请求至前端控制器 DispatcherServlet DispatcherServlet 收到...

    I_Am 评论0 收藏0
  • 『SpringMVC』<context:include-filter>&<

    摘要:现在给定一个项目的包结构在中有以下配置只扫描注解可以看出要把最后的包写上,不能包含子包,所以不能写成。   大家好,我是猪弟,猪在我心中从来不是蠢的代名词,而是懒的代名词,本次准备记录一个在开发测试过程中遇到的问题,跟踪了三天spring和第三方RPC组件的源码,最终发现了问题是因为第三方组件没有处理好而父子容器导致的,还有一个因素是spring注解扫描重叠。 Spring版本:4.3...

    darryrzhong 评论0 收藏0
  • spring-mvc注解

    摘要:关键注解的关键注解主要有其中主要是用于标记该类是一个控制器,用于指示的哪一个类或方法来处理请求动作,即用于标识具体的处理器。默认已经装配了作为组件的实现类,而由使用,将请求信息转换为对象。 关键注解 springmvc的关键注解主要有@Controller/@RequestMapping/@RequestParam/@PathVariable/@RequestHeader/@Cooki...

    EdwardUp 评论0 收藏0
  • [闹着玩-2]spring-mvc 主要流程

    摘要:源码仓库本文仓库三层结构表现层模型业务层持久层工作流程用户前端控制器用户发送请求前端控制器后端控制器根据用户请求查询具体控制器后端控制器前端控制器处理后结果前端控制器视图视图渲染视图前端控制器返回视图前端控制器用户响应结 SpringMvc 【源码仓库】【本文仓库】 三层结构 表现层 MVC模型 业务层 service 持久层 dao 工作流程 用户->前端控制器:用户...

    fuchenxuan 评论0 收藏0
  • SpringMVC入门笔记

    摘要:入门笔记简介是一种基于的实现了设计模式的请求驱动类型的轻量级框架,是系开源项目中的一个,和配合使用。配置在中需要添加使用的和映射规则。入门较快,而掌握起来相对较难。 SpringMVC入门笔记 1. 简介 Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架 ,是Spring系开源项目中的一个,和IoC配合使用。通过策略接口,Spring...

    zhaochunqi 评论0 收藏0

发表评论

0条评论

geekzhou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<