spring mvc4的日期/数字格式化、枚举转换示例
发布时间 - 2026-01-10 22:42:38 点击率:次日期、数字格式化显示,是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=" " />
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日期转换器实现代码及示例
# 自定义
# 绑定
# 表单
# 自己的
# 的是
# 情况下
# 不多
# 只需
# 要在
# 就行
# 这只
# 并不能
# 先在
# 很方便
# 经常会
# 很短
# 先看
# 大家多多
# 中时
# 类中
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
如何在不使用负向后查找的情况下匹配特定条件前的换行符
如何快速搭建虚拟主机网站?新手必看指南
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
如何在云指建站中生成FTP站点?
Android自定义控件实现温度旋转按钮效果
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
java中使用zxing批量生成二维码立牌
js实现获取鼠标当前的位置
海南网站制作公司有哪些,海口网是哪家的?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
详解vue.js组件化开发实践
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
Laravel如何使用Vite进行前端资源打包?(配置示例)
高端建站如何打造兼具美学与转化的品牌官网?
Laravel怎么连接多个数据库_Laravel多数据库连接配置
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
用yum安装MySQLdb模块的步骤方法
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
Android滚轮选择时间控件使用详解
如何在腾讯云服务器快速搭建个人网站?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
香港服务器WordPress建站指南:SEO优化与高效部署策略
北京企业网站设计制作公司,北京铁路集团官方网站?
如何用y主机助手快速搭建网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
如何快速打造个性化非模板自助建站?
个人摄影网站制作流程,摄影爱好者都去什么网站?
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
如何在香港免费服务器上快速搭建网站?
Laravel如何集成Inertia.js与Vue/React?(安装配置)
Java垃圾回收器的方法和原理总结
如何将凡科建站内容保存为本地文件?
如何快速搭建支持数据库操作的智能建站平台?
郑州企业网站制作公司,郑州招聘网站有哪些?
香港服务器部署网站为何提示未备案?
如何快速重置建站主机并恢复默认配置?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】

