简介
• 对属性对象的输入/输出进行格式化,从其本质上讲依然 属于 “类型转换” 的范畴。
• 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";
}
}