spring mvc4的日期/数字格式化、枚举转换

日期、数字格式化显示,是web开发中的常见需求,spring mvc采用XXXFormatter来处理,先看一个最基本的单元测试:

 1 package com.cnblogs.yjmyzz.test;
 2
 3 import java.math.BigDecimal;
 4 import java.util.Date;
 5 import java.util.Locale;
 6
 7 import org.junit.Test;
 8 import org.springframework.context.i18n.LocaleContextHolder;
 9 import org.springframework.format.datetime.DateFormatter;
10 import org.springframework.format.number.CurrencyFormatter;
11 import org.springframework.format.support.DefaultFormattingConversionService;
12
13 public class FormatterTest {
14
15     @Test
16     public void testFormatter() {
17
18         //设置上下语言的语言环境
19         LocaleContextHolder.setLocale(Locale.US);
20
21         //--------测试日期格式化----------
22         Date d = new Date();
23         DateFormatter dateFormatter = new DateFormatter();
24         //按中文格式输出日期
25         System.out.println(dateFormatter.print(d, Locale.CHINESE));//2014-10-30
26
27         DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
28         //添加前面的DateFormatter
29         conversionService.addFormatter(dateFormatter);
30
31         System.out.println(conversionService.convert(d, String.class));//Oct 30, 2014
32
33         dateFormatter.setPattern("yyyy年MM月dd日");
34         System.out.println(conversionService.convert(d, String.class));//2014年10月30日
35
36         // --------测试货币格式化-------------
37         CurrencyFormatter currencyFormatter = new CurrencyFormatter();
38         BigDecimal money = new BigDecimal(1234567.890);
39         System.out.println(currencyFormatter.print(money, Locale.CHINA));//¥1,234,567.89
40         conversionService.addFormatter(currencyFormatter);
41         System.out.println(conversionService.convert(money, String.class));//$1,234,567.89
42
43
44     }
45
46 }

除了DateFormatter、CurrencyFormatter,常用还有的以下Formatter:

这些Formatter全都实现了接口org.springframework.format.Formatter<T>,web开发中使用起来很方便:

一、先在servlet-context.xml中参考下面的内容,修改配置:

1     <mvc:annotation-driven    conversion-service="conversionService" />
2
3     <bean id="conversionService"
4         class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
5     </bean>

二、dto类中,在需要设置格式化的字段上,打上相关的注解

1     @NumberFormat(style=Style.CURRENCY)
2     //@NumberFormat(pattern="#,###.00")
3     double amount;
4
5     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
6     Date createTime;

三、jsp页面上,使用<spring:eval />标签绑定

1   <td><spring:eval expression="c.amount" /></td>
2   <td><spring:eval expression="c.createTime" /></td>

四、枚举问题

表单提交的html页面中,经常会遇到一些诸如:性别(男、女) 的RadioButton组,背后通常对应Enum,表单提交的是String,默认情况下并不能自动映射成Model中的Enum成员,需要额外的Converter处理

4.1 先定义一个基本的枚举

 1 package com.cnblogs.yjmyzz.enums;
 2
 3 public enum SEX {
 4
 5     /**
 6      * 男
 7      */
 8     Male("1", "男"),
 9
10     /**
11      * 女
12      */
13     Female("-1", "女"),
14
15     /**
16      * 保密
17      */
18     Unknown("0", "保密");
19
20     private final String value;
21
22     private final String description;
23
24     private SEX(String v, String desc) {
25         this.value = v;
26         this.description = desc;
27     }
28
29     public String getValue() {
30         return value;
31     }
32
33     public String getDescription() {
34         return description;
35     }
36
37     public static SEX get(String strValue) {
38         for (SEX e : values()) {
39             if (e.getValue().equals(strValue)) {
40                 return e;
41             }
42         }
43         return null;
44     }
45
46     @Override
47     public String toString() {
48         return this.value;
49     }
50
51 }

保存到db中时,性别字段我们希望"男"存成"1","女"存成"-1","保密"存成"0"(当然,这只是个人喜好,仅供参考)

4.2 定义SEX枚举的Converter

 1 package com.cnblogs.yjmyzz.convertor;
 2
 3 import org.springframework.core.convert.converter.Converter;
 4 import com.cnblogs.yjmyzz.enums.SEX;
 5
 6 public class String2SexConvertor implements Converter<String, SEX> {
 7
 8     @Override
 9     public SEX convert(String enumValueStr) {
10         String value = enumValueStr.trim();
11         if (value.isEmpty()) {
12             return null;
13         }
14         return SEX.get(enumValueStr);
15     }
16 }

代码很短,不多解释,Convert方法,完成类似 "1" -> SEX.Male的转换

4.3 配置修改

1     <bean id="conversionService"
2         class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
3         <property name="converters">
4             <set>
5                 <bean class="com.cnblogs.yjmyzz.convertor.String2SexConvertor" />
6             </set>
7         </property>
8     </bean>

只需要在刚才的conversionService加上自己的Converter就行

4.4 form页面上的绑定示例:

1 <form:radiobuttons path="sex" items="${sexMap}" delimiter="&nbsp;" />

sexMap是ModelAndView中的一个属性,参考代码如下:

 1 package com.cnblogs.yjmyzz.repository;
 2
 3 import java.util.EnumSet;
 4 import java.util.HashMap;
 5 import java.util.Map;
 6
 7 import com.cnblogs.yjmyzz.enums.SEX;
 8
 9 public class EnumRepository {
10     static Map<String, String> sexMap = null;
11
12     public static Map<String, String> getSexMap() {
13         if (sexMap == null) {
14             sexMap = new HashMap<String, String>();
15             EnumSet<SEX> sexs = EnumSet.allOf(SEX.class);
16             for (SEX sex : sexs) {
17                 sexMap.put(sex.getValue(), sex.getDescription());
18             }
19         }
20         return sexMap;
21     }
22
23 }

Action中,这样写:

 1     @RequestMapping(value = "edit/{id}")
 2     public ModelAndView edit(@PathVariable int id, HttpServletRequest request,
 3             HttpServletResponse response) throws Exception {
 4         ModelAndView model = new ModelAndView();
 5         Order order = orderService.get(id + "");
 6         model.addObject("sexMap", EnumRepository.getSexMap());//枚举列表,便于页面绑定
 7         model.addObject("data", order);
 8         model.setViewName("orders/edit");
 9         return model;
10     }

4.5 页面显示时,如何转义

就刚才的示例而言,性别“男”,对应SEX.Male,自定义值是"1",自定义描述是“男”,默认情况下${model.sex}显示成Male,如果想显示“自定义值”或“自定义描述”,不考虑国际化的话,直接调用value或description属性即可,参考下面的内容:

1 <td>${c.sex}/${c.sex.description}/${c.sex.value}</td>

最终显示成: Male/男/1

时间: 2024-10-08 22:18:33

spring mvc4的日期/数字格式化、枚举转换的相关文章

Swift教程_基础技术_获取当前日期时间、日期时间格式化及转换

Swift教程_基础技术_类型转换(父子类转换:Int.Double.String转换) Swift教程_基础技术_获取当前日期时间.日期时间格式化及转换 1.获取当前日期时间 var nowDate = NSDate() var formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" var dateString = formatter.stringFromDate(nowDate) pri

重温JSP学习笔记--与日期数字格式化有关的jstl标签库

上一篇笔记写的主要是JSTL的core标签库,如果想对一些数字或者日期做一些操作或者在网页上显示指定格式的数字或日期,jstl还提供了另一个fmt标签库,这里简单介绍一下: 第一步,导入标签库: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 格式化时间(在网页面上显示时间): <% Date date=new Date(); pageContext.setAttr

C#:STRING.FORMAT数字格式化输出

1.各种常用数字格式化 货币转换 C 或 c(默认小数点后2位.C3后面跟的数字就代表小数后几位)    string.Format("{0:C}",a)<==>a.ToString("C")//$2.50    string.Format("{0:C3}",a)<==>a.ToString("C3")//$2.500 转换为十进制数 D 或 d a=25 string.Format("{0:

[应用篇]JSTL之fmt标签日期和数字格式化

fmt标签个人用的比较少,但是我还是在这里简单的留一下笔记,也是算是学习了一下!这样方便你们课设的时候能用的上,要学会进步的学习,不要停留! 引入该标签库的方法为: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 这里提供了很多的内容,我这里只是介绍关于数字和日期格式化的内容 formatNumber标签.formatData标签.parseNumber标签.parseD

DB2中字符、数字和日期类型之间的转换

DB2中字符.数字和日期类型之间的转换 一般我们在使用DB2或Oracle的过程中,经常会在数字<->字符<->日期三种类 型之间做转换,那么在DB2和Oracle中,他们分别是如何实现的呢?在Oracle这几个类型之间的转换是十分方便的,通过 to_char|to_date|to_number函数即可完成类型转换.本小节主要介绍DB2中的一些知识,从Oracle转过来的DBA或开发人 员,可以对比着学习. 数字型到字符型的转换 DB2中的col_a字段 字段类型 到字符类型的转换

[Swift4.2互动教程]七、常见概念-(6)日期Date和DateFormatter日期的格式化

本文将为你演示日期类型的使用,以及如何对日期进行格式化. 首先引入需要使用到的界面框架 import UIKit 初始化一个日期对象,它的值和当前电脑中的日期相同 var date = Date() 获得当前60分钟之后的时间 date.addTimeInterval(60 * 60) 获得当前60分钟之后的时间,并存储再一个常量之中. let sencondDate = date.addTimeInterval(60 * 60) 对两个时间进行比较,当时间小于进行比较的时间时,返回值为-1.比

String.Format数字格式化输出 {0:N2} {0:D2} {0:C2} (转)

String.Format数字格式化输出 {0:N2} {0:D2} {0:C2} (转) //格式为sring输出 // Label1.Text = string.Format("asdfadsf{0}adsfasdf",a); // Label2.Text = "asdfadsf"+a.ToString()+"adsfasdf"; // Label1.Text = string.Format("asdfadsf{0:C}adsfas

String.Format数字格式化输出 {0:N2} {0:D2} {0:C2}

String.Format数字格式化输出 {0:N2} {0:D2} {0:C2} 数字 {0:N2} 12.36 数字 {0:N0} 13 货币 {0:c2} $12.36 货币 {0:c4} $12.3656 货币 "¥{0:N2}" ¥12.36 科学计数法 {0:E3} 1.23E+001 百分数 {0:P} 12.25% P and p present the same. 日期 {0:D} 2006年11月25日 日期 {0:d} 2006-11-25 日期 {0:f} 20

Spring MVC4设置使用fastjson作为json解析器,替代jackson

不论是性能.易用性.特性支持,fastjson都要远好于默认的jackson,所以如果应用程序经常使用ajax进行数据交互,建议用fastjson作为默认解析器,只需要简单配置: <mvc:annotation-driven>   <mvc:message-converters register-defaults="true">     <bean class="com.alibaba.fastjson.support.spring.FastJs