现在的一些框架中提供了服务器端数据验证功能,很好用。springMVC使用了JSR-303 Validator(java标准)验证, 可以查看 JSR 303 - Bean Validation文档,使用时只需bean-validator.jar包即可,然后在实体类中采用注解形式标明验证条件。下面,用注解和反射实现一下加深这些框架对验证实现的原理.
User实体只有username、password两个属性
前台显示代码:
<form action="/myTest/UserServlet?method=add" method="post"> 用户名:<input type="text" name="username" value="${param.username }"> ${errors.username}<br> 密码:<input type="password" name="password" value="${param.password }"/>${errors.password} <br> <input type="submit" value="注册"/> </form>
用于验证的注解ValidateForm
@Retention(RetentionPolicy.RUNTIME) public @interface ValidateForm { public ValidateType type();//type表示验证的类型,是枚举类型 public String errorMsg();//错误消息 public String value() default "";//用来表示某个类型的值 }
ValidateType类型:
public enum ValidateType {
NotNull,Length,Email,Number;
}
带注解的User类:
public class User { @ValidateForm(type=ValidateType.NotNull,errorMsg="用户名不能为空") private String username; @ValidateForm(type=ValidateType.Length,value="6",errorMsg="密码长度不能小于6") private String password; }
用于实现验证方法的工具类RequestUtil:
public class RequestUtil { public static boolean validate(Class clz,HttpServletRequest req){ boolean isValidate=true; Map<String, String> errors=new HashMap<String, String>();//用来保存错误 Field[] fs=clz.getDeclaredFields(); for(Field f:fs){ if(f.isAnnotationPresent(ValidateForm.class)){ //如果这个字段有ValidateForm注解 String name=f.getName(); //获取这个字段的名称 String value=req.getParameter(name); //获取这个字段的值 ValidateForm vf=f.getAnnotation(ValidateForm.class);//获取这个注解 ValidateType vt=vf.type();//*******获取验证类型 if(vt==ValidateType.NotNull){ if(!validateNotNull(value)){ //如果这个值为空 errors.put(name, vf.errorMsg()); isValidate=false; } }else if(vt==ValidateType.Length){ if(!validateLength(value)){ errors.put(name, vf.errorMsg()); isValidate=false; } }//后面可以继续实现所要的验证 } } req.setAttribute("errors", errors); return isValidate; } private static boolean validateNotNull(String str) { //验证字段是否为空 if(str==null||str.equals("")) return false; return true; } private static boolean validateLength(String str){//验证字段长度 if(str==null||"".equals(str.trim())) return false; if(str.length()<6) return false; return true; } }
在servlet接收参数处理其它事前就可以调用来验证所填字段是否符合要求
if(!RequestUtil.validate(User.class, req))//如果不通过就把错误信息带到前台 req.getRequestDispatcher("/WEB-INF/user/register.jsp").forward(req, resp);