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 />标签绑定
<td><spring:eval expression="c.amount" /></td>
<td><spring:eval expression="c.createTime" /></td>
四、枚举问题
表单提交的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=" " />
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属性即可,参考下面的内容:
<td>${c.sex}/${c.sex.description}/${c.sex.value}</td>
最终显示成: Male/男/1
spring mvc4的日期/数字格式化、枚举转换的更多相关文章
- 重温JSP学习笔记--与日期数字格式化有关的jstl标签库
上一篇笔记写的主要是JSTL的core标签库,如果想对一些数字或者日期做一些操作或者在网页上显示指定格式的数字或日期,jstl还提供了另一个fmt标签库,这里简单介绍一下: 第一步,导入标签库: &l ...
- 对Spring from中日期显示格式化问题
开始时间 结束时间 保存 取消 想在input中让日期格式显示为HH:ss 但是各种百度没有找到答案 最后Google之 http://stackoverflow.com/questions/1173 ...
- [应用篇]第五篇 JSTL之fmt标签日期和数字格式化
fmt标签个人用的比较少,但是我还是在这里简单的留一下笔记,也是算是学习了一下!这样方便你们课设的时候能用的上,要学会进步的学习,不要停留! 引入该标签库的方法为: <%@ taglib pre ...
- JavaScript 系列--JavaScript一些奇淫技巧的实现方法(二)数字格式化 1234567890转1,234,567,890;argruments 对象(类数组)转换成数组
一.前言 之前写了一篇文章:JavaScript 系列--JavaScript一些奇淫技巧的实现方法(一)简短的sleep函数,获取时间戳 https://www.mwcxs.top/page/746 ...
- DB2中字符、数字和日期类型之间的转换
DB2中字符.数字和日期类型之间的转换 一般我们在使用DB2或Oracle的过程中,经常会在数字<->字符<->日期三种类 型之间做转换,那么在DB2和Oracle中,他们分别 ...
- oracle 报“无效数字”异常和“ORA-01830: 日期格式图片在转换整个输入字符串之前结束”
1.问题1 执行下列SQL: sql = "select count(1) as totle from vhl_model_data a where a.OBTAIN_CREATE_TIME ...
- 5.单行函数,多行函数,字符函数,数字函数,日期函数,数据类型转换,数字和字符串转换,通用函数(case和decode)
1 多行函数(理解:有多个输入,但仅仅输出1个结果) SQL>select count(*) from emp; COUNT(*) ------------- 14 B 字符函数Lowe ...
- [Swift实际操作]七、常见概念-(6)日期Date和DateFormatter日期的格式化
本文将为你演示日期类型的使用,以及如何对日期进行格式化. 首先引入需要使用到的界面框架 import UIKit 初始化一个日期对象,它的值和当前电脑中的日期相同 var date = Date() ...
- springboot上传文件 & 不配置虚拟路径访问服务器图片 & springboot配置日期的格式化方式 & Springboot配置日期转换器
1. Springboot上传文件 springboot的文件上传不用配置拦截器,其上传方法与SpringMVC一样 @RequestMapping("/uploadPicture&q ...
随机推荐
- XMLA连接器--免费但不开源通过ODBO、XMLA
XMLA 连接器(驱动) :来自ARQUERY http://jaist.dl.sourceforge.net/project/xmlaconnect/XMLA_Provider_v1.0.0.1 ...
- 清理DBA_DATAPUMP_JOBS中的孤立数据泵作业
今天在重构数据库时(将表空间中的表.索引转移到其它表空间)时,发现有两个奇怪的对象SYS_EXPORT_FULL_01.SYS_EXPORT_FULL_02搜索了一下,发现这个可能是EXPDP导出异常 ...
- OOP应用:实体类
实体类 定义:实体类是一个业务实体的类,而业务实体就是整个软件系统业务所涉及的对象. 使用: 1.新增实体类项目,增加类库项目,以.Modes作为后缀. 2.抽取对象以及属性.(简单地说,对象就是每个 ...
- Ngigx+Tomcat配置动静分离,负载均衡
由于公司使用过Ngnix,对于刚接触Nginx来说,感觉有些好奇,于是研究了下. 本人在windows下使用的版本是nginx-1.8.1: 1. 启动Ngnix 双击nginx-1.8.1文件夹中n ...
- Android中 int,float,Double,String 互相转换
1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt( ...
- java 如何在pdf中生成表格
1.目标 在pdf中生成一个可变表头的表格,并向其中填充数据.通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格. 每天生成一个文件夹存储 ...
- 基于.net开发chrome核心浏览器【五】
一:本篇将解决的问题 本章主要为了解决一下几个问题: 1.JsDialog的按钮错位的问题 我们开发出的浏览器,在有些操系统上调用alert,confirm之类的对话框时,确定和取消按钮会出现错位的情 ...
- [译] OpenStack Kilo 版本中 Neutron 的新变化
OpenStack Kilo 版本,OpenStack 这个开源项目的第11个版本,已经于2015年4月正式发布了.现在是个合适的时间来看看这个版本中Neutron到底发生了哪些变化了,以及引入了哪些 ...
- Codeforces 715A. Plus and Square Root[数学构造]
A. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- C#中Abstract和Virtual
C#中Abstract和Virtual 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Vi ...