Struts多module下配置Form validate并使用高级的validate方法

1. 在多module配置下使用validate,需要在每个module的xml文件中加入: 

CODE: SELECT ALL
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames"
                        value="/WEB-INF/validator-rules.xml,
                                   /WEB-INF/validation-portal.xml"/>
</plug-in>


这样的定义,注意,每个module的validation文件,比如上述的validation-portal.xml,文件名必须不一样哦,这样是好事,这样每个module就有自己独立的validation文件了。

2. 使用高级的validate方法,EasyCluster V1.2中form的validate就用到了一个required的方法。其实还有很多方法可以用,比如integer,maxlength, intRange,email等,这里有个EasyCluster V2.0 Portal SubmitJobForm中的validate定义:

CODE: SELECT ALL
<form name="SubmitJobForm">
            <field property="jobname" depends="required,maxlength">
                <arg position="0" key="validate.submitjob.jobname"/>
                <arg position="1" name="maxlength" key="${var:maxlength}" resource="false"/>
                <var><var-name>maxlength</var-name><var-value>8</var-value></var>
            </field>
            <field property="jobtype" depends="required">
                <arg position="0" key="validate.submitjob.jobtype"/>
            </field>
            <field property="outputdir" depends="required">
                <arg position="0" key="validate.submitjob.outputdir"/>
            </field>
            <field property="mergeoutput"></field>
            <field property="mailnotify"></field>
            <field property="emailaddress" depends="email">
                <arg position="0" key="validate.submitjob.emailaddress"/>
            </field>
            <field property="startupmailnotify"></field>
            <field property="finishmailnotify"></field>
            <field property="executable" depends="required">
                <arg position="0" key="validate.submitjob.executable"/>
            </field>
            <field property="programargs"></field>
            <field property="pename"></field>
            <field property="startuptime"></field>
            <field property="resource"></field>
            <field property="procnummin" depends="integer,intRange">
                <arg position="0" key="validate.submitjob.procnummin"/>
                <arg position="1" name="intRange" key="${var:min}" resource="false"/>
                <arg position="2" 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>1000</var-value></var>
            </field>
            <field property="procnummax" depends="integer,intRange">
                <arg position="0" key="validate.submitjob.procnummax"/>
                <arg position="1" name="intRange" key="${var:min}" resource="false"/>
                <arg position="2" 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>1000</var-value></var>
            </field>
            <field property="commandoption"></field>
            <field property="suspendmailnotify"></field>
            <field property="resumemailnotify"></field>
            <field property="queue" depends="required">
                <arg position="0" key="validate.submitjob.queue"/>
            </field>
            <field property="ldlibrarypath"></field>
            <field property="path"></field>
</form>


很好用哦,注意看其中的几个东西: 
(1)<arg 标签,这个标签定义的是文本资源。我们知道,在Struts的文本资源中,可以放入参数的,比如"{0} 不能为空",这里的{0}就是参数,所以,在arg中定义的文本资源,比如jobname field中的validate.submitjob.jobname这个文本就会被替换到{0}的这个地方,很好用哦。而且,这个arg有个特性,就是,如果有多个dependency的时候,比如有required,maxlength这两个验证方式的时候,arg只需要写一个position="0",就表示这两个验证方式的字符串中的{0}都是这个arg定义的文本资源。比如,required这个dependency对应的文本资源是" {0} 不能为空", maxlength的是 "{0} 的长度不能超过 {1} 个字符",此时,<arg position="0" ......>这样只要写一行,那么,required和maxlength这两个验证的{0}就都是这个arg定义的那个文本了。那么,如果要对多个dependency的文本做分开定义的话怎么办呢?很简单,在arg中填写name这个属性的值就可以了。用name显示制定我们要定义哪个dependency的哪个position的argument的文本。 

(2)var,这个var是定义变量参数的。首先在arg中用key关键字定义出变量的名字,如min,max,maxlength,然后在var中就可以对这些变量定义值了。比如maxlength,这个var就是定义最大长度的,因为这是个变量,所以不能叫argument。注意,在var定义中,一般都有一个resource=false,这表示在我们var定义中出现的文本,比如jobname中的那个8,这不是一个资源,不需要Struts到ApplicationResource文件里面去找,直接将这个文本放上界面即可。其余的自己看看吧,很好理解的。
此外,还有几点: 

1. 用validate的话,不要忘记在JSP页面中加入对staticJavascript文件的引用哦。 

2. 在没有用required,但是使用了email,integer这些规则的时候,Struts生成的javascript非常聪明,这些表单的字段如果没有填写值,他是不会报错的,只有在填写了值以后,他才会去检验这个值是不是integer,是不是email。很聪明吧! 

3. 上文中说道每个dependency都对应一个文本,这个文本在validate出错的时候就会被显示在界面上,比如required就是"{0} 不能为空",这个字符串除非我们手动制定,否则Struts会在MessageResource中寻找errors.required这个字符串对应的message资源。所以,在使用validate的时候,不要忘记在Message Resource中定义这些文本资源哦。以下是一些对应关系: 

required --- errors.required 
integer --- errors.integer 
maxlength --- errors.maxlength 
email --- errors.email 
intRange --- errors.range !就这个不一样哦,HOHO 

4. 在书写validation的时候,如果对arg,var,field这些元素的attribute不清楚的话,可以直接看Struts validator的dtd文件,里面都有注释的。参考附件1,里面有struts-validator_1_3_0.dtd。 

原文地址:https://www.cnblogs.com/super119/p/1934991.html