在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
分享到:
相关推荐
* 国际化支持:Annotation 验证支持国际化,可以根据不同的语言环境进行验证。 六、结论 Spring MVC Annotation 验证是一种简洁、灵活、高效的验证方法。它可以帮助我们快速实现数据验证,提高开发效率。本文详细...
12. **@InitBinder**: 这个注解可以用于初始化数据绑定行为,例如设置日期格式或忽略某些字段。 13. **@Async**: 如果你需要异步处理请求,可以使用这个注解标记方法,Spring将会以非阻塞方式调用该方法。 以上...
总的来说,通过结合使用Spring和Hibernate的注解,开发者可以创建出简洁、模块化的Java应用,减少繁琐的配置,提升开发效率。这个"springAndHibernateAnnotation"项目提供了一个很好的学习平台,新手可以通过实践...
`MappingJackson2HttpMessageConverter`是Spring MVC中用于处理JSON数据的典型转换器。这个转换器依赖于Jackson库,能够将Java对象转换为JSON字符串,以及将JSON字符串解析为Java对象。在配置文件中,我们需要声明这...
在Spring MVC框架中,`mvc:annotation-driven`是Spring MVC配置中的一个重要元素,它使得我们的应用能够支持基于注解的控制器、数据绑定、格式化转换器和服务端验证等功能。这篇博客将深入探讨`mvc:annotation-...
在Spring Boot中处理JSON数据的时间格式化是一个常见的需求,尤其是当后端需要与前端或其他服务通过JSON格式交换日期时间数据时。为了满足不同场景下对时间格式的要求,开发者可以使用Jackson库提供的注解来解决这一...
Spring定时器,也被称为Spring Boot的定时任务,是Spring框架中的一个强大功能,它允许开发者在应用程序中安排周期性...通过合理配置和使用,我们可以轻松地将定时任务集成到Spring Boot应用中,实现自动化的工作流。
Java开发中,`jar`包是Java Archive的缩写,是一种可执行的文件格式,用于封装Java类库,包括`.class`文件和其他资源。在本例中,我们关注的`jar`包是`javax.annotation.zip`,它包含了`javax.annotation`相关的API...
运行时处理则是JVM在运行时读取注解并采取行动,例如Spring框架中的依赖注入就是通过运行时注解处理实现的。 `annotation-1.4.14.jar`这个库可能包含了自定义注解的实现以及对应的处理器,使得开发者能够扩展Java...
表达式语言(Expression Language)是Spring MVC中用于访问数据和处理逻辑的工具,它提供了一种机制,允许在XML配置和视图模板中使用表达式来获取数据。表达式语言的运用,使得页面渲染更加动态和灵活。 本书适合...
在Spring MVC中,数据格式化是处理数据展示和输入的重要环节。`Converter` 和 `Formatter` 是Spring MVC提供的两种工具,它们允许我们自定义类型转换,以满足特定的数据格式要求。 `Converter` 是用于在任何 `...
此外,它还包含了对数据绑定、验证、格式化等功能的支持。 例如,当我们在一个类上使用`@RestController`注解时,Spring MVC会自动识别这个类为RESTful服务的控制器,并处理其中的方法。方法上的`@RequestMapping`...
Spring框架中的注解支持AOP,如@Transactional,用于声明式事务管理。 六、实际应用案例 6.1 Spring框架 Spring的@Component、@Service、@Repository 和 @Controller 等注解用于组件扫描,实现依赖注入。 6.2 JPA...
然后,在Spring的配置文件中,我们可以通过`<mvc:annotation-driven>`标签启用HTTP消息转换器支持,这样Spring MVC会自动处理JSON的序列化和反序列化。 3. **模型绑定和JSON输入** 当前端向后端发送JSON数据时,...
例如,`beans.xsd`包含了Spring配置的基本元素,如`<bean>`、`<property>`等,用于定义bean的实例化、属性设置以及依赖关系。 其次,`context.xsd`扩展了`beans.xsd`,提供了更多上下文相关的配置,如`...
首先,让我们了解Spring中用于日志管理的主要注解。Spring本身并不直接提供日志注解,但我们可以结合Spring与其他流行的日志库,如Log4j2、SLF4J(Simple Logging Facade for Java)和Logback,来实现基于注解的日志...
与之配套的是Jackson库,这是一款高效的JSON处理库,常用于Spring MVC应用中进行数据序列化和反序列化。 在使用Spring Framework 4.3.8时,确保你的Java Development Kit (JDK)版本至少是1.8。这是由于Spring框架4....
Spring配置文件是XML格式的文件,用于定义对象及其依赖关系,通过配置文件,Spring IoC容器可以管理这些对象的生命周期。 7、Spring应用程序有哪些不同组件? Spring应用程序的组件主要包括: - Beans:在Spring ...
4. **数据转换和格式化**:`<mvc:annotation-driven/>`还会自动注册一些数据转换器和服务,如`StringToXXXConverter`,用于将请求参数转换为合适的对象类型。同时,它也支持自定义转换器和格式化器,以便处理特定的...
在Spring的bean中,我们可以使用`@PostConstruct`和`@PreDestroy`注解来标记初始化和销毁方法,同时在这些方法中插入Log4j的日志记录,以便追踪bean的生命周期。例如: ```java @Service public class MyService { ...