数据格式化(传入String 变为对象的特殊属性Date)和数据校验

一般来说 :数据的格式化和校验是在一个模块中完成的,springMVC提供的源码也是差不多的

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

FormattingConversionServiceFactroyBean 内部已经注册了相关转化

  1. NumberFormatAnnotationFormatterFactroy:支持对数字类型的属性使用 @NumberFormat 注解
  2. JodaDateTimeFormatAnnotationFormatterFactroy:支持对日期类型的属性使用 @DateTimeFormat 注解

格式化示例

格式化示例

JSR 303 标准验证框架

相关注解

JSR303注解

Hibernate Validator 扩展注解

Hibernate Validator 扩展注解

Spring MVC 数据校验

Spring 4.0 拥有自己独立的数据校验框架,同时支持 JSR303 标准的校验框架。
• Spring 在进行数据绑定时,可同时调用校验框架完成数据校验工作。在 Spring MVC 中,可直接通过注解驱动的方式进行数据校验
• Spring 的 LocalValidatorFactroyBean 既实现了 Spring 的Validator 接口,也实现了 JSR 303 的 Validator 接口。只要在 Spring 容器中定义了一个
LocalValidatorFactoryBean,即可将其注入到需要数据校验的 Bean 中。
• Spring 本身并没有提供 JSR303 的实现,所以必须将JSR303 的实现者的 jar 包放到类路径下。
会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标注 @valid 注解即可让 Spring MVC 在完成数据绑定后执行数据校验的工作
• 在已经标注了 JSR303 注解的表单/命令对象前标注一个
@Valid,Spring MVC 框架在将请求参数绑定到该入参对象后,就会调用校验框架根据注解声明的校验规则实施校验
• Spring MVC 是通过对处理方法签名的规约来保存校验结果的:前一个表单/命令对象的校验结果保存到随后的入参中,这个保存校验结果的入参必须是BindingResult 或Errors 类型,这两个类都位于org.springframework.validation 包中

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

public String handle 91(@Valid User user, BindingResult userBindingResult,//一对
String sessionId,ModelMap mm,//可插入
@Valid Dept dept, Errors deptErrors//又一对){
User和其绑定结果的对象
Dept和其校验的结果对象

!需校验的 Bean 对象和其绑定结果对象或错误对象时成对出现的
之间不允许声明其他的入参

在目标方法中获取效验结果

在表单/命令对象类的属性中标注校验注解,在处理方法对应的入参前添加 @Valid,Spring MVC 就会实施校验并将校验结果保存在被校验入参对象之后的 BindingResult 或Errors 入参中。

@RequestMapping(value="/emp", method=RequestMethod.POST)
    public String save(@Valid Employee employee, Errors result, 
            Map<String, Object> map){
        System.out.println("save: " + employee);

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

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

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

        employeeDao.save(employee);
        return "redirect:/emps";
    }

常用方法

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

在页面上显示错误

• Spring MVC 除了会将表单/命令对象的校验结果保存到对应的 BindingResult 或 Errors 对象中外,还会将所有校验结果保存到 “隐含模型”
• 即使处理方法的签名中没有对应于表单/命令对象的结果入参,校验结果也会保存在 “隐含对象” 中。
• 隐含模型中的所有数据最终将通过 HttpServletRequest 的属性列表暴露给 JSP 视图对象,因此在 JSP 中可以获取错误信息
• 在 JSP 页面上可通过 显示错误消息
error示例

类的创建注解示例

类的创建注解示例

handler 处理示例
handler 处理示例

发布了30 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wsl9420/article/details/52892254