Spring MVC数据校验

应用程序在执行业务逻辑前,必须通过数据校验保证接收到的输入数据是正确合法的。很多时候,同样的数据验证会出现在不同层中,这样会导致代码冗余。为了避免这样的情况,最好将验证逻辑和相应的域模型进行绑定,将代码验证的逻辑集中起来管理。

JSR303是java为Bean数据合法性校验所提供的标准框架,核心接口是javax.validation.Validator,该接口根据目标对象类中所标准的校验注解进行数据校验;Hibernate Validator是JSR303的一个参考实现,除支持所有标准的校验注解外,它还支持扩展的注解。

1. Bean Validation 中内置的 constraint
注解 作用
@Valid 被注释的元素是一个对象,需要检查此对象的所有字段值
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式

2. Hibernate Validator 附加的 constraint
注解 作用
@Email 被注释的元素必须是电子邮箱地址
@Length(min=, max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=, max=) 被注释的元素必须在合适的范围内
@NotBlank 被注释的字符串的必须非空
@URL(protocol=,
host=, port=,
regexp=, flags=) 被注释的字符串必须是一个有效的url
@CreditCardNumber
被注释的字符串必须通过Luhn校验算法,
银行卡,信用卡等号码一般都用Luhn
计算合法性
@ScriptAssert
(lang=, script=, alias=) 要有Java Scripting API 即JSR 223
("Scripting for the JavaTM Platform")的实现
@SafeHtml
(whitelistType=,
additionalTags=) classpath中要有jsoup包

主要区分下@NotNull @NotEmpty @NotBlank 3个注解的区别:
@NotNull 任何对象的value不能为null
@NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null
@NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0

Spring 3.0拥有自己独立的数据校验框架,同时支持JSR303标准校验框架。Spring DataBinder在进行数据绑定时,可同时调用校验框架完成数据校验工作。Spring的org.springframework.validation是校验框架所在的包。 LocalValidatorFactoryBean既实现了Spring的Validator接口,也实现了JSR303的Validator接口。值得注意的是,Spring本身没有提供JSR 303的实现,所以必须将JSR303的实现者的jar文件放到类路径下,Spring将自动加载并配置好JSR303的实现者。

导入校验jar包

<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.4.1.Final</version>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>

SpringMVC 数据校验

<mvc:annotation-driven>会默认的装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标准@Valid注解即可让Spring MVC在完成数据绑定后执行数据校验的工作。我们可以自定义校验,使用hibernate valiator进行校验。
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>config.CustomValidationMessage</value>
            </list>
        </property>
        <property name="useCodeAsDefaultMessage" value="true"/>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
        <!--这里配置将使用上面国际化配置的messageSource -->
        <property name="validationMessageSource" ref="messageSource"/>
    </bean>

配置好了校验器后,需要将校验器注入到处理器适配器中,还是在springmvc.xml文件中,将我们配好的validator注入进去

<mvc:annotation-driven validator="validator"/>
在参数类中,使用注解定义校验规则。
public class AccountParam {
    @NotBlank(message = "{username}")
    private String username;
    @NotBlank(message = "{passwd}")
    private String passwd;
    @NotNull
    @Pattern(regexp = ".*(?=.*\\d)(?=.*[a-zA-Z])(?=.*[~!@#$%^&*_]).{8,}", message = "{newpasswd}")
    private String newpasswd;
    @NotBlank(message = "{confirmpasswd}")
    private String confirmpasswd;
}
上面已经将校验相关的配置都配好了,接下来就需要在controller的方法中捕获校验结果中的错误信息,然后将这些错误信息传到前台去显示。那么controller的方法中该如何去捕获呢?
 @RequestMapping(value = "/update-account", method = RequestMethod.POST)
    @ControllerLog(type = LogConst.TYPE_LOG_PASSWD, description = "用户修改了密码")
    @ResponseBody
    public AjaxResult updateUserPasswd(HttpServletRequest request, @Valid AccountParam accountParam, BindingResult bindingResult) {
        logger.info("AccountController updateUserPasswd:/update-account?param={}", accountParam.toString());
        if (bindingResult.hasErrors()) {
            return AjaxResult.errorParam();
        }
        userService.updateUserPasswd(accountParam);
        //更新session用户
        setSessionUser(request, userService.getUserByUserName(accountParam.getUsername()));
        return AjaxResult.success();
    }
需要校验的表单/命令对象和其绑定结果对象或错误对象是成对出现的,他们之间不允许声明其他的入参。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值