其他分享
首页 > 其他分享> > SpringMVC——数据的格式化和校验

SpringMVC——数据的格式化和校验

作者:互联网

一、数据的格式化
 Spring 在格式化模块中定义了一个实现了 ConversionService 接口的 FormattingConversionService 实现类,该实现类扩展了 GenericConversionService,因此它既具有类型转换的功能,又具有格式化的功能,可用来对对象属性的输入和输出进行格式化,从其本质上讲依然属于 “类型转换” 的范畴。
 FormattingConversionService 中有一个 FormattingConversionServiceFactroyBean 工厂类,用于在 Spring 上下文中构造FormattingConversionService。FormattingConversionServiceFactroyBean 内部注册了:
  1️⃣NumberFormatAnnotationFormatterFactroy——支持对数字类型的属性进行格式化,使用@NumberFormat 注解
  2️⃣JodaDateTimeFormatAnnotationFormatterFactroy——支持对日期类型的属性进行格式化,使用@DateTimeFormat 注解
 装配了 FormattingConversionServiceFactroyBean 后,就可以在 Spring MVC 入参绑定及模型数据输出时使用相应的注解了。配置了<mvc:annotation-driven/> 后,默认创建的 ConversionService 的实例即为 FormattingConversionServiceFactroyBean
 1、日期格式化
  @DateTimeFormat 注解可对 java.util.Date、java.util.Calendar、java.long.Long 的时间类型进行格式化,@DateTimeFormat 有以下几个常用属性:
   ①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——完整日期/时间格式、-——忽略日期或时间格式

@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birth;

 2、数值格式化
  @NumberFormat 可对类似数字类型的属性进行标注,它拥有两个互斥的属性:
   ①style:类型为 NumberFormat.Style。用于指定样式类型,包括Style.NUMBER(正常数字类型)、 Style.CURRENCY(货币类型)、 Style.PERCENT(百分数类型)
   ②pattern:类型为 String,自定义样式,如pattern="#,###"

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

 示例
  ①在需要验证的属性上添加验证规则对应的注解

@NumberFormat
private int age;
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birth;  

   如果页面出现400的错误代码,说明填写的数据格式不正确
  ②后台打印出错信息:借助BindingResult类

@RequestMapping(value = "/testFormat", method = RequestMethod.POST)
public String save(Employee employee, BindingResult bindingResult) {
    System.out.println(employee.toString());
    if (bindingResult != null && bindingResult.getFieldErrorCount() > 0) {
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        for (FieldError fieldError : fieldErrors) {
            System.out.println(fieldError.getField() + "\t" + fieldError.getDefaultMessage());
        }
        throw new RuntimeException("数据出错......");
    }
    return "redirect:/emps";
}  

二、数据的校验
 JSR 303 是 Java 为 Bean 的数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中。JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证
在这里插入图片描述
 Hibernate Validator 是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解:
在这里插入图片描述

@NotEmpty
private String lastName;
@Email
private String email;

 Spring 4.0 拥有自己独立的数据校验框架,同时支持 JSR 303 标准。Spring 在进行数据绑定时,可同时调用校验框架完成数据校验工作。在 Spring MVC 中,可直接通过注解驱动的方式进行数据校验。Spring 的 LocalValidatorFactroyBean 既实现了 Spring 的 Validator 接口,也实现了 JSR 303 的 Validator 接口。只要在 Spring 容器中定义了一个 LocalValidatorFactoryBean,即可将其注入到需要数据校验的 Bean 中。
 <mvc:annotation-driven/> 会默认装配好一个 LocalValidatorFactoryBean,通过在处理方法的入参上标注 @Valid 注解即可让 Spring MVC 在完成数据绑定后执行数据校验的工作。标注了 @Valid 后,Spring MVC 框架在将请求参数绑定到该入参对象后,就会调用校验框架根据该对象的属性上的注解实施合法性校验。Spring MVC 是通过对处理方法签名的规约来保存校验结果的:前一个表单/命令对象的校验结果保存到随后的入参中,这个保存校验结果的入参必须是 BindingResult 或 Errors 类型,这两个类都位于 org.springframework.validation 包中,示例:

//对employee的校验结果会保存在对象bindingResult中,在方法的入参中bindingResult必须紧跟在employee之后
@RequestMapping(value="/emp",method=RequestMethod.POST)    
public String save(@Valid Employee employee,BindingResult bindingResult,Map<String,Object> map){
    if(bindingResult.getErrorCount() > 0){
        List<FieldError> list = bindingResult.getFieldErrors();
        for (FieldError fieldError : list){
        	System.out.println(fieldError.getField()+"\t"+fieldError.getCode()+"\t"+fieldError.getDefaultMessage());
        }
        //出错后跳转回录入页面
        map.put("departments",departmentDao.getDepartments());
        map.put("genders", getGenders());
        return "input";            
    }
    System.out.println("===="+employee.toString());
    employeeDao.save(employee);
    return "redirect:/emps";
}

Tip
  1️⃣需校验的 Bean 对象和其绑定结果对象或错误对象是成对出现的,它们之间不允许声明其他的入参
在这里插入图片描述
  2️⃣Errors 接口提供了获取错误信息的方法,如 getErrorCount() 或 getFieldErrors(String field)
  3️⃣BindingResult 扩展了 Errors 接口
 在表单/命令对象类的属性中标注校验注解,在处理方法对应的入参前添加 @Valid,Spring MVC 就会实施校验并将校验结果保存在被校验入参对象之后的 BindingResult 或 Errors 入参中。BindingResult 或 Errors 常用方法:

FieldError getFieldError(String field)
List<FieldError> getFieldErrors()
Object getFieldValue(String field)
Int getErrorCount()

 Spring MVC 除了会将表单/命令对象的校验结果保存到对应的 BindingResult 或 Errors 对象中外,还会将所有校验结果保存到 “隐含模型”中,即使处理方法的签名中没有对应于表单/命令对象的结果入参(即处理方法的入参中没有BindingResult 或 Errors),校验结果也会保存在 “隐含模型” 中。隐含模型中的所有数据最终将通过 HttpServletRequest 的属性列表暴露给 JSP 视图,因此在 JSP 中可以获取错误信息
 示例:JSP 页面上可通过 <form:errors path=“userName”> 等显示错误消息
在这里插入图片描述
 后端代码:
在这里插入图片描述
三、提示消息的国际化
 每个属性在数据绑定和数据校验发生错误时,都会生成一个对应的 FieldError 对象。当一个属性校验失败后,校验框架会为该属性生成 4 个消息代码,这些代码以校验注解类名为前缀,结合 modleAttribute、属性名及属性类型名生成多个对应的消息代码,假如给 User 类中的 password 属性标注了一个 @Pattern 注解,当该属性值不满足 @Pattern 所定义的规则时, 就会产生以下 4 个错误代码:
  1️⃣Pattern.user.password
  2️⃣Pattern.password
  3️⃣Pattern.java.lang.String
  3️⃣Pattern
 当使用 Spring MVC 标签显示错误消息时, Spring MVC 会查看 WEB 上下文是否装配了对应的国际化消息,如果没有,则显示默认的错误消息,否则使用国际化消息。
 若数据类型转换或数据格式转换时发生错误,或该有的参数不存在,或调用处理方法时发生错误,都会在隐含模型中创建错误消息。其错误代码前缀说明如下:
  1️⃣required:必要的参数不存在。如 @RequiredParam(“param1”) 标注了一个入参,但是该参数不存在
  2️⃣typeMismatch:在数据绑定时,发生数据类型不匹配的问题
  3️⃣methodInvocation:Spring MVC 在调用处理方法时发生了错误
在这里插入图片描述
 在国际化文件(i18n.properties等文件)中配置注解验证错误的提示消息,格式:注解的名字.注解的对象在ioc中的id.对象的属性名

NotEmpty.employee.lastName=员工姓名校验失败
Email.employee.email=员工邮箱格式不正确

 数据校验的示例:
  ①加入jar包
   classmate-0.8.0.jar
   hibernate-validator-5.0.0.CR2.jar
   hibernate-validator-annotation-processor-5.0.0.CR2.jar
   jboss-logging-3.1.1.GA.jar
   validation-api-1.1.0.CR1.jar
  ②需验证的属性前加注解

@NotNull
private String name;
@Email
private String email;

  ③处理器类接收参数的对象前加注解@Valid,另外要注意验证的对象employee和绑定验证对象验证结果的bingdingResult对象在行参列表中不能被其他形参隔开

@RequestMapping(value = "/testFormat", method = RequestMethod.POST)
public String save(@Valid Employee employee, BindingResult bindingResult, Map<String, Object> map) {
    if (bindingResult.getErrorCount() > 0) {
        System.out.println("录入信息出错了......");
        List<FieldError> list = bindingResult.getFieldErrors();
        for (FieldError fieldError : list) {
            System.out.println(fieldError.getField() + "\t" + fieldError.getDefaultMessage());
            // 出错后跳转回录入页面
            map.put("departments", "D-AA");
            map.put("genders", "mail");
            return "input";
        }
    }
    System.out.println(employee.toString());
    return "redirect:/emps";
}  

  ④页面上显示验证错误消息:需导入SpringMVC的标签库http://www.springframework.org/tags/form
   在表单项后面使用<form:errors path=“字段名”/>即可,同时表单也要使用<form:form></form:form>的形式

<input type="text" name="name"/><form:errors path="name">  

  ⑤自定义验证错误消息:在国际化资源中配置,格式:注解名+类名+字段名,例如

Email.employee.email=邮箱格式不正确!

   别忘了注册国际化文件

<!--国际化信息 配置 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="i18n" /><!-- 国际化信息所在的文件名 -->
</bean>

标签:和校验,格式化,SpringMVC,Spring,校验,employee,注解,bindingResult,属性
来源: https://blog.csdn.net/rubulai/article/details/96833416