• JSR教程2——Spring MVC数据校验与国际化


    SpringMVC数据校验采用JSR-303校验。

    • Spring4.0拥有自己独立的数据校验框架,同时支持JSR303标准的校验框架。
    • Spring在进行数据绑定时,可同时调用校验框架完成数据校验工作。在Spring MVC中,可直接通过@Valid注解驱动的方式进行数据校验
    • Spring的LocalValidatorFactroyBean既实现了Spring的Validator接口,也实现了JSR 303的 Validator接口。只要在Spring容器中定义了一个LocalValidatorFactoryBean,即可将其注入到需要数据校验的Bean中。
    • Spring本身并没有提供JSR303的实现,Hibernate Validator是JSR 303的一个参考实现,这里我们就采用Hibernate validator。在新建Spring Boot项目后添加以下依赖:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.3.0.Final</version>
    </dependency>
    

    1.校验示例

     public class Student implements Serializable {
        @DecimalMin("10")
        private Long sid;
        @NotNull
        @Pattern(regexp = "b.*")
        private String name;
        @Past
        @JsonSerialize(using = CustomDateSerializer.class)
        private Date birthday;
    
        public Long getSid() {
            return sid;
        }
    
        public void setSid(Long sid) {
            this.sid = sid;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    }
    

    2.国际化

    为了在校验和数据转换失败时输出我们自定义的错误信息,我们需要在/static/i18n/messages.properties文件中配置国际化资源文件。格式为:
    校验注解名.类名全小写.类中的属性=xxxxx

    DecimalMin.student.sid=ID必须大于10喔^-^
    NotNull.student.name=名字不能为空喔
    Pattern.student.name=名字必须以b开头喔
    Past.student.birthday=亲,您是穿越了嘛!
    

    3.测试方法

    通过在处理方法的入参上标注@valid注解即可让Spring MVC在完成数据绑定后执行数据校验的工作
    • 在已经标注了JSR303注解的表单/命令对象前标注一个@Valid,Spring MVC 框架在将请求参数绑定到该入参对象后,就会调用校验框架根据注解声明的校验规则实施校验
    • Spring MVC是通过对处理方法签名的规约来保存校验结果的:前一个表单/命令对象的校验结果保存到随后的入参中,这个保存校验结果的入参必须是 BindingResult 或Errors 类型,这两个类都位于
    org.springframework.validation 包中
    • 需校验的 Bean 对象和其绑定结果对象或错误对象时成对出现的,它们之间不允许声明其他的入参
    • Errors 接口提供了获取错误信息的方法,如 getErrorCount() 或getFieldErrors(String field)
    • BindingResult扩展了Errors接口

    屏幕快照 2016-10-21 上午10.53.53

    @RequestMapping("testvalid")
        public String TestValid(
                @Valid//如果需要校验则需要驾驶@Valid注解
                @ModelAttribute("student")
                        Student student,
                Errors errors, Map<String, Object> map) {
            System.out.println(student);
            if (errors.hasErrors()) {
                System.out.println("这里有一些错误");
                for (FieldError fieldError :
                        errors.getFieldErrors()) {
                    System.out.println(fieldError.getField() + ":" + fieldError.getDefaultMessage());
    
                }
                return "forward:/input.jsp";
            }
            map.put("msg", "转换并校验成功了!");
            return "success";
        }
    

    4.页面

    <!DOCTYPE html>


    " />







    ID:



    Name:



    Birthday: value = "" />


        <input type = "submit" value = "Commit" />
    </form>
    


    在表单/命令对象类的属性中标注校验注解,在处理方法对应的入参前添加@Valid,Spring MVC就会实施校验并将校验结果保存在被校验入参对象之后的BindingResult或Errors入参中。
    • 常用方法:
    – FieldError getFieldError(String field)
    – List getFieldErrors()
    – Object getFieldValue(String field)
    – Int getErrorCount()
    • Spring MVC 除了会将表单/命令对象的校验结果保存到对应的BindingResult或Errors对象中外,还会将所有校验结果保存到 “隐含模型”
    • 即使处理方法的签名中没有对应于表单/命令对象的结果入参,校验结果也会保存在 “隐含对象” 中。
    • 隐含模型中的所有数据最终将通过 HttpServletRequest 的属性列表暴露给 JSP 视图对象,因此在 JSP 中可以获取错误信息
    • 在 JSP 页面上可通过 显示错误消息
    • 每个属性在数据绑定和数据校验发生错误时,都会生成一个对应的 FieldError 对象。
    • 当一个属性校验失败后,校验框架会为该属性生成 4 个消息代码,这些代码以校验注解类名为前缀,结合
    modleAttribute、属性名及属性类型名生成多个对应的消息代码:例如 User 类中的 password 属性标准了一个 @Pattern 注解,当该属性值不满足 @Pattern 所定义的规则时, 就会产生以下4个错误代码:
    – Pattern.user.password
    – Pattern.password
    – Pattern.java.lang.String
    – Pattern
    • 当使用 Spring MVC 标签显示错误消息时, Spring MVC 会查看WEB 上下文是否装配了对应的国际化消息,如果没有,则显示默认的错误消息,否则使用国际化消息。
    • 若数据类型转换或数据格式转换时发生错误,或该有的参数不存在,或调用处理方法时发生错误,都会在隐含模型中创建错误消息。其错误代码前缀说明如下:
    – required:必要的参数不存在。如 @RequiredParam(“param1”)标注了一个入参,但是该参数不存在
    – typeMismatch:在数据绑定时,发生数据类型不匹配的问题
    – methodInvocation:Spring MVC 在调用处理方法时发生了错误

  • 相关阅读:
    oc结构
    iOS分类
    iOS协议
    缓存无底洞现象
    数据库备份,恢复
    PHP邮件发送库:Swiftmailer
    PHP分页组件:Paginator
    PHP验证码类
    PHP日期和时间处理组件-Carbon
    composer的一些操作
  • 原文地址:https://www.cnblogs.com/quickcodes/p/JSR-jiao-cheng2Spring-MVC-shu-ju-xiao-yan-yu-guo-j.html
Copyright © 2020-2023  润新知