Spring 格式化注解

在2009年,Spring Framework 3.0发布了,带来了很多新的功能强大的特性。 除了支持RESTful Web service的Spring Expression Language(SpEL)等主要功能外,还有一些很方便的,而且不需要太多时间学习的新的特性。这里我们介绍其中的一个:用于格式化的注解。
简介

Spring 3 提供了两个可以用于格式化数字、日期和时间的注解@NumberFormat和@DateTimeFormat,这两个标签可以用于bean的属性或方法参数上。@NumberFormat可以用来格式化任何的数字的基本类型(如int,long)或java.lang.Number的实例(如 BigDecimal, Integer)。@DateTimeFormat可以用来格式化java.util.Date、java.util.Calendar和 java.util.Long类型,也可以用于Joda Time类型的字段或参数。(Joda Time是一个开源的包,提供了对date和time类的一些替代类)。

要指定数字或日期/时间类型的属性,只需要在其上添加 @NumberFormat或@DateTimeFormat注解接可以了。例如下面的代码:
  1. import java.math.BigDecimal;
  2. import java.util.Calendar;
  3. import java.util.Date;

  4. import org.joda.time.LocalTime;

  5. public class Employee {

  6. private String name;

  7. private double salary;
  8. private double w4AdditionalWithdraw;
  9. private int dependents;
  10. private BigDecimal visualAcuity;

  11. private Date birthDate;
  12. private Calendar hireDate;
  13. private LocalTime startTime;
  14. private long lastTimeEntry;

  15. /**
  16. * initialization block to provide sample data for display
  17. */
  18. {
  19. this.name = "John Doe";
  20. this.salary = 30100.50;
  21. this.w4AdditionalWithdraw = 0.02;
  22. this.dependents = 5;
  23. this.visualAcuity = new BigDecimal(".1");

  24. Calendar dob = Calendar.getInstance();
  25. dob.set(1964, Calendar.AUGUST, 30);
  26. this.birthDate = dob.getTime();
  27. this.hireDate = Calendar.getInstance();
  28. this.startTime = new LocalTime(8, 0);
  29. this.lastTimeEntry = (new Date()).getTime() - 10000;
  30. }

  31. public String getName() {
  32. return name;
  33. }

  34. public void setName(String name) {
  35. this.name = name;
  36. }

  37. public double getSalary() {
  38. return salary;
  39. }

  40. public void setSalary(double salary) {
  41. this.salary = salary;
  42. }

  43. public double getW4AdditionalWithdraw() {
  44. return w4AdditionalWithdraw;
  45. }

  46. public void setW4AdditionalWithdraw(double w4AdditionalWithdraw) {
  47. this.w4AdditionalWithdraw = w4AdditionalWithdraw;
  48. }

  49. public int getDependents() {
  50. return dependents;
  51. }

  52. public void setDependents(int dependents) {
  53. this.dependents = dependents;
  54. }

  55. public BigDecimal getVisualAcuity() {
  56. return visualAcuity;
  57. }

  58. public void setVisualAcuity(BigDecimal visualAcuity) {
  59. this.visualAcuity = visualAcuity;
  60. }

  61. public Date getBirthDate() {
  62. return birthDate;
  63. }

  64. public void setBirthDate(Date birthDate) {
  65. this.birthDate = birthDate;
  66. }

  67. public LocalTime getStartTime() {
  68. return startTime;
  69. }

  70. public void setStartTime(LocalTime startTime) {
  71. this.startTime = startTime;
  72. }

  73. public Calendar getHireDate() {
  74. return hireDate;
  75. }

  76. public void setHireDate(Calendar hireDate) {
  77. this.hireDate = hireDate;
  78. }

  79. public long getLastTimeEntry() {
  80. return lastTimeEntry;
  81. }

  82. public void setLastTimeEntry(long lastTimeEntry) {
  83. this.lastTimeEntry = lastTimeEntry;
  84. }

  85. }
复制代码


这段代码中我们没有添加注解。如果我们使用Spring 份额Form 标签将这个bean中的数据用于显示的时候,我们会得到类似下图的结果:
Fig1_FormWithoutAnnotations.JPG 

可以看到,所有的数据都是以默认的格式显示的,Spring会使用默认的格式将数据显示在HTML表格中(其他的框架也大多如此)。如果想显示特殊的格式,开发人员必须编写特殊的getter/setter方法或使用PropertyEditors来显示特殊格式的数字或者日期/时间。
现在有了 @NumberFormat和@DateTimeFormat注解,我们可以使用这两个注解来完成同样的功能。如下面的代码所示:
  1. import java.math.BigDecimal;
  2. import java.util.Calendar;
  3. import java.util.Date;

  4. import org.joda.time.LocalTime;
  5. import org.springframework.format.annotation.DateTimeFormat;
  6. import org.springframework.format.annotation.NumberFormat;
  7. import org.springframework.format.annotation.DateTimeFormat.ISO;
  8. import org.springframework.format.annotation.NumberFormat.Style;

  9. public class Employee {

  10. private String name;

  11. /**
  12. * numeric fields using @NumberFormat annotation for formatting.
  13. */
  14. @NumberFormat(style = Style.CURRENCY)
  15. private double salary;
  16. @NumberFormat(style = Style.PERCENT)
  17. private double w4AdditionalWithdraw;
  18. @NumberFormat
  19. private int dependents;
  20. @NumberFormat(pattern = "0.00")
  21. private BigDecimal visualAcuity;

  22. /**
  23. * date and time fields using @DateTimeFormat annotation for formatting.
  24. */
  25. @DateTimeFormat(style = "M-")
  26. private Date birthDate;
  27. @DateTimeFormat(pattern = "w:yyyy")
  28. private Calendar hireDate;
  29. @DateTimeFormat(style = "-S")
  30. private LocalTime startTime;
  31. @DateTimeFormat(iso = ISO.DATE_TIME)
  32. private long lastTimeEntry;

  33. /**
  34. * initialization block to provide sample data for display
  35. */
  36. {
  37. this.name = "John Doe";
  38. this.salary = 30100.50;
  39. this.w4AdditionalWithdraw = 0.02;
  40. this.dependents = 5;
  41. this.visualAcuity = new BigDecimal(".1");

  42. Calendar dob = Calendar.getInstance();
  43. dob.set(1964, Calendar.AUGUST, 30);
  44. this.birthDate = dob.getTime();
  45. this.hireDate = Calendar.getInstance();
  46. this.startTime = new LocalTime(8, 0);
  47. this.lastTimeEntry = (new Date()).getTime() - 10000;
  48. }

  49. public String getName() {
  50. return name;
  51. }

  52. public void setName(String name) {
  53. this.name = name;
  54. }

  55. public double getSalary() {
  56. return salary;
  57. }

  58. public void setSalary(double salary) {
  59. this.salary = salary;
  60. }

  61. public double getW4AdditionalWithdraw() {
  62. return w4AdditionalWithdraw;
  63. }

  64. public void setW4AdditionalWithdraw(double w4AdditionalWithdraw) {
  65. this.w4AdditionalWithdraw = w4AdditionalWithdraw;
  66. }

  67. public int getDependents() {
  68. return dependents;
  69. }

  70. public void setDependents(int dependents) {
  71. this.dependents = dependents;
  72. }

  73. public BigDecimal getVisualAcuity() {
  74. return visualAcuity;
  75. }

  76. public void setVisualAcuity(BigDecimal visualAcuity) {
  77. this.visualAcuity = visualAcuity;
  78. }

  79. public Date getBirthDate() {
  80. return birthDate;
  81. }

  82. public void setBirthDate(Date birthDate) {
  83. this.birthDate = birthDate;
  84. }

  85. public LocalTime getStartTime() {
  86. return startTime;
  87. }

  88. public void setStartTime(LocalTime startTime) {
  89. this.startTime = startTime;
  90. }

  91. public Calendar getHireDate() {
  92. return hireDate;
  93. }

  94. public void setHireDate(Calendar hireDate) {
  95. this.hireDate = hireDate;
  96. }

  97. public long getLastTimeEntry() {
  98. return lastTimeEntry;
  99. }

  100. public void setLastTimeEntry(long lastTimeEntry) {
  101. this.lastTimeEntry = lastTimeEntry;
  102. }

  103. }
复制代码


当在页面上显示的时候,我们会直接得到我们想要的格式,如下图所示:
Fig2_FormWithAnnotations.JPG 

注解的可选属性
注解的属性决定了@NumberFormat和@DateTimeFormat注解怎样格式化相应的属性。 @NumberFormat注解有两个可选的属性:style和pattern。style属性是一个NumberFormat.Style枚举值,可以是以下的三个值之一:
NumberFormat.Style 枚举值
是否缺省值
NUMBER
CURRENCY
PERCENT


这 3种style的应用我们在上面的代码中都有相应的例子。

具体的style的表现形式是与区域相关的。例如,一个double类型的字段,如果style是CURRENCY,那么在en-us的区域显示的时候前面会加上$,在zh-cn的区域显示的时候前面会加上¥。

如果以上的3中方式无法满足需求,我们可以使用pattern属性来指定特殊的输出格式。Pattern的值要遵循Java标准的numeric formatting pattern。对于@NumberFormat来说缺省的是没有pattern的。

@DateTimeFormat 注解有3个可选的属性:style,pattern和iso。属性style允许我们使用两个字符的字符串来表明怎样格式化日期和时间。第一个字符表明了日期的格式,第二个字符表明了时间的格式。下面的表格中列出了可用的选择以及相应的输出的例子:
描述 字符串值 示例输出
短格式(这是缺省值) SS 
  8/30/64 11:24 AM
中等格式 MM   Aug 30, 1964 11:24:41 AM
长格式 LL
August 30, 1964 11:24:41 AM CDT
完整格式 FF   Sunday, August 30, 1964 11:24:41 AM CDT
使用短横线省略日期或时间 M- Aug 30, 1964



Pattern 属性允许我们使用自定义的日期/时间格式。该属性的值遵循java标准的date/time格式规范。缺省的该属性的值为空,也就是不进行特殊的格式化。

最后,可以使用org.springframework.format.annotation.DateTimeFormat.ISO枚举值来使用ISO标准的日期/时间格式来格式化。下面的表格中列出了可能的值和相应的输出
ISO枚举值
输出
DATE   2000-10-31
TIME   01:30:00.000-05:00(最后的是时区)
DATE_TIME 2000-10-31 01:30:00.000-05:00.
NONE 不进行ISO标准的格式化

使用格式化注解的设置

要使用上面介绍的格式化注解,需要进行如下的配置:

1.下载Spring 3.0的jar包并加入到类路径中。

2. 将下面的配置信息加入到spring bean的XML配置文件中。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <mvc:annotation-driven /> </beans>
解析参数

我们也可以使用这些注解来告诉Spring怎样解析输入的数据。下面的例子显示了怎样使用@DateTimeFormat来解析以ISO格式输入的时间信息:
public String getEmployeesOnTheClock(@DateTimeFormat(iso=ISO.TIME) java.util.Date time) { ... }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值