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:

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

这些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

你可能感兴趣的:(spring mvc)