五. Formatter 数据格式化
SpringMVC的 Convert 转换器,可以在源类型对象到目标类型对象之间进行转换,重点是在不同的类型之间转换,并不承担输入和输出的格式化的工作。 不一定是String 到其他目标类型之间转换,也不一定发生在输入层,而是哪一层都是可以的。
在login 方法中,调用 DateConvert 进行格式化,也是可以的。变成了一个工具类。
@RequestMapping(value="login") public String login(User user){ System.out.println("设置名称:"+user.getName()+",年龄:"+user.getAge()); System.out.println("生日:"+user.getBirthday().toLocaleString()); DateConvert dc=new DateConvert(); dc.setPattern("yyyy-MM-dd"); System.out.println("新生日:"+dc.convert("1994-02-07").toLocaleString()); return "user/list"; }
如果想专门的进行数据的格式化,在前端输入到后端接收,即Controller 层进行转换时, 可以使用Formatter 接口进行数据的格式化。 前端输入都是字符串类型,或者是字符串数组类型, 而Formatter 是专门在字符串与目标类型之间进行相应的转换。
关于Formatter 主要定义了以下几个接口。
只需要了解 Formatter 接口即可。
package org.springframework.format; public abstract interface Formatter<T> extends Printer<T>, Parser<T> { }
SpringMVC中提供的格式化有
要注意,有两个注解。 一个是 DateFormatter, 一个是NumberFormatter, 即常用的日期格式化和数字格式化。
六. Formatter 格式化的使用
前端传入一个工资,格式为 ###,## 即千分位分隔的形式(为了方便,直接在前台输入。 实际上,应该是前台将数字转换成千分位显示,在传入到后台时再转换一下)。
六.一 前台验证代码
<body> <h2>两个蝴蝶飞,类型转换器使用</h2> <form:form commandName="user" action="login.action" method="post"> <form:label path="name">姓名:</form:label> <form:input path="name"/><br/> <form:label path="salary">工资:</form:label> <form:input path="salary"/><br/> <form:button>提交</form:button> </form:form> </body>
六.二 编写金额格式化代码
package com.yjl.formatter; import java.text.DecimalFormat; import java.text.ParseException; import java.util.Locale; import org.springframework.format.Formatter; public class MoneyFormatter implements Formatter<Double>{ //定义格式 private String pattern; @Override public String print(Double paramT, Locale paramLocale) { DecimalFormat nf=new DecimalFormat(this.pattern); return nf.format(paramT); } @Override public Double parse(String paramString, Locale paramLocale) throws ParseException { DecimalFormat nf=new DecimalFormat(this.pattern); return (Double) nf.parse(paramString); } public String getPattern() { return pattern; } public void setPattern(String pattern) { this.pattern = pattern; } }
六.三 springmvc.xml 中 更改格式转换
所使用的 Bean 是 FormattingConversionServiceFactoryBean, 里面有一个 formatters 的属性。
<!-- 添加formatter 转换器 --> <mvc:annotation-driven conversion-service="conversionService"> </mvc:annotation-driven> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="formatters"> <list> <bean class="com.yjl.formatter.MoneyFormatter"> <property name="pattern" value="###,###,###.##"></property> </bean> </list> </property> </bean>
六.四 重启服务器,进行验证。
前台输入:
控制台打印输出:
可知,可以正确的进行相应的转换。
六.五 像 convert 一样,放置在方法中。
//绑定到user对象。 @RequestMapping(value="login") public String login(User user){ System.out.println("名称:"+user.getName()); System.out.println("工资:"+user.getSalary()); MoneyFormatter mf=new MoneyFormatter(); mf.setPattern("###,###,##"); try { Double salary=mf.parse("1,234.34", Locale.CHINA); System.out.println("输出值:"+salary); } catch (ParseException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return "user/list"; }
这样,也是正确的,可以正确的进行转换。 仿佛成了一个工具类。
SpringMVC 提供了三种数字格式化的接口。
NumberFormatter 普通数字格式化
CurrencyFormatter 货币类型的格式化
PercentFormatter 百分比类型的格式化
现在,已经被废弃了。
当然,也可以用注册器的形式进行注入格式化。
六.六 注册器的形式注入 金额的格式化
1 . 保留前面的 MoneyFormatter ,用来注入。
2 . 写注册器 MoneyFormatterRegister
package com.yjl.formatter; import org.springframework.format.FormatterRegistrar; import org.springframework.format.FormatterRegistry; public class MoneyFormatterRegister implements FormatterRegistrar{ //注入格式化类 private MoneyFormatter mf; public MoneyFormatter getMf() { return mf; } public void setMf(MoneyFormatter mf) { this.mf = mf; } @Override public void registerFormatters(FormatterRegistry paramFormatterRegistry) { //添加 格式化类 paramFormatterRegistry.addFormatter(mf); } }
3 . 重写 springmvc.xml 的格式化配置
采用的属性是 formatterRegistrars
<!-- 添加formatter 转换器 --> <mvc:annotation-driven conversion-service="conversionService"> </mvc:annotation-driven> <bean id="moneyFormatter" class="com.yjl.formatter.MoneyFormatter"> <property name="pattern" value="###,###,###.##"></property> </bean> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="formatterRegistrars"> <list> <bean class="com.yjl.formatter.MoneyFormatterRegister"> <property name="mf" ref="moneyFormatter"></property> </bean> </list> </property> </bean>
4 . 重启服务器,进行验证
前端输入值
后端控制台打印输出 (后端代码,去除了六.五 的部分。)
六.六 @NumberFormatter 注解 (推荐使用)
像使用 @DateTimeFormatter 那样,使用 @NumberFormatter 注解。
1 .User 中salary 属性上面添加注解
@NumberFormat(pattern="###,###,###.##") private double salary;
2 . springmvc.xml 中去除原先的转换器,变成最原来的模样。
<mvc:annotation-driven></mvc:annotation-driven>
3 .重启服务器,进行验证
控制台打印
@NumberFormatter 注解代码为
支持的样式 为: DEFAULT,NUMBER,PERCENT,CURRENCY 等样式。
@Documented @Retention(RetentionPolicy.RUNTIME) @Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface NumberFormat { Style style() default Style.DEFAULT; String pattern() default ""; public static enum Style { DEFAULT, NUMBER, PERCENT, CURRENCY; private Style() {} } }
谢谢!!!