前几天尝试做一个比较大的项目作为练习,其中就牵扯到Validator校验框架,就来share下~~~
登陆界面:
登陆密码错误界面:
——》Validator概述 《——
没有Validator,你就不得不编写验证表单数据所需的全部代码,并把它放入Form Bean对象的validate( )方法中。对于想在其上进行数据验证的每个Form Bean域来说,都需要编写逻辑代码来实现验证。此外,你还必须编写代码来存储验证失败时的出错消息。
有了Validator,你就不必在Form Bean中编写用于验证或存储错误消息的任何代码。相反,Form Bean提供了Validator的一个ActionForm子类,它提供验证或存储错误消息的功能。
可把Validator框架作为一个可用于Form Bean验证的可插入的验证例行程序系统来进行安装。每个验证例行程序都只是一个Java方法,负责执行特定类型的验证任务,验证可能通过,也可能失败。 默认情况下,Validator与几个有用的验证例行程序封装在一起来提供,这些例行程序能满足大多数情况下的验证要求。但是,如果Validator框架没有提供你需要的验证例行程序,那么你可以自己创建定制的验证例行程序,并将它插入到该框架中。此外,Validator还支持服务器端和客户端(JavaScript)的验证,而Form Bean只提供服务器端验证界面。
Validator使用两个XML配置文件来分别确定安装哪个验证例行程序和如何将它们应用于给定的应用程序。第一个配置文件validator-rules.xml说明应该被插入到框架中的验证例行程序,并提供每个验证的逻辑的名称。validator-rules.xml文件还定义了每个验证例行程序的客户端JavaScript代码。可以配置Validator让它把这个JavaScript代码发送到浏览器上,这样验证就可以在客户端和服务器端进行了。
——》启用Validator插件 《——
虽然Validator框架是与Struts封装在一起提供的,但在默认状况下Validator并不被启用。为了启用Validator,要向你的应用程序的struts-config.xml文件中添加下面的插件定义
配置struts-config.xml:
<! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd" >
< struts-config >
< form-beans >
< form-bean name ="loginForm" type ="com.struts.form.LoginForm" >
</ form-bean >
< form-bean name ="regForm" type ="com.struts.form.RegForm" >
</ form-bean >
</ form-beans >
< global-exceptions />
< global-forwards />
< action-mappings >
< action attribute ="loginForm" input ="/index.jsp"
name ="loginForm" path ="/login" scope ="request"
type ="com.struts.action.LoginAction" validate ="true" >
< forward name ="success" path ="/suc.jsp" />
< forward name ="error" path ="/index.jsp" ></ forward >
</ action >
< action attribute ="regForm" input ="/reg.jsp" name ="regForm"
path ="/reg" scope ="request" type ="com.struts.action.RegAction" validate ="false" >
< forward name ="success" path ="/reg_success.jsp" />
</ action >
</ action-mappings >
< message-resources parameter ="com.struts.ApplicationResources" />
< plug-in className ="org.apache.struts.validator.ValidatorPlugIn" >
< set-property property ="pathnames"
value ="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</ plug-in >
</ struts-config >
<action attribute="loginForm" input="/index.jsp"
name="loginForm" path="/login" scope="request"
type="com.struts.action.LoginAction" validate="true">
<forward name="success" path="/suc.jsp" />
<forward name="error" path="/index.jsp"></forward>
</action>
在上面定义中的validate="true" 将使用validator进行校验
<message-resources parameter="com.struts.ApplicationResources" />
将在下文中解释
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
该定义告诉Struts为你的应用程序加载并初始化Validator插件。在初始化时,该插件装入由路径名属性指定的、用逗号分隔的Validator配置文件清单。
配置validator-rules.xml
Validator框架可以设置为可插入系统,其验证例行程序仅仅是插入到该系统中执行具体验证的Java方法。validator-rules.xml文件说明性地插入Validator用于执行验证的验证例行程序中。Struts示例应用程序带有这个文件的预配置拷贝。在大多数情况下,你不必修改这个预配置拷贝,除非你要向该框架中添加自己定制的验证。
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd" >
< form-validation >
< global >
< validator name ="required"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateRequired"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg ="errors.required" />
< validator name ="requiredif"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateRequiredIf"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg ="errors.required" />
< validator name ="validwhen"
msg ="errors.required"
classname ="org.apache.struts.validator.validwhen.ValidWhen"
method ="validateValidWhen"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest" />
< validator name ="minlength"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateMinLength"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.minlength"
jsFunction ="org.apache.commons.validator.javascript.validateMinLength" />
< validator name ="maxlength"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateMaxLength"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.maxlength"
jsFunction ="org.apache.commons.validator.javascript.validateMaxLength" />
< validator name ="mask"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateMask"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.invalid" />
< validator name ="byte"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateByte"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.byte"
jsFunctionName ="ByteValidations" />
< validator name ="short"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateShort"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.short"
jsFunctionName ="ShortValidations" />
< validator name ="integer"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateInteger"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.integer"
jsFunctionName ="IntegerValidations" />
< validator name ="long"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateLong"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.long" />
< validator name ="float"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateFloat"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.float"
jsFunctionName ="FloatValidations" />
< validator name ="double"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateDouble"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.double" />
< validator name ="date"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateDate"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.date"
jsFunctionName ="DateValidations" />
< validator name ="intRange"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateIntRange"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends ="integer"
msg ="errors.range" />
< validator name ="floatRange"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateFloatRange"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends ="float"
msg ="errors.range" />
< validator name ="doubleRange"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateDoubleRange"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends ="double"
msg ="errors.range" />
< validator name ="creditCard"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateCreditCard"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.creditcard" />
< validator name ="email"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateEmail"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.email" />
< validator name ="url"
classname ="org.apache.struts.validator.FieldChecks"
method ="validateUrl"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends =""
msg ="errors.url" />
< validator name ="includeJavaScriptUtilities"
classname =""
method =""
methodParams =""
depends =""
msg =""
jsFunction ="org.apache.commons.validator.javascript.validateUtilities" />
</ global >
</ form-validation >
配置validation.xml:
<! DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd" >
< form-validation >
< formset >
< form name ="loginForm" >
< field property ="user" depends ="required,mask,minlength" >
< arg key ="loginForm.user.displayname" position ="0" />
< arg name ="minlength" key ="${var:minlength}" resource ="false" position ="1" />
< var >
< var-name > mask </ var-name >
< var-value > ^w+$ </ var-value >
</ var >
< var >
< var-name > minlength </ var-name >
< var-value > 6 </ var-value >
</ var >
</ field >
< field property ="pwd" depends ="required,minlength" >
< arg0 key ="loginForm.pwd.displayname" />
< arg1 name ="minlength" key ="${var:minlength}" resource ="false" />
< var >
< var-name > minlength </ var-name >
< var-value > 1 </ var-value >
</ var >
</ field >
</ form >
</ formset >
</ form-validation >
<form name="loginForm">
对应的是struts-config.xml的
< form-bean name ="loginForm" type ="com.struts.form.LoginForm" >
</ form-bean >
< form-bean name ="regForm" type ="com.struts.form.RegForm" >
</ form-bean >
</ form-beans >
<field property="user" depends="required,mask,minlength">
定义中的property=“user”应于com.struts.form.LoginForm的ActionForm对应!
<var-value>^/w+$</var-value>
请参考另一文章 Regular Expression 关于正则表达式
<arg key="loginForm.user.displayname" position="0"/>
Validator使用Struts的资源绑定(Resource Bundle)机制将错误消息具体化。不用在框架中对错误消息进行硬编码,Validator使你能在ApplicationResources.properties文件中为一个消息指定一个键值,如果验证失败则将返回该键值。validator-rules.xml文件中的每个验证例行程序都用validator标记的msg属性指定错误消息的键值,便是上文提到的:<message-resources parameter="com.struts.ApplicationResources" />
ApplicationResources.properties:
# Project validator
loginForm.user.displayname = 用户名
loginForm.pwd.displayname = 密 码
loginForm.radio.stu = 学生
loginForm.radio.admin = 管理员
loginForm.login.error = 用户名或密码错误,请重新登录 !
errors.required = ... {0} 不能为空.
errors.minlength = ... {0} 不能少于 ... {1} 字符.
errors.maxlength = ... {0} 不能多于 ... {1} 字符.
errors.invalid = ... {0} 应由字母、数字和下划线组成.
errors. byte = ... {0} 必须为 byte .
errors. short = ... {0} 必须为 short .
errors.integer = ... {0} 必须为n integer.
errors. long = ... {0} 必须为 long .
errors. float = ... {0} 必须为 float .
errors. double = ... {0} 必须为 double .
errors.date = ... {0} is not a date.
errors.range = ... {0} is not in the range ... {1} through ... {2} .
errors.creditcard = ... {0} is not a valid credit card number.
errors.email = ... {0} 不是正确的邮箱地址
但是ApplicationResources.properties并无法储存中文字节
启动cmd
native2ascii -encoding gb2312 ApplicationResources_ISO.properties ApplicationResources.properties
这样就会将ISO编码的ApplicationResources转换成GB2312编码的格式了!
——》 创建Form Bean 《——
为了使用Validator,你的应用程序的Form Bean必须归到Validator的ActionForm的某一子类,而不是ActionForm本身。Validator的ActionForm子类提供了ActionForm的validate( )方法(它嵌入到Validator框架中)的实施过程。你不必从头编写验证代码并把它投入validate( )方法中,相反,可以完全忽略该方法,因为Validator为你提供了验证代码。
与Struts提供的核心功能相类似,Validator提供给你两种可供选择的方法来创建Form Bean。 你可以选择的第一种方法就是像下面这样创建一个特定的Form Bean对象:
com.struts.form.LoginForm
import org.apache.struts.validator.ValidatorForm;
public class LoginForm extends ValidatorForm ... {
private String user,pwd,status;
public String getUser() ...{
return user;
}
public void setUser(String user) ...{
this.user = user;
}
public String getPwd() ...{
return pwd;
}
public void setPwd(String pwd) ...{
this.pwd = pwd;
}
public String getStatus() ...{
return status;
}
public void setStatus(String status) ...{
this.status = status;
}
}
这个类与你不是用Validator所创建的类相似,但它提供ValidatorForm而不是ActionForm。这个类也不提供ActionForm的空reset( )和validate( )方法的实施过程,因为ValidatorForm提供了相应过程。
这样validator已经设置完毕,接下来在登录
< html:messages id ="messages" message ="true" >
< bean:write name ="messages" />
</ html:messages >
< html:messages id ="error" >
< br >
< bean:write name ="error" />
< br >
</ html:messages >
</ logic:messagesPresent >
结论
Validator框架针对表单数据的验证提供了可配置的系统,从而为核心Struts框架添加了很多有价值的功能。通过把Validator框架用于你的应用程序,你可以节约时间并简化Struts应用程序的开发过程。