分享

hk编写扩展Struts Validator校验密码输入

 ayi 2006-04-16

编写扩展Struts Validator校验密码输入

使用Strutsvalidator校验页面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文件中的配置一致,严格区分大小写,staticJavascriptdynamicJavascript分别指定是使用静态的还是动态的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的字段一致.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多