日期、数字格式化显示,是web开发中的常见需求,spring mvc采用XXXFormatter来处理,先看一个最基本的单元测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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中参考下面的内容,修改配置:
1
2
3
4
5
|
< mvc:annotation-driven conversion-service = "conversionService" />
< bean id = "conversionService"
class = "org.springframework.format.support.FormattingConversionServiceFactoryBean" >
</ bean >
|
二、dto类中,在需要设置格式化的字段上,打上相关的注解
1
2
3
4
5
6
|
@NumberFormat (style=Style.CURRENCY)
//@NumberFormat(pattern="#,###.00")
double amount;
@DateTimeFormat (pattern = "yyyy-MM-dd HH:mm:ss" )
Date createTime;
|
三、jsp页面上,使用<spring:eval />标签绑定
1
2
|
< spring:eval expression = "c.amount" />
< spring:eval expression = "c.createTime" />
|
四、枚举问题
表单提交的html页面中,经常会遇到一些诸如:性别(男、女) 的RadioButton组,背后通常对应Enum,表单提交的是String,默认情况下并不能自动映射成Model中的Enum成员,需要额外的Converter处理
4.1 先定义一个基本的枚举
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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 配置修改
1
2
3
4
5
6
7
8
|
< 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页面上的绑定示例:
1
|
<form:radiobuttons path= "sex" items= "${sexMap}" delimiter= " " />
|
sexMap是ModelAndView中的一个属性,参考代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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中,这样写:
1
2
3
4
5
6
7
8
9
10
|
@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属性即可,参考下面的内容:
1
|
${c.sex}/${c.sex.description}/${c.sex.value}
|
最终显示成: Male/男/1
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。