`

SpringMVC(十二)_数据绑定流程之数据格式化

阅读更多

       前言:本篇主要介绍SpringMVC的数据绑定流程中数据格式化的相关概念与用法

本篇文章重点关注以下问题:

  • SpringMVC的数据格式化架构
  • Spring内建的格式化转换器

  • 自定义格式转换器

1. SpringMVC的数据格式化架构

1.1 格式化转换器

       提供格式化转换的实现支持,对属性对象的输入/输出进行格式化,从其本质上讲依然属于 “类型转换” 的范畴。


       一共有如下两组四个接口:

 1. Printer接口

          格式化显示接口,将T 类型的对象根据Locale信息以某种格式进行打印显示(即返回字符串形式);

@FunctionalInterface
public interface Printer<T> {
	String print(T object, Locale locale);
}

 2. Parser接口

         解析接口,根据Locale信息解析字符串到T类型的对象,解析失败可以抛出java.text.ParseException或IllegalArgumentException异常即可。

@FunctionalInterface
public interface Parser<T> {
	T parse(String text, Locale locale) throws ParseException;
}

 3、Formatter接口

         格式化SPI接口,继承Printer 和Parser 接口,完成T类型对象的格式化和解析功能;

public interface Formatter<T> extends Printer<T>, Parser<T> {

}

 4、AnnotationFormatterFactory接口

         注解驱动的字段格式化工厂,用于创建带注解的对象字段的Printer 和Parser,即用于格式化和解析带注解的对象字段

public interface AnnotationFormatterFactory<A extends Annotation> { // 可以识别的注解类型
	Set<Class<?>> getFieldTypes();                           // 可以被A注解类型注解的字段类型集合
	Printer<?> getPrinter(A annotation, Class<?> fieldType); // 根据A注解类型和fieldType类型获取Printer
	Parser<?> getParser(A annotation, Class<?> fieldType);   // 根据A注解类型和fieldType类型获取Parser
}

        此接口返回用于格式化和解析被A注解类型注解的字段值的Printer 和Parser 。如JodaDateTimeFormatAnnotationFormatterFactory可以为带有@DateTimeFormat注解的java.util.Date字段类型创建相应的Printer 和Parser 进行格式化和解析。

 

1.2 格式化转换器注册器、格式化服务

       提供类型转换器注册支持,运行时类型转换API支持。


 其有两种接口:

1.FormatterRegistry

        格式化转换器注册器,用于注册格式化转换器(Formatter、Printer 和Parser、AnnotationFormatterFactory);

public interface FormatterRegistry extends ConverterRegistry {

	// 添加格式化转换器(Spring3.1 新增API)
	void addFormatter(Formatter<?> formatter);

	// 为指定的字段类型添加格式化转换器
	void addFormatterForFieldType(Class<?> fieldType, Formatter<?> formatter);

	// 为指定的字段类型添加Printer 和Parser
	void addFormatterForFieldType(Class<?> fieldType, Printer<?> printer, Parser<?> parser);

	// 添加注解驱动的字段格式化工厂AnnotationFormatterFactory
	void addFormatterForFieldAnnotation(AnnotationFormatterFactory<? extends Annotation> annotationFormatterFactory);

}

 

2. FormattingConversionService

         继承自ConversionService,运行时类型转换和格式化服务接口,提供运行期类型转换和格式化的支持。该实现类扩展了 GenericConversionService,因此它既具有类型转换的功能,又具有格式化的功能。FormattingConversionService 拥有一个FormattingConversionServiceFactroyBean 工厂类,后者用于在 Spring 上下文中构造前者。

         FormattingConversionService内部实现如下图所示:


       FormattingConversionService内部实现如上所示,当调用convert方法时:

  1. 若是S类型----->String:调用私有的静态内部类PrinterConverter,其又调用相应的Printer 的实现进行格式化;
  2. 若是String----->T类型:调用私有的静态内部类ParserConverter,其又调用相应的Parser 的实现进行解析;
  3. 若是A 注解类型注解的S 类型----->String:调用私有的静态内部类AnnotationPrinterConverter,其又调用相应的AnnotationFormatterFactory的getPrinter 获取Printer 的实现进行格式化;

  4. 若是String----->A 注解类型注解的T 类型:调用私有的静态内部类AnnotationParserConverter,其又调用相应的AnnotationFormatterFactory的getParser 获取Parser 的实现进行解析。

        注:S类型表示源类型,T类型表示目标类型,A表示注解类型。

        此处可以可以看出之前的Converter SPI 完成任意Object 与Object 之间的类型转换,而Formatter SPI 完成任意Object与String之间的类型转换。

 

2. Spring内建的格式化转换器

类名

说明

DateFormatter

java.util.Date<---->String(实现日期的格式化/解析)

NumberFormatter

java.lang.Number<---->String(实现通用样式的格式化/解析)

CurrencyFormatter

java.lang.BigDecimal<---->String(实现货币样式的格式化/解析)

PercentFormatter

java.lang.Number<---->String(实现百分数样式的格式化/解析)

NumberFormatAnnotationFormatterFactory

@NumberFormat注解类型的数字字段类型<---->String

①通过@NumberFormat指定格式化/解析格式

②可以格式化/解析的数字类型:Short、Integer、Long、Float、Double、BigDecimal、BigInteger

JodaDateTimeFormatAnnotationFormatterFactory

@DateTimeFormat注解类型的日期字段类型<---->String

          FormattingConversionServiceFactroyBean内部已经注册了NumberFormatAnnotationFormatterFactroy,JodaDateTimeFormatAnnotationFormatterFactroy。

3. 自定义格式转换器

      此处以解析/格式化AddressVo为例。字符串"江苏-南京" 格式化为 AddressVo:


 

1. 定义Formatter实现

public class AddressFormatter_ implements Formatter<AddressVo> {
    // 中文正则表达式
    Pattern pattern = Pattern.compile("^([\u4e00-\u9fa5]*)-([\u4e00-\u9fa5]*)$");
    
    @Override
    public String print(AddressVo address, Locale locale) {
        if(address == null) return "";
        return new StringBuilder().append(address.getProvince())
                                  .append("-")
                                  .append(address.getCity())
                                  .toString();
    }

    @Override
    public AddressVo parse(String text, Locale locale) throws ParseException {
        if(!StringUtils.hasLength(text)) return null;
        
        Matcher matcher = pattern.matcher(text);
        if(matcher.matches()) {
            String province = matcher.group(1); 
            String city     = matcher.group(2); 
            return new AddressVo(province, city);
        } else {
            throw new IllegalArgumentException();
        }
    }
}

 2. 定义解析/格式化字段的注解类型

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface AddressFormatter {

}

 3. 实现AnnotationFormatterFactory注解格式化工厂

public class AddressFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<AddressFormatter> {

    private final AddressFormatter_ formatter;
    
    public AddressFormatAnnotationFormatterFactory() {
        this.formatter = new AddressFormatter_();
    }
    
    //②指定可以被解析/格式化的字段类型集合
    @Override
    public Set<Class<?>> getFieldTypes() {
        Set<Class<?>> set = new HashSet<Class<?>>();
        set.add(AddressVo.class);
        return set;
    }
    
    @Override
    public Parser<?> getParser(AddressFormatter annotation, Class<?> fieldType) {
        return formatter;
    }

    @Override   
    public Printer<?> getPrinter(AddressFormatter annotation, Class<?> fieldType) {
        return formatter;
    }
}

 4. 对实体类添加注解

@AddressFormatter
private AddressVo address;

 5. 注册自定义转换器

<!-- 配置 ConversionService -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="formatters">
        <set>
            <bean class="com.wj.web.formatters.AddressFormatAnnotationFormatterFactory"></bean>
        </set>
    </property>
</bean>

 

4. 简述Spring內建常用格式化注解用法

1.@DateTimeFormat

        @DateTimeFormat 注解可对java.util.Date、java.util.Calendar、java.long.Long 时间类型进行标注:

  • pattern 属性:类型为字符串。指定解析/格式化字段数据的模式,如:”yyyy-MM-dd hh:mm:ss”;
  • iso 属性:类型为 DateTimeFormat.ISO。指定解析/格式化字段数据的ISO模式,包括四种:ISO.NONE(不使用)  默认、ISO.DATE(yyyy-MM-dd) 、ISO.TIME(hh:mm:ss.SSSZ)、ISO.DATE_TIME(yyyy-MM-dd hh:mm:ss.SSSZ);
  • style 属性:字符串类型。通过样式指定日期时间的格式,由两位字符组成,第一位表示日期的格式,第二位表示时间的格式:S:短日期/时间格式、M:中日期/时间格式、L:长日期/时间格式、F:完整日期/时间格式、-:忽略日期或时间格式;

2. @NumberFormat

        可对类似数字类型的属性进行标注,它拥有两个互斥的属性:

  • style:类型为 NumberFormat.Style。用于指定– 样式类型,包括三种:Style.NUMBER(正常数字类型)、Style.CURRENCY(货币类型)、 Style.PERCENT(百分数类型);
  • pattern:类型为 String,自定义样式, 如patter="#,###";

3. 示例

@NumberFormat(pattern="#,####,####.#")
private double salary;
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date   birth;
 

 

代码下载来源:http://super-wangj.iteye.com/blog/2388430

 

  • 大小: 58.6 KB
  • 大小: 128.3 KB
  • 大小: 55.2 KB
  • 大小: 7.7 KB
  • 大小: 6.6 KB
分享到:
评论

相关推荐

    SpringMVC入门很简单之数据绑定(下)

    在本篇中,我们将深入探讨SpringMVC框架中的数据绑定,这是Java开发中一个至关重要的概念,尤其是在构建Web应用程序时。SpringMVC是Spring框架的一部分,它为开发RESTful服务和传统的表单提交提供了强大的支持。数据...

    01_springmvc基础_1

    **转换器与格式化器**:Spring MVC 提供了转换器和格式化器接口,用于将请求参数转换为控制器期望的类型,或将模型对象格式化为视图可以显示的格式。\n\n6. **拦截器 Interceptors**:拦截器允许你在请求被处理之前...

    springmvc01_java_maven_idea_

    在Spring MVC中,日期参数需要进行格式化才能正确绑定到Java对象上。这通常涉及到`@DateTimeFormat`注解或自定义转换器。例如,可以使用以下方式定义日期格式: ```java @DateTimeFormat(pattern = "yyyy-MM-dd")...

    SpringMVC3.0_Demo

    5. **内容协商**: 允许服务器根据客户端的能力返回不同格式的数据,如JSON、XML等,通过`@RequestMapping`的produces属性实现。 6. **国际化支持**: `MessageSource`接口提供国际化消息管理,使应用能适应不同地区...

    springmvc数据绑定示例程序

    通过这个"springmvc数据绑定示例程序",你可以学习到Spring MVC如何处理请求参数,如何将数据绑定到模型,以及如何在视图中展示这些数据。同时,它也涵盖了数据验证和自定义数据转换的使用,这些都是构建高效、健壮...

    springmvc_mybatis1208

    Controller处理业务逻辑后,将数据绑定到Model对象,然后由ViewResolver解析出对应的视图进行渲染。 二、MyBatis框架 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎...

    Java实训教程 Java软件开发实战 Java开发框架介绍 SpringMVC_5_常用注解 共22页.pptx

    - **JSON数据响应**:通过`@ResponseBody`注解配合Jackson等库直接返回JSON格式的数据。 #### 六、SpringMVC_5_常用注解 - **`@Controller`注解**: - 作用:用于标记一个类为控制器。 - 使用场景:当一个类主要...

    spring mvc 封装list到后台 SpringMVC_Multi_Row

    标题“spring mvc 封装list到后台 SpringMVC_Multi_Row”涉及到的是Spring MVC框架中如何处理前端传入的包含多行数据的列表。在Web应用开发中,经常需要将用户在页面上填写的多行数据(如表格)一次性提交到后台进行...

    springmvc_spring_

    10. **转换器和格式化器(Converter & Formatter)**:用于将请求参数或模型对象转换为适当的类型,或者将模型数据格式化为字符串。 11. **数据绑定**:Spring MVC 自动将请求参数绑定到控制器方法的参数上,简化了...

    SSM笔记-SpringMVC的数据格式化 、数据校验、错误提示、错误信息国际化、返回json

    本笔记主要关注SpringMVC中的几个关键特性:数据格式化、数据校验、错误提示、错误信息国际化以及如何返回JSON数据。 1. 数据格式化: 在SpringMVC中,数据格式化是将用户输入的数据转换为业务对象的过程。这通常...

    扩展SpringMVC以支持更精准的数据绑定1

    在默认情况下,Spring MVC使用`WebDataBinder`来处理数据绑定,它可以将请求参数与Java对象的字段进行匹配,并通过类型转换器(`Converter`)和格式化器(`Formatter`)将字符串值转化为对象类型。如果遇到无法直接...

    Maven_SpringMVC_Ibatis_Log4j

    【Maven】 Maven是一个Java项目管理...总的来说,"Maven_SpringMVC_Ibatis_Log4j"项目展示了如何利用这些技术构建一个简单的Java Web应用,涵盖了从项目初始化、依赖管理到业务逻辑处理、数据访问和日志记录的全过程。

    springmvc注解式控制器的数据验证、类型转换及格式化 SpringMVC数据验证

    总结来说,Spring MVC的注解式控制器提供了强大的数据验证、类型转换和格式化功能,简化了Web开发过程,提升了应用的安全性和用户体验。通过合理利用这些特性,开发者可以构建更加健壮、易于维护的Web应用。

    SpringMVC数据类型转换超详细介绍

    从Spring 3开始,SpringMVC引入了更为强大的数据绑定框架,解决了上述问题,并提供了更加灵活和强大的数据转换、验证及格式化能力。 ##### 1. 类型转换 - **核心组件**:`ConversionService`接口及其具体实现类`...

    springmvc-demo05-数据绑定(接受参数).zip

    在这个名为"springmvc-demo05-数据绑定(接受参数)"的项目中,我们将深入探讨Spring MVC如何实现这一特性。 1. **数据绑定的基本概念** 数据绑定是将用户输入或者HTTP请求参数自动映射到Java对象的属性上的过程。...

    springMVC取后台数据做Echarts报表

    SpringMVC作为一款强大的Java Web框架,常被用于处理HTTP请求、数据绑定和业务逻辑控制。而Echarts则是一款优秀的JavaScript图表库,能方便地创建各种交互式的数据可视化图表。本文将详细介绍如何使用SpringMVC来...

    springmvc_hibernate+json lib包

    Spring MVC提供了诸如请求映射、视图解析、数据绑定和异常处理等功能,使得Web应用的开发更为高效和灵活。 Hibernate则是一个对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。通过Hibernate,...

    ssm_springmvc_canshu

    除了`Converter`,还可以使用`Formatter`接口,它允许更细粒度的控制,比如格式化输出和解析输入。`Formatter`是`Converter`的一个扩展,具有更多的上下文信息,例如当前的Locale,这在处理多语言环境下的日期格式时...

    SpringMVC和JQUERY_api_1.6

    此外,SpringMVC支持数据绑定、异常处理、本地化和主题等功能,极大地提高了开发效率。 jQuery是JavaScript的一个库,它的出现极大地简化了前端开发。jQuery的核心特性包括选择器(用于高效地选取DOM元素)、DOM...

    springMVC返回json数据需要的两个架包

    这两个jar文件属于Jackson库的一部分,Jackson是Java中广泛使用的JSON处理库,它提供了一套完整的解决方案,包括序列化(将Java对象转化为JSON)、反序列化(将JSON字符串转化为Java对象)以及JSON数据绑定等功能。...

Global site tag (gtag.js) - Google Analytics