`
xiaoyuqi00
  • 浏览: 25545 次
  • 性别: 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 MVC Annotation验证的方法

    * 国际化支持:Annotation 验证支持国际化,可以根据不同的语言环境进行验证。 六、结论 Spring MVC Annotation 验证是一种简洁、灵活、高效的验证方法。它可以帮助我们快速实现数据验证,提高开发效率。本文详细...

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

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

    spring和hibernate的Annotation

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

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

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

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

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

    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...

    annotation-1.4.14.jar.zip

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

    Spring MVC A Tutorial Second Edition

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

    SpringMVC数据格式化.docx

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

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

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

    Java Annotation手册

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

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

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

    spring3.0的xsd文件.rar

    例如,`beans.xsd`包含了Spring配置的基本元素,如`&lt;bean&gt;`、`&lt;property&gt;`等,用于定义bean的实例化、属性设置以及依赖关系。 其次,`context.xsd`扩展了`beans.xsd`,提供了更多上下文相关的配置,如`...

    spring注解管理日志

    首先,让我们了解Spring中用于日志管理的主要注解。Spring本身并不直接提供日志注解,但我们可以结合Spring与其他流行的日志库,如Log4j2、SLF4J(Simple Logging Facade for Java)和Logback,来实现基于注解的日志...

    Spring系列面试题129道(附答案解析)

    Spring配置文件是XML格式的文件,用于定义对象及其依赖关系,通过配置文件,Spring IoC容器可以管理这些对象的生命周期。 7、Spring应用程序有哪些不同组件? Spring应用程序的组件主要包括: - Beans:在Spring ...

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

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

    spring简单注解+log4j记录日志

    在Spring的bean中,我们可以使用`@PostConstruct`和`@PreDestroy`注解来标记初始化和销毁方法,同时在这些方法中插入Log4j的日志记录,以便追踪bean的生命周期。例如: ```java @Service public class MyService { ...

    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....

Global site tag (gtag.js) - Google Analytics