使用Struts的validator校验页面form中的两个字段是否一致,一般用在校验密码,当用户输入两次密码的时候需要校验用户的两次输入是否一致,如果不一致需要报错.实现这个功能的步骤如下:
1.编写一个校验器(Validator),实现对form中两个字段的一致性校验:
package cn.com.syni.net800114.validator;
import org.apache.commons.validator.ValidatorUtil;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.GenericValidator;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.validator.Resources;
import javax.servlet.http.HttpServletRequest;
public class ValidationUtil {
public static boolean validateTwoFields( Object bean, ValidatorAction va,
Field field, ActionErrors errors,
HttpServletRequest request) {
String value = ValidatorUtil.getValueAsString(bean, field.getProperty());
String sProperty2 = field.getVarValue("secondProperty");
String value2 = ValidatorUtil.getValueAsString(bean, sProperty2);
if (!GenericValidator.isBlankOrNull(value)) {
try {
if (!value.equals(value2)) {
errors.add(field.getKey(),
Resources.getActionError(request, va, field));
return false;
}
}
catch (Exception e) {
errors.add(field.getKey(),
Resources.getActionError(request, va, field));
return false;
}
}
return true;
}
}
|
2.编写validator-rules文件,增加一个自定义校验器的配置:
<validator name="twofields"
classname="cn.com.syni.net800114.validator.ValidationUtil" method="validateTwoFields"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
depends="required" msg="errors.twofields">
<javascript><![CDATA[
function validateTwoFields(form) {
var bValid = true;
var focusField = null;
var i = 0;
var fields = new Array();
oTwoFields = new twofields();
for (x in oTwoFields) {
var field = form[oTwoFields[x][0]];
var secondField = form[oTwoFields[x][2]("secondProperty")];
if (field.type == ‘text‘ ||
field.type == ‘textarea‘ ||
field.type == ‘select-one‘ ||
field.type == ‘radio‘ ||
field.type == ‘password‘) {
var value;
var secondValue;
// get field‘s value
if (field.type == "select-one") {
var si = field.selectedIndex;
value = field.options[si].value;
secondValue = secondField.options[si].value;
} else {
value = field.value;
secondValue = secondField.value;
}
if (value != secondValue) {
if (i == 0) {
focusField = field;
}
fields[i++] = oTwoFields[x][1];
bValid = false;
}
}
}
if (fields.length > 0) {
focusField.focus();
alert(fields.join(‘\n‘));
}
return bValid;
}]]></javascript>
</validator>
|
3.编写JSP页面
form中包括要进行自定义校验的字段,这里是两个password类型的input,校验器将校验用户输入的这两个字段是否一致,如果不一致,将通过弹出对话框告诉用户:
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ page contentType="text/html; charset=GBK" %>
<html:html><head><title>Regiestation</title></head>
<body>
<html:form action="/registationAction.do" onsubmit="return validateRegistation(this);">
<bean:message key="userForm.password"/>
<html:password property="password"/><br>
<bean:message key="userForm.password2"/>
<html:password property="password2"/>
<br>
<html:submit property="submit" value="Submit"/><br>
<html:reset value ="Reset"/>
</html:form>
</body>
<html:javascript formName="registation" staticJavascript="true" dynamicJavascript="true"/>
</html:html>
|
其中,<html:form action=”/registationAction.do” onsubmit=”return validatorRegistation(this);”>说明这个窗口需要使用Struts Validator进行校验,action属性指定这个JSP页面对应的Action,onsubmit属性指定了这个页面校验所对应的ActionForm Bean,它的规则是 “return + validator + FormBeanName + (this);”,这里的例子表示这个页面的action是/regiestationAction.do,它对应的Action Form名称为Registation(注意,如果在Struts-config.xml文件中ActionForm的名字为registation的话这里也要把第一个字母变为大写,否则出错.
最后倒数第二行的<html:javascrip>标记说明要使用java script进行客户端校验,formName属性指定Action Form的名称,这个名称要跟struts-config.xml文件中的配置一致,严格区分大小写,staticJavascript和dynamicJavascript分别指定是使用静态的还是动态的javascript代码进行校验.
4.编写validator.xml配置文件:
<form name="registation" >
<field property="password" depends="required,twofields">
<msg name="required" key="errors.required"/>
<msg name="twofields" key="errors.twofields"/>
<arg0 key="userForm.password"/>
<arg1 key="userForm.password2" />
<var>
<var-name>secondProperty</var-name>
<var-value>password2</var-value>
</var>
</field>
</form>
|
这里要注意<var-name>属性的secondProperty要跟ValidatorUtil.java中的校验方法中的代码一致,否则ValidatorUtil.java不能正确进行校验,<var-value>属性指定这个校验字段所参照的校验字段,上面的配置代码说明要对form中的password字段进行校验,它必须和另外一个叫做password2的字段一致.