SpringMVC——数据转换 & 数据格式化 & 数据校验

一、数据绑定流程

  • 1. Spring MVC 主框架将 ServletRequest 对象及目标方 法的入参实例传递给 WebDataBinderFactory 实例,以创 建 DataBinder 实例对象
  • 2. DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数据格式 化工作。将 Servlet 中的请求信息填充到入参对象中
  • 3. 调用 Validator 组件对已经绑定了请求消息的入参对象 进行数据合法性校验,并最终生成数据绑定结果 BindingData 对象
  • 4. Spring MVC 抽取 BindingResult 中的入参对象和校验 错误对象,将它们赋给处理方法的响应入参

Spring MVC 通过反射机制对目标处理方法进行解析,将请 求消息绑定到处理方法的入参中。数据绑定的核心部件是 DataBinder,运行机制如下:

源码分析

  • 在JavaBean对象的属性setter方法处打断点调试
  • 在调试页面进入org.springframework.web.method.annotation.ModelAttributeMethodProcessor#resolveArgument
public final Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest request, WebDataBinderFactory binderFactory) throws Exception {
 String name = ModelFactory.getNameForParameter(parameter);
 Object attribute = mavContainer.containsAttribute(name)?mavContainer.getModel().get(name):this.createAttribute(name, parameter, binderFactory, request);
 //创建binderd对象
 WebDataBinder binder = binderFactory.createBinder(request, attribute, name);
    if(binder.getTarget() != null) {
       //数据的绑定
       this.bindRequestParameters(binder, request);
       //完成数据的校验
        this.validateIfApplicable(binder, parameter);
        if(binder.getBindingResult().hasErrors()      && this.isBindExceptionRequired(binder, parameter)) {
            throw new BindException(binder.getBindingResult());
        }
     }

 Map bindingResultModel = binder.getBindingResult().getModel();
 mavContainer.removeAttributes(bindingResultModel);
 mavContainer.addAllAttributes(bindingResultModel);
 return binder.getTarget();
    }
  • 查看Binder对象的属性

  • 可以看到binder包含了ConversionService和validators属性,它们分别处理类型转换和数据校验

二、数据转换

  • Spring MVC 上下文中内建了很多转换器,可完成大多数 Java 类型的转换工作。
  • ConversionService converters =

自定义类型转换器

ConversionService 是 Spring 类型转换体系的核心接口。

  • 可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个 ConversionService。Spring 将自动识别出 IOC 容器中的 ConversionService,并在 Bean 属性配置及 Spring MVC 处理方法入参绑定等场合使用它进行数据的转换
  • 可通过 ConversionServiceFactoryBean 的 converters 属性 注册自定义的类型转换器

三、数据格式化

  1. 在表单添加birthday(生日)输入框,同时在Javabean中天机brith属性,属性的类型为Java.util.Date
  2. 提交表单时,页面报400错误,数据无法提交到目标方法
  3. 原因:输入框的birthday没有进行格式化

解决方法:

在Javabean对象的birth属性上加注解

 @DateTimeFormat(pattern = "yy-mm-dd")
 private Date birth;

①、日期格式化

@DateTimeFormat 注解可对 java.util.Date、java.util.Calendar、java.long.Long 时间 类型进行标注:

  • pattern 属性:类型为字符串。指定解析/格式化字段数据的模式, 如:”yyyy-MM-dd hh:mm:ss”
  • iso 属性:类型为 DateTimeFormat.ISO。指定解析/格式化字段数据 的ISO模式,包括四种:ISO.NONE(不使用) -- 默 认、ISO.DATE(yyyy-MM-dd) 、ISO.TIME(hh:mm:ss.SSSZ)、 ISO.DATE_TIME(yyyy-MM-dd hh:mm:ss.SSSZ)
  • style 属性:字符串类型。通过样式指定日期时间的格式,由两位字 符组成,第一位表示日期的格式,第二位表示时间的格式:S:短日 期/时间格式、M:中日期/时间格式、L:长日期/时间格式、F:完整 日期/时间格式、-:忽略日期或时间格式

②、数值格式化

@NumberFormat 可对类似数字类型的属性进行标 注,它拥有两个互斥的属性:

  • style:类型为 NumberFormat.Style。用于指定样式类 型,包括三种:Style.NUMBER(正常数字类型)、 Style.CURRENCY(货币类型)、 Style.PERCENT( 百分数类型)
  • pattern:类型为 String,自定义样式, 如patter="#,###";

③、源码分析

  • Spring MVC 上下文中内建了很多格式化处理器,可完成大多数 Java数据类型的格式化。
  • ConversionService converters =

  • 对属性对象的输入/输出进行格式化,从其本质上讲依然 属于 “类型转换” 的范畴。
  • Spring 在格式化模块中定义了一个实现 ConversionService 接口的 FormattingConversionService 实现类,该实现类扩展 了 GenericConversionService,因此它既具有类型转换的功能,又具有格式化的功能
  • FormattingConversionService 拥有一个 FormattingConversionServiceFactroyBean 工厂类, 后者用于在 Spring 上下文中构造前者

FormattingConversionServiceFactroyBean 内部已经注册了 :

  • NumberFormatAnnotationFormatterFactroy:支持对数字类型的属性 使用 @NumberFormat 注解
  • DateTimeFormatAnnotationFormatterFactroy:支持对日期类型 的属性使用 @DateTimeFormat 注解
  • 装配了 FormattingConversionServiceFactroyBean 后,就可 以在 Spring MVC 入参绑定及模型数据输出时使用注解了。
  • 默认创建的 ConversionService 实例即为 FormattingConversionServiceFactroyBean

④、自定义数据类型格式化&数据转换

  <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>    

    <!-- 配置 ConversionService -->
    <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <ref bean="自定义类型格式化&转换实现类"/>
            </set>
        </property>
    </bean>

四、数据校验

  JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架, 它已经包含在 JavaEE 6.0 中 .JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证

Hibernate Validator 扩展注解:

  • Hibernate Validator 是 JSR 303 的一个实现,除支持 所有标准的校验注解外,它还支持以下的扩展注解

校验流程

①. 使用 JSR 303 验证标准
②. 加入 hibernate validator 验证框架的 jar 包

hibernate-validator-5.0.0.CR2.jar
hibernate-validator-annotation-processor-5.0.0.CR2.jar
classmate-0.8.0.jar
jboss-logging-3.1.1.GA.jar
validation-api-1.1.0.CR1.jar

③. 在 SpringMVC 配置文件中添加 <mvc:annotation-driven />
④. 需要在 bean 的属性上添加对应的注解

package com.nchu.mybatis.bean;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

/**
 * Created by yangshijing on 2017/12/4 0004.
 */
public class Employee {
    private Integer id;
    private String lastName;
    @Email
    private String email;
    private String gender;
    private Integer deptId;
    @DateTimeFormat(pattern = "yy-mm-dd")
    private Date birth;
    public Employee() {
    }

    public Employee(String email, String gender, Integer id, String lastName,Integer deptId) {
        this.email = email;
        this.gender = gender;
        this.id = id;
        this.lastName = lastName;
        this.deptId = deptId;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Integer getDeptId() {
        return deptId;
    }

    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", lastName=‘" + lastName + ‘\‘‘ +
                ", email=‘" + email + ‘\‘‘ +
                ", gender=‘" + gender + ‘\‘‘ +
                ",birth="+ birth +
                ‘}‘;
    }
}

⑤. 在目标方法 bean 类型的前面添加 @Valid 注解

  /**
     *添加employee接口
     * @param employee
     * @return
     */
    @RequestMapping(value = "/emp" ,method= RequestMethod.POST)
    public String save(@Valid Employee employee, Map<String,Object> map){
        try{
            employeeService.saveEmp(employee);
        }catch (Exception e){
            e.printStackTrace();
        }
       return "redirect:/employee/getemps";
    }

⑥、表单email项未输入email格式时,无法访问到目标方法,并在控制台打印出错误信息

原文地址:https://www.cnblogs.com/realshijing/p/8157567.html

时间: 2024-10-12 22:46:52

SpringMVC——数据转换 & 数据格式化 & 数据校验的相关文章

Spring MVC(三) 数据转换、格式化、校验

数据转换.格式化.校验 数据绑定机理 数据类型转换 低版本的Spring 只支持标准的PropertyEditor类型体系,不过PropertyEditor存在以下缺陷: 只能用于字符串和Java对象的转换,不适用于任意两个Java类型之间的转换: 对源对象及目标对象所在的上下文信息(如注解.所在宿主类的结构等)不敏感,在类型转换时不能利用这些上下文信息实施高级转换逻辑.有鉴于此,Spring 3.0在核心模型中添加了一个通用的类型转换模块,ConversionService是Spring类型转

SpringMVC 数据转换 &amp; 数据格式化 &amp; 数据校验

数据绑定流程 1. Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象2. DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换.数据格式化工作.将 Servlet 中的请求信息填充到入参对象中3. 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定

SpringMVC的数据转换&amp;&amp;数据格式化&amp;&amp;数据校验

1 SpringMVC的数据绑定流程 SpringMVC将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象. DataBinder调用装配在SpringMVC上下文中ConversionService组件进行数据类型转换.数据格式化工作.将Servlet中的请求信息填充到入参对象中. 调用Validator组件对已经绑定了请求信息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象

springmvc--数据转换&amp;数据格式化&amp;数据校验

数据绑定流程如下: 1.springmvc主框架将servletRequest对象及目标方法的实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象 2.DataBinder调用装配在spring mvc上下文中的ConversionService组件进行数据类型转换,格式化工作,将servlet中的请求信息填充到入参对象中 3.调用Validator组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象 4.s

SpringMVC的数据转换、格式化和数据校验

SpringMVC会根据请求方法签名不同,将请求信息中的信息以一定的方式转换并绑定到请求方法的参数中.在请求消息到达真正调用处理方法的这一段时间内,SpringMVC还会完成很多其他的工作,包括请求信息转换.数据转换.数据格式化以及数据校验等. 一.数据绑定 数据绑定的核心部件是DataBinder,SpringMVC框架将ServletRequest对象及处理方法的参数对象实例传递给DataBinder,DataBinder调用装配在SpringWeb上下文中的ConversionServic

SpringMVC——类型转换和格式化、数据校验、客户端显示错误消息

在介绍类型转换和格式化之前,我首先来介绍 <mvc:annotation-driven />. 需要导入的 schema: xmlns:mvc="http://www.springframework.org/schema/mvc" 一.作用: 1.会自动注册 RequestMappingHandlerMapping.RequestMappingHandlerAdapter 以及 ExceptionHandlerExceptionResolver 三个 Bean. 若配置该注

SpringMVC框架下数据的增删改查,数据类型转换,数据格式化,数据校验,错误输入的消息回显

在eclipse中javaEE环境下: 这儿并没有连接数据库,而是将数据存放在map集合中: 将各种架包导入lib下... web.xml文件配置为 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/

【Spring学习笔记-MVC-9】SpringMVC数据格式化之日期转换@DateTimeFormat

作者:ssslinppp       1. 摘要 本文主要讲解Spring mvc数据格式化的具体步骤: 并讲解前台日期格式如何转换为java对象: 在之前的文章<[Spring学习笔记-MVC-8]SpringMVC之类型转换Converter>(对应链接: http://www.cnblogs.com/ssslinppp/p/4598102.html ) 中讲解了Spring MVC的类型转换,在此回顾下. 数据格式化,从本质上讲属于数据转换的范畴.Spring就是基于数据转换框架植入&q

SpringMVC数据格式化,介绍了解一下

7.3.数据格式化在如Web /客户端项目中,通常需要将数据转换为具有某种格式的字符串进行展示,因此上节我们学习的数据类型转换系统核心作用不是完成这个需求,因此Spring3引入了格式化转换器(Formatter SPI) 和格式化服务API(FormattingConversionService)从而支持这种需求.在Spring中它和PropertyEditor功能类似,可以替代PropertyEditor来进行对象的解析和格式化,而且支持细粒度的字段级别的格式化/解析. Formatter