全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

日期、数字格式化显示,是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

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


# spring  # mvc4  # 枚举转换  # 日期转换  # springboot DTO字符字段与日期字段的转换问题  # springboot日期转换器实现实例解析  # 解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题  # Spring MVC自定义日期类型转换器实例详解  # SpringMVC中日期格式的转换  # SpringMVC对日期类型的转换示例  # 详解spring mvc4使用及json 日期转换解决方案  # SpringMVC用JsonSerialize日期转换方法  # Springboot日期转换器实现代码及示例  # 自定义  # 绑定  # 表单  # 自己的  # 的是  # 情况下  # 不多  # 只需  # 要在  # 就行  # 这只  # 并不能  # 先在  # 很方便  # 经常会  # 很短  # 先看  # 大家多多  # 中时  # 类中 


相关文章: SQL查询语句优化的实用方法总结  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  建站主机选购指南与交易推荐:核心配置解析  ,怎么用自己头像做动态表情包?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  宝塔建站教程:一键部署配置流程与SEO优化实战指南  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  如何在Golang中指定模块版本_使用go.mod控制版本号  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  制作宣传网站的软件,小红书可以宣传网站吗?  网站制作网站,深圳做网站哪家比较好?  高防服务器:AI智能防御DDoS攻击与数据安全保障  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  高性价比服务器租赁——企业级配置与24小时运维服务  如何正确选择百度移动适配建站域名?  如何在景安服务器上快速搭建个人网站?  c# await 一个已经完成的Task会发生什么  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  建站之星导航配置指南:自助建站与SEO优化全解析  黑客入侵网站服务器的常见手法有哪些?  网站app免费制作软件,能免费看各大网站视频的手机app?  如何在阿里云购买域名并搭建网站?  如何在云虚拟主机上快速搭建个人网站?  建站VPS选购需注意哪些关键参数?  如何快速生成专业多端适配建站电话?  建站之星展会模板:智能建站与自助搭建高效解决方案  如何撰写建站申请书?关键要点有哪些?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  ppt制作免费网站有哪些,ppt模板免费下载网站?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  宝塔新建站点为何无法访问?如何排查?  网站制作公司排行榜,抖音怎样做个人官方网站  如何确认建站备案号应放置的具体位置?  为什么Go需要go mod文件_Go go mod文件作用说明  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  家庭服务器如何搭建个人网站?  制作营销网站公司,淘特是干什么用的?  c++ stringstream用法详解_c++字符串与数字转换利器  C#怎么使用委托和事件 C# delegate与event编程方法  如何选择可靠的免备案建站服务器?  网站专业制作公司有哪些,做一个公司网站要多少钱?  制作网站的软件免费下载,免费制作app哪个平台好?  建站主机SSH密钥生成步骤及常见问题解答?  建站之星导航如何优化提升用户体验?  如何在服务器上配置二级域名建站?  建站主机与服务器功能差异如何区分?  如何快速上传建站程序避免常见错误? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。