首页 > 代码库 > spring mvc4的日期/数字格式化、枚举转换

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     @Test16     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         //添加前面的DateFormatter29         conversionService.addFormatter(dateFormatter);30         31         System.out.println(conversionService.convert(d, String.class));//Oct 30, 201432         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.8940         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 =http://www.mamicode.com/ 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     @Override47     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 =http://www.mamicode.com/ 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 = "http://www.mamicode.com/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

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