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

作者:杨俊明 时间:2021-11-07 09:49:11 

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

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

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

标签:springmvc,日期转换
0
投稿

猜你喜欢

  • 解决jmap命令打印JVM堆信息异常的问题

    2023-11-05 09:07:02
  • 详解Spring全局异常处理的三种方式

    2023-11-11 15:31:47
  • Java字符判断的小例子

    2023-08-26 17:29:49
  • Java读取TXT文件内容的方法

    2023-11-23 22:33:41
  • @ConfigurationProperties加载外部配置方式

    2023-11-09 01:14:32
  • 教你怎么用SpringBoot+Mybati-Plus快速搭建代码

    2023-08-07 12:42:10
  • 浅谈Java中向上造型向下造型和接口回调中的问题

    2023-11-09 13:51:46
  • Java代码精简之道(推荐)

    2023-07-28 02:00:05
  • 关于Spring Data Jpa 自定义方法实现问题

    2023-11-28 10:08:32
  • Android RecyclerView使用ListAdapter高效刷新数据的操作方法

    2023-06-24 22:22:09
  • springAop实现权限管理数据校验操作日志的场景分析

    2023-11-23 10:00:27
  • Android实现简易浏览器遇到问题的解决方法

    2023-06-15 21:47:56
  • Java中为什么start方法不能重复调用而run方法可以?

    2023-11-15 03:04:02
  • Java实现最小生成树算法详解

    2023-11-25 04:51:22
  • mybatis-plus中lambdaQuery()与lambdaUpdate()比较常见的使用方法总结

    2023-11-24 22:43:04
  • android TextView实现跑马灯效果

    2023-07-27 16:35:31
  • 详解java中String、StringBuilder、StringBuffer的区别

    2023-06-17 06:03:23
  • java异常处理详细介绍及实例

    2023-11-28 05:07:02
  • JVM(Java虚拟机)简介(动力节点Java学院整理)

    2023-11-25 06:12:12
  • Java 使用 HttpClient 发送 GET请求和 POST请求

    2023-07-23 07:56:13
  • asp之家 软件编程 m.aspxhome.com