Struts Validator 开发指南(二)-
编写扩展Struts Validator校验密码输入
使用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的字段一致.

浙公网安备 33010602011771号