zoukankan      html  css  js  c++  java
  • Spring格式化注解

    Spring Framework 3.0发布了。这里我们介绍其中的一个:用于格式化的注解。
    简介

    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;
      import java.util.Calendar;
      import java.util.Date;
      import org.joda.time.LocalTime;
      public class Employee {
      private String name;
      private double salary;
      private double w4AdditionalWithdraw;
      private int dependents;
      private BigDecimal visualAcuity;
      private Date birthDate;
      private Calendar hireDate;
      private LocalTime startTime;
      private long lastTimeEntry;
      /**
      * initialization block to provide sample data for display
      */
      {
      this.name = "John Doe";
      this.salary = 30100.50;
      this.w4AdditionalWithdraw = 0.02;
      this.dependents = 5;
      this.visualAcuity = new BigDecimal(".1");
      Calendar dob = Calendar.getInstance();
      dob.set(1964, Calendar.AUGUST, 30);
      this.birthDate = dob.getTime();
      this.hireDate = Calendar.getInstance();
      this.startTime = new LocalTime(8, 0);
      this.lastTimeEntry = (new Date()).getTime() - 10000;
      }
      public String getName() {
      return name;
      }
      public void setName(String name) {
      this.name = name;
      }
      public double getSalary() {
      return salary;
      }
      public void setSalary(double salary) {
      this.salary = salary;
      }
      public double getW4AdditionalWithdraw() {
      return w4AdditionalWithdraw;
      }
      public void setW4AdditionalWithdraw(double w4AdditionalWithdraw) {
      this.w4AdditionalWithdraw = w4AdditionalWithdraw;
      }
      public int getDependents() {
      return dependents;
      }
      public void setDependents(int dependents) {
      this.dependents = dependents;
      }
      public BigDecimal getVisualAcuity() {
      return visualAcuity;
      }
      public void setVisualAcuity(BigDecimal visualAcuity) {
      this.visualAcuity = visualAcuity;
      }
      public Date getBirthDate() {
      return birthDate;
      }
      public void setBirthDate(Date birthDate) {
      this.birthDate = birthDate;
      }
      public LocalTime getStartTime() {
      return startTime;
      }
      public void setStartTime(LocalTime startTime) {
      this.startTime = startTime;
      }
      public Calendar getHireDate() {
      return hireDate;
      }
      public void setHireDate(Calendar hireDate) {
      this.hireDate = hireDate;
      }
      public long getLastTimeEntry() {
      return lastTimeEntry;
      }
      public void setLastTimeEntry(long lastTimeEntry) {
      this.lastTimeEntry = lastTimeEntry;
      }
      }
      复制代码



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

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

    1. import java.math.BigDecimal;
      import java.util.Calendar;
      import java.util.Date;
      import org.joda.time.LocalTime;
      import org.springframework.format.annotation.DateTimeFormat;
      import org.springframework.format.annotation.NumberFormat;
      import org.springframework.format.annotation.DateTimeFormat.ISO;
      import org.springframework.format.annotation.NumberFormat.Style;
      public class Employee {
      private String name;
      /**
      * numeric fields using @NumberFormat annotation for formatting.
      */
      @NumberFormat(style = Style.CURRENCY)
      private double salary;
      @NumberFormat(style = Style.PERCENT)
      private double w4AdditionalWithdraw;
      @NumberFormat
      private int dependents;
      @NumberFormat(pattern = "0.00")
      private BigDecimal visualAcuity;
      /**
      * date and time fields using @DateTimeFormat annotation for formatting.
      */
      @DateTimeFormat(style = "M-")
      private Date birthDate;
      @DateTimeFormat(pattern = "w:yyyy")
      private Calendar hireDate;
      @DateTimeFormat(style = "-S")
      private LocalTime startTime;
      @DateTimeFormat(iso = ISO.DATE_TIME)
      private long lastTimeEntry;
      /**
      * initialization block to provide sample data for display
      */
      {
      this.name = "John Doe";
      this.salary = 30100.50;
      this.w4AdditionalWithdraw = 0.02;
      this.dependents = 5;
      this.visualAcuity = new BigDecimal(".1");
      Calendar dob = Calendar.getInstance();
      dob.set(1964, Calendar.AUGUST, 30);
      this.birthDate = dob.getTime();
      this.hireDate = Calendar.getInstance();
      this.startTime = new LocalTime(8, 0);
      this.lastTimeEntry = (new Date()).getTime() - 10000;
      }
      public String getName() {
      return name;
      }
      public void setName(String name) {
      this.name = name;
      }
      public double getSalary() {
      return salary;
      }
      public void setSalary(double salary) {
      this.salary = salary;
      }
      public double getW4AdditionalWithdraw() {
      return w4AdditionalWithdraw;
      }
      public void setW4AdditionalWithdraw(double w4AdditionalWithdraw) {
      this.w4AdditionalWithdraw = w4AdditionalWithdraw;
      }
      public int getDependents() {
      return dependents;
      }
      public void setDependents(int dependents) {
      this.dependents = dependents;
      }
      public BigDecimal getVisualAcuity() {
      return visualAcuity;
      }
      public void setVisualAcuity(BigDecimal visualAcuity) {
      this.visualAcuity = visualAcuity;
      }
      public Date getBirthDate() {
      return birthDate;
      }
      public void setBirthDate(Date birthDate) {
      this.birthDate = birthDate;
      }
      public LocalTime getStartTime() {
      return startTime;
      }
      public void setStartTime(LocalTime startTime) {
      this.startTime = startTime;
      }
      public Calendar getHireDate() {
      return hireDate;
      }
      public void setHireDate(Calendar hireDate) {
      this.hireDate = hireDate;
      }
      public long getLastTimeEntry() {
      return lastTimeEntry;
      }
      public void setLastTimeEntry(long lastTimeEntry) {
      this.lastTimeEntry = lastTimeEntry;
      }
      }
    复制代码



    当在页面上显示的时候,我们会直接得到我们想要的格式,如下图所示:
    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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvchttp://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) { ... }

  • 相关阅读:
    移动应用跨平台之旅
    ReactNative之坑爹的在线安装
    关于拆箱装箱引发的类型转换报错
    Unity HDR (高动态范围 )
    Instruments如何看Mono内存分配
    Unity编辑器崩溃大全
    Unity3D获取手机存储空间
    关于构建AssetBundle哈希冲突的问题
    关于UnityWebRequest的超时讨论
    Wwise音频插件介绍
  • 原文地址:https://www.cnblogs.com/zengda/p/4572634.html
Copyright © 2011-2022 走看看