JavaEE——SpringMVC(7)--数据转换 & 数据格式化 & 数据校验

mvc:annotation-driven
<mvc:annotation-driven /> 会自动注册java

  RequestMappingHandlerMappingmvc

  RequestMappingHandlerAdapter app

  ExceptionHandlerExceptionResolver 三个bean。
• 还将提供如下支持:
  – 支持使用 ConversionService 实例对表单参数进行类型转换
  – 支持使用 @NumberFormat annotation、@DateTimeFormat注解完成数据类型的格式化
  – 支持使用 @Valid 注解对 JavaBean 实例进行 JSR 303 验证
  – 支持使用 @RequestBody 和 @ResponseBody 注解框架

@InitBinder
• 由 @InitBinder 标识的方法,能够对 WebDataBinder对象进行初始化。WebDataBinder 是 DataBinder 的子类,用于完成由表单字段到 JavaBean 属性的绑定
• @InitBinder方法不能有返回值,它必须声明为void。
• @InitBinder方法的参spa

数一般是是 WebDataBinderhibernate

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

FormattingConversionServiceFactroyBean 内部已经注册了 :
  – NumberFormatAnnotationFormatterFactroy:支持对数字类型的属性使用 @NumberFormat 注解
  – JodaDateTimeFormatAnnotationFormatterFactroy:支持对日期类型的属性使用 @DateTimeFormat 注解orm

  日期格式化
对象

  @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:完整日期/时间格式、-:忽略日期或时间格式blog

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

 

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

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

  

数据校验

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

Hibernate Validator 扩展注解
• Hibernate Validator 是 JSR 303 的一个参考实现,除支持全部标准的校验注解外,它还支持如下的扩展注解

 1).如何校验:

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

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

 

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

 

 2). 验证出错转向到哪个页面 ?

注意: 需校验的 Bean 对象和其绑定结果对象或错误对象时成对出现的,它们之间不容许声明其余的入参

/*保存新添加的员工信息*/
    @RequestMapping(value="/emp", method = RequestMethod.POST)
    public String save(@Valid Employee employee, BindingResult bindingResult,
                       Map<String, Object> map) {
        System.out.println("add" + employee);

        if(bindingResult.getErrorCount() > 0){
            System.out.println("出错了");

            for(FieldError error: bindingResult.getFieldErrors()){
                System.out.println(error.getField() + ": " + error.getDefaultMessage());
            }

            //若验证出错, 则转向定制的页面
            map.put("departments", departmentDao.getDepartments());
            return "input";
        }

  

 3). 在页面上显示错误
• Spring MVC 除了会将表单/命令对象的校验结果保存到对应的 BindingResult 或 Errors 对象中外,还会将全部校验结果保存到 “隐含模型”
• 即便处理方法的签名中没有对应于表单/命令对象的结果入参,校验结果也会保存在 “隐含对象” 中。
• 隐含模型中的全部数据最终将经过 HttpServletRequest 的属性列表暴露给 JSP 视图对象,所以在 JSP 中能够获取错误信息
• 在 JSP 页面上可经过 <form:errors path=“userName”>显示错误消息