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

#技术教程 发布时间: 2026-01-18

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

package com.cnblogs.yjmyzz.test;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Locale;

import org.junit.Test;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.format.number.CurrencyFormatter;
import org.springframework.format.support.DefaultFormattingConversionService;

public class FormatterTest {

  @Test
  public void testFormatter() {
    
    //设置上下语言的语言环境
    LocaleContextHolder.setLocale(Locale.US);
    
    //--------测试日期格式化----------
    Date d = new Date();
    DateFormatter dateFormatter = new DateFormatter();
    //按中文格式输出日期
    System.out.println(dateFormatter.print(d, Locale.CHINESE));//2014-10-30  
    
    DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
    //添加前面的DateFormatter
    conversionService.addFormatter(dateFormatter);
    
    System.out.println(conversionService.convert(d, String.class));//Oct 30, 2014
    
    dateFormatter.setPattern("yyyy年MM月dd日");    
    System.out.println(conversionService.convert(d, String.class));//2014年10月30日
    
    // --------测试货币格式化-------------
    CurrencyFormatter currencyFormatter = new CurrencyFormatter();
    BigDecimal money = new BigDecimal(1234567.890);
    System.out.println(currencyFormatter.print(money, Locale.CHINA));//¥1,234,567.89
    conversionService.addFormatter(currencyFormatter);
    System.out.println(conversionService.convert(money, String.class));//$1,234,567.89  
    

  }

}

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

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

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

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

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

@NumberFormat(style=Style.CURRENCY)
  //@NumberFormat(pattern="#,###.00")
  double amount;  

  @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  Date createTime;

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

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

四、枚举问题

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

4.1 先定义一个基本的枚举

package com.cnblogs.yjmyzz.enums;

public enum SEX {

  /**
   * 男
   */
  Male("1", "男"),

  /**
   * 女
   */
  Female("-1", "女"),

  /**
   * 保密
   */
  Unknown("0", "保密");

  private final String value;

  private final String description;

  private SEX(String v, String desc) {
    this.value = v;
    this.description = desc;
  }

  public String getValue() {
    return value;
  }

  public String getDescription() {
    return description;
  }

  public static SEX get(String strValue) {
    for (SEX e : values()) {
      if (e.getValue().equals(strValue)) {
        return e;
      }
    }
    return null;
  }

  @Override
  public String toString() {
    return this.value;
  }

}

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

4.2 定义SEX枚举的Converter

package com.cnblogs.yjmyzz.convertor;

import org.springframework.core.convert.converter.Converter;
import com.cnblogs.yjmyzz.enums.SEX;

public class String2SexConvertor implements Converter<String, SEX> {

  @Override
  public SEX convert(String enumValueStr) {
    String value = enumValueStr.trim();
    if (value.isEmpty()) {
      return null;
    }
    return SEX.get(enumValueStr);
  }
}

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

4.3 配置修改

<bean id="conversionService"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
      <set>
        <bean class="com.cnblogs.yjmyzz.convertor.String2SexConvertor" />
      </set>
    </property>
  </bean>

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

4.4 form页面上的绑定示例:

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

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

package com.cnblogs.yjmyzz.repository;

import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;

import com.cnblogs.yjmyzz.enums.SEX;

public class EnumRepository {
  static Map<String, String> sexMap = null;

  public static Map<String, String> getSexMap() {
    if (sexMap == null) {
      sexMap = new HashMap<String, String>();
      EnumSet<SEX> sexs = EnumSet.allOf(SEX.class);
      for (SEX sex : sexs) {
        sexMap.put(sex.getValue(), sex.getDescription());
      }
    }
    return sexMap;
  }

}

Action中,这样写:

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

4.5 页面显示时,如何转义

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

${c.sex}/${c.sex.description}/${c.sex.value}

最终显示成: Male/男/1

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。




上一篇 : redo log和undo log有什么区别_mysql事务日志对比

下一篇 : 微信公众号OAuth2.0网页授权问题浅析

推荐阅读

电话:400 76543 55
邮箱:915688610@qq.com
品牌营销
客服微信
搜索营销
公众号
©  丽景创新 版权所有 赣ICP备2024032158号 
宜昌市隼壹珍商贸有限公司 宜昌市隼壹珍商贸有限公司 宜昌市隼壹珍商贸有限公司 宜昌市隼壹珍商贸有限公司 宜昌市隼壹珍商贸有限公司 宜昌市隼壹珍商贸有限公司 宜昌市隼壹珍商贸有限公司 宜昌市隼壹珍商贸有限公司 宜昌市隼壹珍商贸有限公司 宜昌市隼壹珍商贸有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 内江振祥营销策划有限公司 恩施州毯滚百货有限公司 恩施州毯滚百货有限公司 襄阳市蜂欢商贸有限公司 襄阳市蜂欢商贸有限公司 恩施州换冯百货有限公司 恩施州换冯百货有限公司 恩施州健提百货有限公司 恩施州健提百货有限公司 西安益零商贸有限公司 西安益零商贸有限公司 南奥教育 南奥教育 南奥教育 南奥教育 南昌市南奥教育咨询有限公司 南昌市南奥教育咨询有限公司 南昌市南奥教育咨询有限公司 南昌市南奥教育咨询有限公司 南昌市南奥教育咨询有限公司 南昌市南奥教育咨询有限公司 南昌市南奥教育咨询有限公司 南昌市南奥教育咨询有限公司 南奥教育网 南奥教育网 南奥教育网 南奥教育网 南奥学习网 南奥学习网 南奥学习网 南奥学习网 南奥教育 南奥教育 南奥留学记 南奥留学记 南奥教育 南奥教育 南昌市南奥教育咨询有限公司 南昌市南奥教育咨询有限公司 南昌市南奥教育咨询有限公司 南昌市南奥教育咨询有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 南昌壹佳企网络通信有限公司 广照天下广告 广照天下广告 广照天下广告策划 广照天下广告策划 广照天下 广照天下 广照天下 广照天下 广照天下 广照天下 广照天下广告策划 广照天下广告策划 广照天下广告策划 广照天下广告策划 南昌市广照天下广告策划有限公司 南昌市广照天下广告策划有限公司 南昌市广照天下广告策划有限公司 南昌市广照天下广告策划有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 宿州市腾雀网络科技有限公司 九江市云仁商务咨询有限公司 九江市云仁商务咨询有限公司 九江市云仁商务咨询有限公司 九江市云仁商务咨询有限公司 九江市云仁商务咨询有限公司 九江市云仁商务咨询有限公司 九江市云仁商务咨询有限公司 九江市云仁商务咨询有限公司 九江市云仁商务咨询有限公司 九江市云仁商务咨询有限公司
品牌营销
专业SEO优化
添加左侧专家微信
获取产品详细报价方案