`
xiaoyuqi00
  • 浏览: 24892 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Spring中的用于格式化的annotation

 
阅读更多

在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注解接可以了。例如下面的代码:

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中的数据用于显示的时候,我们会得到类似下图的结果:




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

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;
}

}



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



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

注解的可选属性
注解的属性决定了@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) { ... }


 

  • 大小: 144.8 KB
  • 大小: 126.1 KB
分享到:
评论
1 楼 woshixushigang 2012-06-27  
问下,如何重写自己的格式化信息 message="xxxx"?比如输入非法字符串,不是数字的时候,我想输出我自己的提示信息。
如: @Min(value = 1, message = "格式错误,请重新填写")
number貌似没有message属性

相关推荐

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Spring Boot中文文档.rar

    spring boot中文文档,从安装到部署。 I. Spring Boot文件 1.关于文档 2.获得帮助 3.第一步 4.使用Spring Boot 5.了解Spring Boot功能 6.转向生产 7.高级主题 II。入门 8.介绍Spring Boot ...

    Spring3.x企业应用开发实战(完整版) part1

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    report-annotation:用于报告物化的 Java bean 注释

    name 属性是列标签,columnIndex 是报表中列的顺序 @ReportField(name = "Brewer", columnIndex = 0) private String name; 动机 将报告框架(Jasper 等)用于简单的表格报告是超载的。 那些为可视化报告设计的...

    yunguanjiacode06131049.zip

    import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; ...

    SpringMVC Employee Demo

    driven配置、InitBinder注解、数据的格式化、JSR303数据校验、错误消息的显示及国际化、Ajax返回JSON、使用HttpMessageConverter、国际化_通过超链接切换中英文、文件上传、自定义的拦截器、拦截器的零Xml配置、异常...

    S2S3H3整合以及泛型Dao与Service封装

    的错误,以及Json时间的格式化,对初学者有些帮助。运行前先修改jdbc.properties文件,可以加入jtds的SQL Server驱动包使用SQL Server进行运行。运行时,使用是通过...

    web开发常用jar

    web开发常用jar包 常用jar包 commons-beanutils.jar Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。...Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。 sitemesh.jar

    java8源码-my-api:各种技术api尝试操作

    这里存放通用api操作,其中攘括了通用Util,如二位码生成、中文转拼音、spring-bean方式格式化输出;除了Util外,tfidf为 中文分词 个人实现,可以说仿照Lucense 思想实现,可能在性能上有所欠缺;dbAccess 是自己 ...

    java8源码-my-java-api:java相关技术学习:jdkjvmniodisruptorwebcamelgroovyjavassis

    通用Util,如二位码生成、中文转拼音、spring-bean方式格式化输出; 除了Util外,tfidf为 中文分词 个人实现,可以说仿照Lucense 思想实现,可能在性能上有所欠缺; dbAccess 是自己 采用ETL 方式进行不同数据库DB ...

    java开发常用jar包

    Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。 sitemesh.jar Sitemesh 是一个基于WEB页面的布局、装饰以及应用整合的开源框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,...

    java开源包1

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包11

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包2

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包3

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包6

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包5

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包10

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包4

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包8

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

Global site tag (gtag.js) - Google Analytics