Validator框架概述
安装和配置Validator框架
validator-rules.xml文件
validation.xml文件
Validator插件
Validator框架和ActionForm
Validator框架示例
在Validator框架中使用JavaScript
Validator框架概述
Struts框架能够在ActionForm的validate()方法中对用户输入的表单数据进行验证。这种验证方式有两个局限:
必须通过程序代码来实现验证逻辑,如果验证逻辑发生变化,必须重新编写和编译程序代码。
当系统中有多个ActionForm,并且它们包含一些相同的验证逻辑时,开发人员必须对每个ActionForm进行重复编程,完成相同的验证逻辑,这会降低代码的可重用性。
Validator框架能被集成到Struts框架中,负责数据验证。并且能克服在ActionForm中以编程方式进行数据验证的局限,它允许Struts应用灵活的配置验证规则,无需编程。
如今,Validator框架在Struts应用中得到了广泛的运用,Apache组织已经把它添加到Jakarta工程中,在Struts软件中携带了Validator框架。
安装和配置Validator框架
Validator框架主要依赖于两个JAR文件:
jakarta-oro.jar
提供了一组处理文本的类,具有文本替换、过滤和分割等功能。
commons-validator.jar
提供了一个简单、可扩展的验证框架,包含了通用的验证方法和验证规则。
如果在Struts应用中使用了Validator框架,那么把这两个JAR文件添加到应用的WEB-INF/lib目录中。
Validator框架采用两个基于XML的配置文件来配置验证规则。这两个文件为validator-rules.xml和validation.xml。在Struts应用,它们均存放在WEB-INF目录下。
validator-rules.xml文件
validator-rules.xml文件包含了一组通用的验证规则,对所有的Struts应用都适用。Struts软件中携带了这个文件。一般情况下,没有必要修改该文件,除非需要修改或扩展默认的规则。
Validator框架提供了14种默认的验证规则:
byte、short、integer、long、float、double:检验输入的数据是否能被转换成对应的基本数据类型
creditCard:检验输入的数据是否是一个合法的信用卡号码
date:检验输入的数据是否是一个合法日期
email:检验输入的数据是否是一个合法Email地址
mask:检验输入的数据是否能成功匹配一个正则表达式
maxLength:检验输入的数据的长度是否小于等于给定的最大长度
minLength:检验输入的数据的长度是否大于等于给定的最小长度
range:检验输入的数据的范围是否在最大值和最小值之间
required:检验输入数据是否为空,或不包含空格值的长度是否大于零
validation.xml文件
Validator框架的第二个配置文件为validation.xml文件。这个文件是针对于某个具体Struts应用的,需要开发人员来创建,它可以为应用中的ActionForm配置所需的验证规则,取代在ActionForm类中以编程的方式来实现验证逻辑。
元 素 说 明
<form-validation> 根元素,它包含两个子元素<global>与<formset>
<global> 包含多个<constant>子元素
<constant> 用来定义常量表达式,其中<constant-name>元素指定常量名, <constant-value>元素指定对应的表达式
<formset> 包含两个子元素<constant>与<form>
<form name=""> 为表单配置验证规则,可以包含多个<field>子元素
<field property="" depends=""> 配置表单中字段的验证规则
<arg name="" key="" resource=""> <field>元素的子元素,用于替换复合消息中的参数
<msg name="" key="" resource=""> <field>元素的子元素,指定验证规则对应的消息文本
<var><var-name><var-value></var> <field>元素的子元素,用来向验证规则传递参数
Validator插件
为了在Struts框架中使用Validator,可以采用插件机制把Validator加入到框架中。这需要在Struts配置文件中配置ValidatorPlugIn插件。
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
Validator框架和ActionForm
Validator框架不能用于验证标准的ActionForm类,如果要使用Validator框架,应该采用ActionForm类的子类。
ValidatorForm
DynaValidatorForm
ValidatorActionForm
DynaValidatorActionForm
举例:
ActionForm
package form;
import org.apache.struts.validator.ValidatorForm;
public class UserForm extends ValidatorForm {
private String id;
private String name;
private String pwd;
private String birthday;
private Integer age;
private String email;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
……
}
Action
package action;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import form.UserForm;
public class UserAction extends Action {
public ActionForward execute(......) {
UserForm userForm = (UserForm) form;
return mapping.findForward("output");
}
}
JSP
user.jsp
<html:form action="/user">
id : <html:text property="id"/><html:errors property="id"/><br/>
name : <html:text property="name"/><html:errors property="name"/><br/>
pwd : <html:password property="pwd"/><html:errors property="pwd"/><br/>
birthday : <html:text property="birthday"/>
<html:errors property="birthday"/><br/>
age : <html:text property="age"/><html:errors property="age"/><br/>
email : <html:text property="email"/><html:errors property="email"/><br/>
<html:submit/><html:reset/>
</html:form>
output.jsp
id : <bean:write name="userForm" property="id"/><br/>
name : <bean:write name="userForm" property="name"/><br/>
pwd : <bean:write name="userForm" property="pwd"/><br/>
birthday : <bean:write name="userForm" property="birthday"/><br/>
age : <bean:write name="userForm" property="age"/><br/>
email : <bean:write name="userForm" property="email"/><br/>
struts-config.xml
<struts-config>
<form-beans >
<form-bean name="userForm" type="form.UserForm" />
</form-beans>
<action-mappings >
<action attribute="userForm" input="/user.jsp" name="userForm"
path="/user" scope="request" type="action.UserAction">
<forward name="output" path="/output.jsp" />
</action>
</action-mappings>
<message-resources parameter="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>
ApplicationResources.properties
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.
validator-rules.xml
<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"/>
......
</global>
</form-validation>
validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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="userForm">
<field property="id" depends="required,mask"/>
<field property="name" depends="required"/>
<field property="pwd" depends="required,minlength,maxlength"/>
<field property="birthday" depends="required,date"/>
<field property="age" depends="required,intRange"/>
<field property="email" depends="required,email"/>
</form>
</formset>
</form-validation>
<field property="id" depends="required,mask"/>
<!-- 配置表单中字段的验证规则 -->
<field property="id" depends="required,mask">
<!-- 用于替换复合消息中的参数 -->
<arg key="id" resource="false" />
<!-- 指定验证规则对应的消息文本 -->
<msg name="mask" key="id is error [B001]" resource="false" />
<!-- 用来向验证规则传递参数 -->
<var>
<var-name>mask</var-name>
<var-value>^[B]{1}[0-9]{3}$</var-value>
</var>
</field>
<field property="name" depends="required"/>
<field property="name" depends="required">
<arg key="name" resource="false" />
</field>
<field property="pwd" depends="required,minlength,maxlength"/>
<field property="pwd" depends="required,minlength,maxlength">
<arg0 key="pwd" resource="false" />
<arg1 name="minlength" key="${var:minlength}" resource="false" />
<arg1 name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>minlength</var-name>
<var-value>4</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>10</var-value>
</var>
</field>
<field property="birthday" depends="required,date"/>
<field property="birthday" depends="required,date">
<arg key="birthday" resource="false" />
</field>
<field property="age" depends="required,intRange"/>
<field property="age" depends="required,intRange">
<arg key="age" resource="false" />
<arg name="intRange" key="age" resource="false" />
<arg1 name="intRange" key="${var:min}" resource="false" />
<arg2 name="intRange" key="${var:max}" resource="false" />
<var>
<var-name>min</var-name>
<var-value>1</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>100</var-value>
</var>
</field>
<field property="email" depends="required,email"/>
<field property="email" depends="required,email">
<arg key="email" resource="false" />
</field>
在Validator框架中使用JavaScript
在默认情况下,Validaor框架在Web服务器端执行表单验证,事实上,Validator框架也可以进行浏览器客户端验证。
<html:javascript formName="userForm"/>
<html:form action="/user" onsubmit="return validateUserForm(this);">