SpringMVC的类型转换器和数据格式化(九)下

简介: SpringMVC的类型转换器和数据格式化(九)

五. 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 主要定义了以下几个接口。


20190902104721239.png


只需要了解 Formatter 接口即可。


package org.springframework.format;
public abstract interface Formatter<T>
  extends Printer<T>, Parser<T>
{
}


SpringMVC中提供的格式化有


20190902104750296.png


要注意,有两个注解。 一个是 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>


六.四 重启服务器,进行验证。


前台输入:


20190902104812676.png


控制台打印输出:


20190902104806750.png


可知,可以正确的进行相应的转换。


六.五 像 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 . 重启服务器,进行验证


前端输入值


20190902104827130.png


后端控制台打印输出 (后端代码,去除了六.五 的部分。)


20190902104833538.png


六.六 @NumberFormatter 注解 (推荐使用)


像使用 @DateTimeFormatter 那样,使用 @NumberFormatter 注解。


1 .User 中salary 属性上面添加注解


 @NumberFormat(pattern="###,###,###.##")
    private double salary;


2 . springmvc.xml 中去除原先的转换器,变成最原来的模样。


<mvc:annotation-driven></mvc:annotation-driven>


3 .重启服务器,进行验证


20190902104840546.png


控制台打印


20190902104846303.png


@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() {}
   }
}


谢谢!!!

相关文章
|
前端开发 Java Spring
springMVC--数据格式化
springMVC--数据格式化
89 0
|
前端开发 安全 Java
详细解读_SpringMvc类型转换&数据格式化&数据验证
详细解读_SpringMvc类型转换&数据格式化&数据验证
|
Java Spring
SpringMVC - 数据格式化(@DateTimeFormat & @NumberFormat)(一)
SpringMVC - 数据格式化(@DateTimeFormat & @NumberFormat)(一)
274 0
SpringMVC - 数据格式化(@DateTimeFormat & @NumberFormat)(一)
|
Java Spring
SpringMVC - 数据格式化(@DateTimeFormat & @NumberFormat)(二)
SpringMVC - 数据格式化(@DateTimeFormat & @NumberFormat)(二)
161 0
|
前端开发 Java
SpringMVC的类型转换器和数据格式化(九)中
SpringMVC的类型转换器和数据格式化(九)
169 0
SpringMVC的类型转换器和数据格式化(九)中
SpringMVC的类型转换器和数据格式化(九)上
SpringMVC的类型转换器和数据格式化(九)
241 0
SpringMVC的类型转换器和数据格式化(九)上
|
XML JSON 前端开发
springmvc4整合AJAX使用@ResponseBody注解返回JSON数据格式
版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/53433325   ...
1272 0
|
容器 前端开发
SpringMVC 中 数据格式化
FormattingConversionServiceFactoryBean内部已经注册了: - NumberFormatAnnotationFormatterFactroy:支持对数字类型的属性使用@NumberFormat注解。 - JodaDateTimeFormatAnnotationFormatterFactroy:支持对日期类型的属性使用@DataTime
1431 0
|
前端开发 Java Spring
springMVC4(11)使用注解完成数据格式化
<div class="markdown_views"> <h1 id="需求实例引入">需求实例引入</h1> <p>在实际开发中,我们会常常遇到需要对日期格式、数值格式进行转换的需求。在spring中,我们可以轻松通过注解的方式完成对数据的格式化处理,比如现在有个User POJO类: <br> package com.mvc.model;</p> <pre cla
2765 0
|
6月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】