论坛首页 Java企业应用论坛

谁能解释一下这个validator呢

浏览 4327 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-04-28  
<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.ActionErrors,
                       javax.servlet.http.HttpServletRequest"
msg="errors.required">
<javascript><![CDATA[
            function validateRequired(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oRequired = new required();
                for (x in oRequired) {
                var field = form[oRequired[x][0]];
               
                    if (field.type == 'text' ||
                        field.type == 'textarea' ||
                        field.type == 'file' ||
                        field.type == 'select-one' ||
                        field.type == 'radio' ||
                        field.type == 'password' ||
                        field.type == 'hidden') {
                       
                        var value = '';
// get field's value
if (field.type == "select-one") {
var si = field.selectedIndex;
if (si >= 0) {
value = field.options[si].value;
}
} else {
value = field.value;
}
                       
                        if (trim(value).length == 0) {
                       
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oRequired[x][1];
                        isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
  if(focusField.type!='hidden'){
                   focusField.focus();
  }
                   alert(fields.join('\n'));
                }
                return isValid;
            }
           
            // Trim whitespace from left and right sides of s.
            function trim(s) {
                return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
            }
           
            ]]> </javascript>
</validator>

oRequired = new required();是什么意思?
oRequired[x][0]]指什么?
   发表时间:2006-04-28  
首先,要告诉你的是你贴的这段js是有bug的。

赶紧升级吧
oRequired = new required();这行是错的,当时让我郁闷了5个小时。
正确的这行是这样的: oRequired = eval('new ' + retrieveFormName(form) +  '_required()');

当然相关的脚本全部更新一下。

再来回答你想知道oRequired[x][0]]指的东西。
oRequired[x][0]]得到的是表单域中的name,

比如你有个表单域的名字是username,而你限制了username是必填的,那么,在这里取得的就是“username”

而对应的 oRequired[x][1],就是出错消息,比如“用户名 为必填项。”



 
0 请登录后投票
   发表时间:2006-04-28  
我现在有个问题就是我有一组username验证。要我该怎么修改这个代码。
0 请登录后投票
   发表时间:2006-04-28  
解决方法:

使用struts1.2.8版本和commons validator 1.2.0版本结合。

用struts-1.2.8-bin.zip\struts-1.2.8-bin\lib\validator-rules.xml替换
你的validator-rules.xml

编辑你的\validation.xml,修改后内容如下:
(dtd使用1.2.0版本的)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
     "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.2.0//EN"
     "http://jakarta.apache.org/commons/dtds/validator_1_2_0.dtd">
<form-validation>
</form-validation>
0 请登录后投票
   发表时间:2006-04-28  
还要使用commons-validator-1.2.0.zip\commons-validator-1.2.0\commons-validator-1.2.0.jar
0 请登录后投票
   发表时间:2006-04-28  
rickhunter 写道
<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.ActionErrors,
                       javax.servlet.http.HttpServletRequest"
msg="errors.required">
<javascript><![CDATA[
            function validateRequired(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oRequired = new required();
                for (x in oRequired) {
                var field = form[oRequired[x][0]];
               
                    if (field.type == 'text' ||
                        field.type == 'textarea' ||
                        field.type == 'file' ||
                        field.type == 'select-one' ||
                        field.type == 'radio' ||
                        field.type == 'password' ||
                        field.type == 'hidden') {
                       
                        var value = '';
// get field's value
if (field.type == "select-one") {
var si = field.selectedIndex;
if (si >= 0) {
value = field.options[si].value;
}
} else {
value = field.value;
}
                       
                        if (trim(value).length == 0) {
                       
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oRequired[x][1];
                        isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
  if(focusField.type!='hidden'){
                   focusField.focus();
  }
                   alert(fields.join('\n'));
                }
                return isValid;
            }
           
            // Trim whitespace from left and right sides of s.
            function trim(s) {
                return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
            }
           
            ]]> </javascript>
</validator>

oRequired = new required();是什么意思?
oRequired[x][0]]指什么?


这个要结合你另一个xml
比如

<form-validation>
<formset>             
<form name="logonForm">
  <field property="username" depends="required">
    <msg name="required" key="error.username"/>
  </field>    
</form>        
</formset>   
</form-validation>



首先你的页面上肯定有 html:javascrip .这个tag会根据你的配置生成一个
function required{
}

这个就是你代码中被 new required(javascript中一个function也可以被new 作为一个类)的地方.

随后你会看到这个function中会针对每个field生成一个记录作为required的一个属性.
用for in的时候就可以循环找到对应的field

这个记录是个数组,第一个是field的名称.所以 form[oRequired[x][0]]就是找到form中的对象.后面是你在xml中的其他配置,比如提示信息什么的.

说白了required里存放了被验证field的相关配置.

至于楼上朋友所说的版本新旧,那是因为对于一个form,就会在页面上生成一个required.如果两个form生成的都叫required名字就冲突了,所以现在struts在生成之前用每个form名字作为前缀

这种方法挺有意思,把需要验证的对象和验证规则分离出来,其中验证对象动态生成,验证规则是写死的

高ren之作,非你我等可窥斑啊!!
0 请登录后投票
   发表时间:2006-04-28  
rickhunter 写道
我现在有个问题就是我有一组username验证。要我该怎么修改这个代码。


这种复杂需求我看还是算了吧
自己动手写script也比改他的代码强.
0 请登录后投票
   发表时间:2006-04-28  
再次 询问 大家
if (i == 0) {
focusField = field;
}
fields[i++] = oRequired[x][1];

是个什么意思?
特别是if (i == 0) {
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics