在之前的校驗(yàn)案例中我們使用了validator框架中的”required、minLength、maxLength”這幾種校驗(yàn)規(guī)則,對(duì)于這些規(guī)則我們知道都配置在validator-rules.xml文件中了,縱觀里面的規(guī)則,我們可發(fā)現(xiàn)還有很多其它的校驗(yàn)規(guī)則,其中“mask”可以校驗(yàn)正則表達(dá)式,“date”可校驗(yàn)日期格式,“email”可校驗(yàn)郵件的格式,可見這框架的強(qiáng)大之處,我們使用”date”和”email”分別來校驗(yàn)表單中的日期和郵件輸入的格式,首先在表單中增加兩個(gè)這樣的輸入域,然后在userForm中對(duì)應(yīng)的增加字段,然后在校驗(yàn)文件中增加如下兩個(gè)字段的校驗(yàn):
<field property="email"
depends="email">
<arg key="prompt.email"/>
</field>
<field property="birthday"
depends="date">
<arg key="prompt.date"/>
<var>
<var-name>datePattern</var-name>
<var-value>yyyy-MM-dd</var-value>
</var>
</field>
校驗(yàn)郵件格式跟之前的幾個(gè)校驗(yàn)沒啥區(qū)別,但是日期格式的校驗(yàn)時(shí)我們得設(shè)置日期匹配的類型變量,這樣就能達(dá)到日期和郵件的校驗(yàn)了,對(duì)于這種自身的校驗(yàn)之外,還有一種校驗(yàn),如確認(rèn)密碼和密碼是否是相同的這樣的校驗(yàn)則不是單純校驗(yàn)本身了,而是跟別的進(jìn)行一個(gè)對(duì)比,這時(shí)另一種校驗(yàn)規(guī)則出現(xiàn)了,“validwhen”,它是專門來校驗(yàn)像這種復(fù)雜類型的校驗(yàn)規(guī)則,所以我們?cè)诒韱沃性偬砑右粋€(gè)文本域叫password2,然后在formbean中添加相應(yīng)的字段,最后我們?cè)谛r?yàn)文件中進(jìn)行配置,用這種校驗(yàn)時(shí)得注意,因?yàn)樗南EY和”required”校驗(yàn)器的是一樣的,都是“errors.required”,所以這時(shí)我們同時(shí)用上這兩個(gè)校驗(yàn)規(guī)則,從中來說明一個(gè)問題,這個(gè)字段的校驗(yàn)如下:
<field property="password2"
depends="required,validwhen">
<msg key="errors.password2" name="validwhen"/>
<arg key="prompt.password2"/>
<var>
<var-name>test</var-name>
<var-value>(*this* == password)</var-value>
</var>
</field>
在使用“validwhen”校驗(yàn)器進(jìn)行校驗(yàn)時(shí)我們得設(shè)置test變量,在使用這個(gè)校驗(yàn)器時(shí)我們還面臨一個(gè)問題,之前也說過了,它的消息KEY跟”required”是一樣的,當(dāng)對(duì)一個(gè)字段進(jìn)行校驗(yàn)時(shí)這兩個(gè)校驗(yàn)規(guī)則并存時(shí)就應(yīng)該采取相應(yīng)的措施來避免沖突的產(chǎn)生,我們讓required還保持默認(rèn),所以我們用arg來進(jìn)行參數(shù)的配置,而validwhen則不能采用默認(rèn)了,我們應(yīng)該改變它的消息KEY,這時(shí)我們可用msg標(biāo)簽來進(jìn)行替換,name指的是哪個(gè)校驗(yàn)器發(fā)生時(shí),key則表示會(huì)用指定的消息KEY,這是使用這個(gè)校驗(yàn)器的一個(gè)需要注意的問題。
可能在實(shí)際中我們會(huì)遇到如下情況:如果兩個(gè)Action關(guān)聯(lián)的是同一個(gè)ActionForm,但它們的校檢規(guī)則可能不一樣,在ActionForm中該如何編寫validate方法?例如,增加用戶和修改用戶時(shí)可使用同一個(gè)ActionForm,但是修改用戶不需要校驗(yàn)密碼:
<form name=”userForm” type=”….”/>
<action path=”/addUser” name=”userForm” type=”…..”/>
<action path=”/editUser” name=”userForm” type=”….”/>
像這樣的需求我們?cè)趺磥韺?shí)現(xiàn)呢?ValidatorActionForm就是用來解決這樣的問題的,我們讓我們的Formbean來繼承它而代替ValidatorForm,然后對(duì)于這兩個(gè)Action有不同的校驗(yàn)規(guī)則,所以我們得在validation.xml中配置兩套校驗(yàn)規(guī)則,而校驗(yàn)規(guī)則的命名是以action的path路徑為名,這樣對(duì)于每個(gè)Action請(qǐng)求就會(huì)根據(jù)請(qǐng)求名稱來到validator.xml中找到不同的校驗(yàn)規(guī)則,重要原因還是ValidatorActionForm這個(gè)類起的作用,原來我們用ValidatorForm時(shí)是根據(jù)Action所關(guān)聯(lián)的Fomrbean的名稱來進(jìn)行校驗(yàn)規(guī)則匹配的,而這個(gè)類則是根據(jù)Action的path路徑來找相應(yīng)的校驗(yàn)規(guī)則的,所以這樣就解決了這種需求了,validator.xml中的模擬寫法就如下:
<form-validation>
<formset>
<form name="/editUser">
<field property="name"
depends="required">
<arg key="prompt.username"/>
</field>
...
</form>
<form name="/addUser">
<field property="name"
depends="required">
<arg key="prompt.username"/>
</field>
...
</form>
</formset>
在學(xué)struts的時(shí)候我們知道還有一種動(dòng)態(tài)ActionForm,那如果是這種情況下用validator框架來對(duì)進(jìn)行校驗(yàn)又該如何做呢?struts又提供了一個(gè)類專門來解決這樣的問題的,叫“DynaValidatorForm”,我們?cè)趕truts-config.xml中把動(dòng)態(tài)ActionForm配成如下:
<form-bean name="userForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="name" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
這時(shí)我們?cè)趘alidation.xml針對(duì)這個(gè)formbean配置一套校驗(yàn)規(guī)則既可實(shí)現(xiàn)校驗(yàn),其實(shí)跟自己手動(dòng)編寫的formbean一樣,對(duì)于多個(gè)Action引用同一個(gè)動(dòng)態(tài)formbean但其校驗(yàn)規(guī)則不同的情況,我們將動(dòng)態(tài)formbean配成DynaValidatorActionForm,既可完成這樣的需求,原理跟ValidatorActionForm一樣。
此對(duì)對(duì)于用JavaScript校驗(yàn)功能用這個(gè)校驗(yàn)框架也能辦到,而不用我們自己在客戶端進(jìn)行代碼編寫,要用使用Validator的JavaScript校驗(yàn)功能,要在JSP頁(yè)面中使用struts的<html:javascriptformName=”xxx”>標(biāo)簽,其中的xxx是某個(gè)校驗(yàn)域的名稱,對(duì)于我們這個(gè)例子則是userForm,然后在需要驗(yàn)證的表單的onsubmit屬性中調(diào)用“returnvalidateXxx()”方法,其中validateXxx方法可能通過<html:javascript>的method屬性來改變,默認(rèn)是配置的formName的名稱,于是我們?cè)谟脩糇?cè)JSP中加入如下語(yǔ)句來生成Javascript校驗(yàn)代碼:
<html:javascript formName="userForm"/>
這時(shí)我們?cè)L問此頁(yè)面,然后查看其源代碼就會(huì)發(fā)現(xiàn)生成validateUserForm()的校驗(yàn)方法:
假如我們想改變生成的方法名稱,可用method屬性來進(jìn)行改變:
<html:javascript formName="userForm" method=”xxx”/>
這里我們采用默認(rèn)的方法,知道這個(gè)方法之后,然后我們?cè)诒韱蔚膕ubmit方法中進(jìn)行訪問:
<html:form action="/RegUser" onsubmit="return validateUserForm(this);">
….
</html:form>
然后表單就具有JavaScript校驗(yàn)功能了:
但是關(guān)于struts validator校驗(yàn)器生成的javascript校驗(yàn)功能,還有一個(gè)問題,給合這個(gè)例子來看,當(dāng)我們什么都不填寫時(shí)只會(huì)彈出一個(gè)對(duì)話框,但是如果密碼長(zhǎng)度很短,就會(huì)彈出兩個(gè)對(duì)話框,效果如下:
從這兩個(gè)對(duì)話框可以看出規(guī)律,就是對(duì)于多個(gè)表單字段元素違背的同一個(gè)校驗(yàn)規(guī)則的信息都顯示在一個(gè)對(duì)話框,其實(shí)沒必要一下顯示多個(gè)對(duì)話框,我們希望只彈出第一個(gè)對(duì)話框,只有修完第一個(gè)對(duì)話框的問題后才單獨(dú)彈出第二個(gè)對(duì)話框的內(nèi)容,這就涉及到Javascript的短路功能了,而要實(shí)現(xiàn)短路功能我們只要在struts配置文件中配validator插件中將”stopOnFirstError”屬性設(shè)為”true”既可,如:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="true"/>
</plug-in>
這樣就只會(huì)彈出一個(gè)對(duì)話框來顯示同組的校驗(yàn)錯(cuò)誤信息,等修改好這一組后再會(huì)彈出第二個(gè)對(duì)話框,顯示效果:
如果要為ValidatorActionForm對(duì)應(yīng)的表單生成前臺(tái)的javaScript校驗(yàn)代碼,可以使用類似如下的代碼:<html:javascriptformName="/addUser"/>,其中的formName與校驗(yàn)域的名字完全一樣,生成的javascript方法則是按formBean的名稱來的。
360pskdocImg_7