日期、數字格式化顯示,是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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。