基于annotation的表单验证

现在的一些框架中提供了服务器端数据验证功能,很好用。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);

你可能感兴趣的:(annotation)