`

Spring中的用于格式化的annotation[转]

 
阅读更多

转至http://linksc.iteye.com/blog/1112581

 

在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) { ... }
分享到:
评论

相关推荐

    Spring MVC Annotation验证的方法

    Spring MVC Annotation验证方法 Spring MVC 框架提供了多种验证方法,其中一种常用的方式是使用Annotation验证。本文将详细介绍 Spring MVC Annotation验证的方法,包括使用 Spring MVC 自带的 Annotation 验证和...

    Spring MVC 数据转换和格式化.docx

    `MappingJackson2HttpMessageConverter`是Spring MVC中用于处理JSON数据的典型转换器。这个转换器依赖于Jackson库,能够将Java对象转换为JSON字符串,以及将JSON字符串解析为Java对象。在配置文件中,我们需要声明这...

    Spring MVC 学习笔记 七 controller中其他可用的annotation

    12. **@InitBinder**: 这个注解可以用于初始化数据绑定行为,例如设置日期格式或忽略某些字段。 13. **@Async**: 如果你需要异步处理请求,可以使用这个注解标记方法,Spring将会以非阻塞方式调用该方法。 以上...

    spring和hibernate的Annotation

    总的来说,通过结合使用Spring和Hibernate的注解,开发者可以创建出简洁、模块化的Java应用,减少繁琐的配置,提升开发效率。这个"springAndHibernateAnnotation"项目提供了一个很好的学习平台,新手可以通过实践...

    SpringMVC源码总结(二)mvc:mvc:annotation-driven背后的那些事

    在Spring MVC框架中,`mvc:annotation-driven`是Spring MVC配置中的一个重要元素,它使得我们的应用能够支持基于注解的控制器、数据绑定、格式化转换器和服务端验证等功能。这篇博客将深入探讨`mvc:annotation-...

    SpringMVC中后台转换json格式

    &lt;bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"&gt; &lt;!-- 添加Jackson的HttpMessageConverter --&gt; &lt;bean class="org.springframework....

    springboot json时间格式化处理的方法

    在Spring Boot中处理JSON数据的时间格式化是一个常见的需求,尤其是当后端需要与前端或其他服务通过JSON格式交换日期时间数据时。为了满足不同场景下对时间格式的要求,开发者可以使用Jackson库提供的注解来解决这一...

    spring定时器 spring定时器

    Spring定时器,也被称为Spring Boot的定时任务,是Spring框架中的一个强大功能,它允许开发者在应用程序中安排周期性...通过合理配置和使用,我们可以轻松地将定时任务集成到Spring Boot应用中,实现自动化的工作流。

    jar包_javax.annotation.zip

    Java开发中,`jar`包是Java Archive的缩写,是一种可执行的文件格式,用于封装Java类库,包括`.class`文件和其他资源。在本例中,我们关注的`jar`包是`javax.annotation.zip`,它包含了`javax.annotation`相关的API...

    SpringMVC数据格式化.docx

    在Spring MVC中,数据格式化是处理数据展示和输入的重要环节。`Converter` 和 `Formatter` 是Spring MVC提供的两种工具,它们允许我们自定义类型转换,以满足特定的数据格式要求。 `Converter` 是用于在任何 `...

    Spring MVC A Tutorial Second Edition

    表达式语言(Expression Language)是Spring MVC中用于访问数据和处理逻辑的工具,它提供了一种机制,允许在XML配置和视图模板中使用表达式来获取数据。表达式语言的运用,使得页面渲染更加动态和灵活。 本书适合...

    spring mvc3.1.0 日期自动转换

    4. 国际化支持:Spring MVC还考虑到了国际化需求,允许你根据用户的语言环境(locale)来调整日期的格式。这可以通过定义不同的日期格式模板并在服务器端进行动态选择来实现。 5. 错误处理:如果自动转换失败,...

    SpringMVC源码总结(三)mvc:annotation-driven和mvc:message-converters简单介绍

    此外,它还包含了对数据绑定、验证、格式化等功能的支持。 例如,当我们在一个类上使用`@RestController`注解时,Spring MVC会自动识别这个类为RESTful服务的控制器,并处理其中的方法。方法上的`@RequestMapping`...

    annotation-1.4.14.jar.zip

    运行时处理则是JVM在运行时读取注解并采取行动,例如Spring框架中的依赖注入就是通过运行时注解处理实现的。 `annotation-1.4.14.jar`这个库可能包含了自定义注解的实现以及对应的处理器,使得开发者能够扩展Java...

    Spring MVC 学习笔记 九 json格式的输入和输出

    然后,在Spring的配置文件中,我们可以通过`&lt;mvc:annotation-driven&gt;`标签启用HTTP消息转换器支持,这样Spring MVC会自动处理JSON的序列化和反序列化。 3. **模型绑定和JSON输入** 当前端向后端发送JSON数据时,...

    (代码)SpringMVC第12讲:<mvc:annotation-driven/>

    4. **数据转换和格式化**:`&lt;mvc:annotation-driven/&gt;`还会自动注册一些数据转换器和服务,如`StringToXXXConverter`,用于将请求参数转换为合适的对象类型。同时,它也支持自定义转换器和格式化器,以便处理特定的...

    spring-framework-4.3.8,Springmvc框架需要的jar包及相匹配jackson包,

    与之配套的是Jackson库,这是一款高效的JSON处理库,常用于Spring MVC应用中进行数据序列化和反序列化。 在使用Spring Framework 4.3.8时,确保你的Java Development Kit (JDK)版本至少是1.8。这是由于Spring框架4....

    Jackson包(适合spring4.X版本的使用)

    Jackson包是Java开发中用于处理JSON数据的热门库,尤其在Spring框架中有着广泛的应用。在Spring 4.X版本中,Jackson成为了默认的JSON库,因为它提供了高效且灵活的序列化和反序列化机制。本篇文章将深入探讨Jackson...

    Spring MVC 学习笔记 十二 PDF/Excel格式输出

    Spring MVC的配置通常在`web.xml`中初始化DispatcherServlet,这是处理所有HTTP请求的前端控制器。接着,我们会在`spring-servlet.xml`或对应的配置类中定义拦截器、视图解析器、消息转换器等关键组件。例如,使用`...

    Java Annotation手册

    Spring框架中的注解支持AOP,如@Transactional,用于声明式事务管理。 六、实际应用案例 6.1 Spring框架 Spring的@Component、@Service、@Repository 和 @Controller 等注解用于组件扫描,实现依赖注入。 6.2 JPA...

Global site tag (gtag.js) - Google Analytics