zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Qt的网络通信(以一对一聊天室为例)
    C/C++中的const ,static
    Qt的认识与相关问题的解决
    Qt的简单介绍,发展和由来
    STL模板的基础与了解
    malloc与new,C++中的指针与引用,C++struct与class的区别
    Qt的常用控件及控件的使用
    Qt的环境与工具、信号与槽
    学习Qt前你需要知道的
    模板与STL小结--vector、list、map等各类容器
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/4062473.html
Copyright © 2011-2022 走看看