简介

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

• Spring 在格式化模块中定义了一个实现 ConversionService 接口的 FormattingConversionService 实现类,该实现类扩展 了 GenericConversionService,因此它既具有类型转换的 功能,又具有格式化的功能

• FormattingConversionService 拥有一个 FormattingConversionServiceFactroyBean 工厂类, 后者用于在 Spring 上下文中构造前者

FormattingConversionServiceFactroyBean

• FormattingConversionServiceFactroyBean 内部已经注册了 :

– NumberFormatAnnotationFormatterFactroy:支持对数字类型的属性 ,使用 @NumberFormat 注解

– JodaDateTimeFormatAnnotationFormatterFactroy:支持对日期类型 的属性,使用 @DateTimeFormat 注解

• 装配了 FormattingConversionServiceFactroyBean 后,就可以在 Spring MVC 入参绑定及模型数据输出时使用注解驱动 了。 默认创建的 ConversionService 实例即为 FormattingConversionServiceFactroyBean

<mvc:annotation-driven></mvc:annotation-driven>

日期格式化

• @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:完整 日期/时间格式、

-:忽略日期或时间格式

数值格式化

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

– style:类型为 NumberFormat.Style。用于指定样式类 型,包括三种:Style.NUMBER(正常数字类型)、 Style.CURRENCY(货币类型)、 Style.PERCENT( 百分数类型)

– pattern:类型为 String,自定义样式, 如patter="#,###,###.##";

例如

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: 23369
  Date: 3/31/2019
  Time: 3:03 PM
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>$Title$</title>
</head>
<body>
<form action="testInitBinder" method="post">s
  birth<input type="text" name="birth">
  weight<input type="text" name="weight">
  <input type="submit" value="提交">
</form>
</body>
</html>

UserDate.class(JavaBean)

package com.user;

import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;

import java.util.Date;


@Getter
@Setter
public class UserDate {


    @DateTimeFormat(pattern = "yyyy-mm-dd")
    private Date birth;

    @NumberFormat(pattern = "#,###,###.##")
    private Float weight;

    @Override
    public String toString() {
        return "UserDate{" +
                "birth=" + birth +
                ", weight=" + weight +
                '}';
    }
}

TestInitBinder.class

package com.hello2;


import com.user.UserDate;
import com.user.UserInfo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestInitBinder {

    @RequestMapping("testInitBinder")
    public String testInitBinder(UserDate userDate){

        System.out.println(userDate);

        return "success";
    }

}