前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >spring mvc4的日期/数字格式化、枚举转换

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

作者头像
菩提树下的杨过
发布于 2018-09-20 03:08:13
发布于 2018-09-20 03:08:13
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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中参考下面的内容,修改配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1     <mvc:annotation-driven    conversion-service="conversionService" />
2 
3     <bean id="conversionService"
4         class="org.springframework.format.support.FormattingConversionServiceFactoryBean">        
5     </bean>

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 />标签绑定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 先定义一个基本的枚举

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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 配置修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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页面上的绑定示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 <form:radiobuttons path="sex" items="${sexMap}" delimiter="&nbsp;" />

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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中,这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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属性即可,参考下面的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 <td>${c.sex}/${c.sex.description}/${c.sex.value}</td>

最终显示成: Male/男/1

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-10-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
举例说明Java中代码块的执行顺序
可以看到,静态代码块只在类加载时执行一次,在main方法之前执行。实例代码块在每次创建对象时执行,然后再执行构造方法。
用户10604450
2024/03/15
1260
代码块总结
这种形式的程序段我们将其称之为代码块,所谓代码块就是用大括号({})将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法。一般来说代码块是不能单独运行的,它必须要有运行主体。在Java中代码块主要分为四种:
栋先生
2018/09/29
8590
【小家java】类中静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑
诚如各位所知,java的三大特性:封装、继承、多态。其中继承,是java中最有学问的一点也是最相对来说最难理解的一些东西,本文针对于此,做一些实例分析,希望能够帮助大家理解java中的继承机制
YourBatman
2019/09/03
1.5K0
【小家java】类中静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑
Java基础-08(01)总结帮助文档,代码块,继承
1:如何制作帮助文档(了解) (1)写一个类 (2)加入文档注释 (3)通过javadoc工具生成即可 javadoc -d 目录 -author -version ArrayTool.jav
Java帮帮
2018/03/15
8340
Java基础-08(01)总结帮助文档,代码块,继承
静态代码块、静态变量,构造代码块、实例变量的执行顺序和继承逻辑
各位小伙伴大家好,我是A哥。如果问:Java的三大特性是什么?你顺口就能答出:封装、继承、多态。如果继续问:你真的了解Java中的继承吗?
YourBatman
2022/05/06
1K0
静态代码块、静态变量,构造代码块、实例变量的执行顺序和继承逻辑
充电篇:再也不怕面试官问你Java基础了
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
小熊学Java
2023/07/12
1590
充电篇:再也不怕面试官问你Java基础了
一文整懂 Java 中静态代码块 / 初始块 / 构造方法的执行顺序
“ 相信,刷过面试题应该都碰到过很多题,关于类继承后 Java 中静态代码块 / 初始块 / 构造方法的执行顺序问题,每每记一下又忘了,那么,今天来用不多的时间复习一下”
拾荒者的笔记
2020/05/25
9060
静态代码块、非静态代码块、构造函数三者执行顺序
主要探讨一下关于静态代码块,非静态代码块,构造函数的执行顺序。 如有错误,欢迎指出。
HaC
2020/12/30
5190
Java代码块
在 Java 中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程)
闲花手札
2021/08/24
9030
【Java】父子类执行代码顺序
父类静态代码块–>子类静态代码块–>父类代码块–>父类构造方法–>子类代码块–>子类构造方法
瑞新
2020/12/07
4850
彻底搞懂java程序的初始化顺序
在java程序中,当实例化对象时,对象的所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。
全菜工程师小辉
2019/08/16
2.5K0
夯实Java基础系列7:一文读懂Java 代码块和执行顺序
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
程序员黄小斜
2019/09/27
6390
java 语言【继承和多态】
Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是 现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序是就需要考虑。 比如:狗和猫,它们都是一个动物。 使用Java语言来进行描述,就会设计出:
用户11319080
2024/10/17
1070
java 语言【继承和多态】
Java基础系列5:Java代码的执行顺序
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。
说故事的五公子
2019/11/14
7880
【面试题】Java中子类和父类静态代码块、非静态代码块、构造函数的执行顺序总结一览表
在面试的时候,有时候我们会被问到这样的问题:子类A继承父类B,A a = new A();则父类B的构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块执行的先后顺序是什么?
凯哥Java
2022/12/02
6930
【面试题】Java中子类和父类静态代码块、非静态代码块、构造函数的执行顺序总结一览表
java小心机(5)| 浅谈类成员初始化顺序
类成员什么时候会被初始化呢?一般来说:"类的代码在初次使用时才被加载",加载过程包括了初始化。 比如说new A()调用构造函数时,类中全部成员都会被初始化。 但对于static域(包括静态成员变量
KEN DO EVERTHING
2019/01/17
4600
Java关键字final、static总结与对比
Java关键字final有“不可改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
chenchenchen
2022/03/09
9290
Java关键字final、static总结与对比
干货——详解Java中的关键字
在平时编码中,我们可能只注意了这些static,final,volatile等关键字的使用,忽略了他们的细节,更深层次的意义。
Janti
2018/08/01
4350
干货——详解Java中的关键字
全面理解Java中继承关系
继承是面向对象思想的三大特性之一,使类与类之间产生特殊 - 一般的关系,即is-a关系。继承是从已有类中派生出新的类,新的类能吸收已有类的属性和方法,并且能拓展新的属性和行为。在Java中使用extends关键字表示继承,语法表示为: class 子类 extends 父类{}子类被称为派生类,父类又被称为超类。子类继承父类,表名子类是一种特殊的父类,子类拥有父类的属性和方法,并且子类可以拓展具有父类所没有的一些属性和方法。子类即是不扩展父类,也能维持拥有父类的操作。
用户7886150
2021/01/30
1.6K0
详解java中的四种代码块
使用synchronized(){}包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数据的不一致性。同步代码块需要写在方法中。
三哥
2019/05/10
3.3K0
详解java中的四种代码块
推荐阅读
相关推荐
举例说明Java中代码块的执行顺序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档