spring mvc4的日期/數(shù)字格式化、枚舉轉(zhuǎn)換示例
日期、數(shù)字格式化顯示,是web開發(fā)中的常見需求,spring mvc采用XXXFormatter來處理,先看一個(gè)最基本的單元測(cè)試:
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() {
//設(shè)置上下語(yǔ)言的語(yǔ)言環(huán)境
LocaleContextHolder.setLocale(Locale.US);
//--------測(cè)試日期格式化----------
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日
// --------測(cè)試貨幣格式化-------------
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全都實(shí)現(xiàn)了接口org.springframework.format.Formatter<T>,web開發(fā)中使用起來很方便:
一、先在servlet-context.xml中參考下面的內(nèi)容,修改配置:
<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
</bean>
二、dto類中,在需要設(shè)置格式化的字段上,打上相關(guān)的注解
@NumberFormat(style=Style.CURRENCY) //@NumberFormat(pattern="#,###.00") double amount; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date createTime;
三、jsp頁(yè)面上,使用<spring:eval />標(biāo)簽綁定
<spring:eval expression="c.amount" /> <spring:eval expression="c.createTime" />
四、枚舉問題
表單提交的html頁(yè)面中,經(jīng)常會(huì)遇到一些諸如:性別(男、女) 的RadioButton組,背后通常對(duì)應(yīng)Enum,表單提交的是String,默認(rèn)情況下并不能自動(dòng)映射成Model中的Enum成員,需要額外的Converter處理
4.1 先定義一個(gè)基本的枚舉
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中時(shí),性別字段我們希望"男"存成"1","女"存成"-1","保密"存成"0"(當(dāng)然,這只是個(gè)人喜好,僅供參考)
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的轉(zhuǎn)換
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頁(yè)面上的綁定示例:
<form:radiobuttons path="sex" items="${sexMap}" delimiter=" " />
sexMap是ModelAndView中的一個(gè)屬性,參考代碼如下:
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());//枚舉列表,便于頁(yè)面綁定
model.addObject("data", order);
model.setViewName("orders/edit");
return model;
}
4.5 頁(yè)面顯示時(shí),如何轉(zhuǎn)義
就剛才的示例而言,性別“男”,對(duì)應(yīng)SEX.Male,自定義值是"1",自定義描述是“男”,默認(rèn)情況下${model.sex}顯示成Male,如果想顯示“自定義值”或“自定義描述”,不考慮國(guó)際化的話,直接調(diào)用value或description屬性即可,參考下面的內(nèi)容:
${c.sex}/${c.sex.description}/${c.sex.value}
最終顯示成: Male/男/1
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- springboot DTO字符字段與日期字段的轉(zhuǎn)換問題
- springboot日期轉(zhuǎn)換器實(shí)現(xiàn)實(shí)例解析
- 解決springmvc關(guān)于前臺(tái)日期作為實(shí)體類對(duì)象參數(shù)類型轉(zhuǎn)換錯(cuò)誤的問題
- Spring MVC自定義日期類型轉(zhuǎn)換器實(shí)例詳解
- SpringMVC中日期格式的轉(zhuǎn)換
- SpringMVC對(duì)日期類型的轉(zhuǎn)換示例
- 詳解spring mvc4使用及json 日期轉(zhuǎn)換解決方案
- SpringMVC用JsonSerialize日期轉(zhuǎn)換方法
- Springboot日期轉(zhuǎn)換器實(shí)現(xiàn)代碼及示例
相關(guān)文章
SpringSecurity實(shí)現(xiàn)多種身份驗(yàn)證方式
本文主要介紹了SpringSecurity實(shí)現(xiàn)多種身份驗(yàn)證方式,包括表單的認(rèn)證、HTTP基本認(rèn)證、HTTP摘要認(rèn)證、證書認(rèn)證、OpenIDConnect或OAuth2.0的認(rèn)證、記住我功能和LDAP認(rèn)證,感興趣的可以了解一下2025-03-03
SpringAOP實(shí)現(xiàn)日志收集管理功能(步驟詳解)
這篇文章主要介紹了SpringAOP實(shí)現(xiàn)日志收集管理功能,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Spring boot通過切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過程
這篇文章主要介紹了Spring boot通過切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
查看Java所支持的語(yǔ)言及相應(yīng)的版本信息
Java語(yǔ)言作為第一種支持國(guó)際化的語(yǔ)言,在Internet從一開始就具有其他語(yǔ)言無(wú)與倫比的國(guó)際化的本質(zhì)特性,查看Java所支持的語(yǔ)言及相應(yīng)的版本信息可以采用以下代碼進(jìn)行查詢2014-01-01
基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問題及解決
這篇文章主要介紹了基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03

