• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

SpringMVC编程式验证器Validator

JAVA web前端中文站 3年前 (2017-08-02) 1269次浏览 已收录 0个评论

数据校验在 web 系统中非常常见,也非常常用。本文将借助 SpringMVC 的编程式验证器来学习一下 Validator。

更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏

数据不合法

  1. 比如用户名长度必须在 5-20 之间,而且必须以字母开头,可包含字母、数字、下划线;
  2. 比如注册用户时 用户名已经存在或邮箱已经存在等;
  3. 比如去一些论坛经常会发现,您发的帖子中包含×××屏蔽关键字等。

还有很多数据不合法的场景,在此就不罗列了,对于数据不合法,Spring Web MVC 提供了两种验证方式:

  • 编程式验证器验证
  • 声明式验证

编程式验证器

 package org.springframework.validation;    public interface Validator {    boolean supports(Class<?> clazz);    void validate(Object target, Errors errors);   }
  • Validator 接口:验证器,编程实现数据验证的接口;
  • supports 方法:当前验证器是否支持指定的 clazz 验证,如果支持返回 true 即可;
  • validate 方法:验证的具体方法,target 参数表示要验证的目标对象(如命令对象),errors 表示验证出错后存放错误信息的错误对象。

验证器实现

 package com.lisa33xiaoq.net.chapter4.web.controller.support.validator;   //省略 import   public class UserModelValidator implements Validator {       private static final Pattern USERNAME_PATTERN = Pattern.compile("[a-zA-Z]//w{4,19}");       private static final Pattern PASSWORD_PATTERN = Pattern.compile("[a-zA-Z0-9]{5,20}");       private static final Set<String> FORBINDDDEN_WORD_SET = new HashSet<String>();       static {          FORBINDDDEN_WORD_SET.add("fuc k"); //删掉空格          FORBINDDDEN_WORD_SET.add("admin");       }         @Override       public boolean supports(Class<?> clazz) {          return UserModel.class == clazz;//表示只对 UserModel 类型的目标对象实施验证       }       @Override       public void validate(Object target, Errors errors) {          //这个表示如果目标对象的 username 属性为空,则表示错误(简化我们手工判断是否为空)          ValidationUtils.rejectIfEmpty(errors, "username", "username.not.empty");          UserModel user = (UserModel) target;          if(!USERNAME_PATTERN.matcher(user.getUsername()).matches()) {              errors.rejectValue("username", "username.not.illegal");//如果用户名不合法          }          for(String forbiddenWord : FORBINDDDEN_WORD_SET) {              if(user.getUsername().contains(forbiddenWord)) {                 errors.rejectValue("username", "username.forbidden",       new Object[]{forbiddenWord}, "您的用户名包含非法关键词");//用户名包含屏蔽关键字                 break;              }          }          if(!PASSWORD_PATTERN.matcher(user.getPassword()).matches()) {              errors.rejectValue("password","password.not.illegal", "密码不合法");//密码不合法          }         }   }
  • supports 方法:表示只对 UserModel 类型的对象验证;
  • validate 方法:数据验证的具体方法,有如下几个验证:

用户名不合法(长度 5-20,以字母开头,随后可以是字母、数字、下划线)

 USERNAME_PATTERN.matcher(user.getUsername()).matches() //使用正则表达式验证 errors.rejectValue("username", "username.not.illegal");//验证失败为 username 字段添加错误码

屏蔽关键词:即用户名中含有不合法的数据(如 admin)

 user.getUsername().contains(forbiddenWord) //用 contains 来判断我们的用户名中是否含有非法关键词 errors.rejectValue("username", "username.forbidden", new Object[]{forbiddenWord}, "您的用户名包含非法关键词"); //验证失败为 username 字段添加错误码(参数为当前屏蔽关键词)(默认消息为"您的用户名包含非法关键词")

密码不合法,例如密码不能低于 6 位数等。

ValidationUtils

 ValidationUtils.rejectIfEmpty(errors, "username", "username.not.empty"); 表示如果目标对象的 username 属性数据为空,则添加它的错误码; 内部通过(value == null || !StringUtils.hasLength(value.toString()))实现判断 value 是否为空,从而简化代码。

spring 配置文件 chapter4-servlet.xml

 <bean id="userModelValidator"   class="com.lisa33xiaoq.net.chapter4.web.controller.support.validator.UserModelValidator"/>   <bean name="/validator"   class="com.lisa33xiaoq.net.chapter4.web.controller.RegisterSimpleFormController">       <property name="formView" value="registerAndValidator"/>       <property name="successView" value="redirect:/success"/>       <property name="validator" ref="userModelValidator"/>   </bean>  

错误码配置(messages.properties),需要执行 NativeToAscii

 username.not.empty=用户名不能为空   username.not.illegal=用户名错误,必须以字母开头,只能出现字母、数字、下划线,并且长度在 5-20 之间   username.forbidden=用户名中包含非法关键词【{0}】   password.not.illegal=密码长度必须在 5-20 之间  

视图页面(/WEB-INF/jsp/registerAndValidator.jsp)

 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>   <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>   <form:form commandName="user">   <form:errors path="*" cssStyle="color:red"></form:errors><br/>   username:<form:input path="username"/>   <form:errors path="username" cssStyle="color:red"></form:errors>   <br/>   password:<form:password path="password"/>   <form:errors path="password" cssStyle="color:red"></form:errors>   <br/>   <input type="submit" value="注册"/>   </form:form>  

form:errors path="username":表示只显示 username 字段的错误信息;

输入地址:http://localhost:9080/springmvc-chapter4/validator 进行测试。

当我们输入错误的数据后,会报错(form:errors path="*"显示所有错误信息,而 form:errors path="username"只显示该字段相关的)。

如 MultiActionController 控制器相关方法没有提供给我们 errors 对象(Errors),我们应该怎么进行错误处理呢?
此处给大家一个思路,errors 本质就是一个 Errors 接口实现,而且在页面要读取相关的错误对象,该错误对象应该存放在模型对象里边,因此我们可以自己创建个 errors 对象并将其添加到模型对象中即可。

 BindException errors = new BindException(user, getCommandName(user));   //如果用户名为空   if(!StringUtils.hasLength(user.getUsername())) {       errors.rejectValue("username", "username.not.empty");   }   if(errors.hasErrors()) {       return new ModelAndView(getCreateView()).addAllObjects(errors.getModel());   } 
  • new BindException(user, getCommandName(user)):使用当前的命令对象,和命令对象的名字创建了一个 BindException 作为 errors;
  • StringUtils.hasLength(user.getUsername()):如果用户名为空就是用 errors.rejectValue("username", "username.not.empty");注入错误码;
  • errors.hasErrors():表示如果有错误就返回到新增页面并显示错误消息;
  • ModelAndView(getCreateView()).addAllObjects(errors.getModel()):此处一定把 errors 对象的模型数据放在当前的 ModelAndView 中,作为当前请求的模型数据返回。

在浏览器地址栏输入:http://localhost:9080/springmvc-chapter4/userAndValidator/create 到新增页面

用户名什么都不输入,提交后又返回到新增页面 而且显示了错误消息说明我们的想法是正确的。本文示例源码下载链接:http://pan.baidu.com/s/1bpvohZp 密码:wgde

【注:本文源自网络文章资源,由站长整理发布】


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:SpringMVC 编程式验证器 Validator
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址