javascript 支持
?????? 在 web 應(yīng)用中,使用 javascript 的機(jī)會(huì)非常多。雖然不少書(shū)上提及客戶有可能從瀏覽器關(guān)閉 js 的執(zhí)行,但是要想完全的不使用它,目前看來(lái)好像還不行。比如一些復(fù)雜的 UI 是必須通過(guò) js 來(lái)實(shí)現(xiàn)的(如下拉式菜單等等)。那么 validation 框架支不支持客戶端的 js 驗(yàn)證呢?
答案是:當(dāng)然。具體做法是:
-????????? 在頁(yè)面 html:form 標(biāo)簽內(nèi)部添加 onsubmit="return validateEditForm(this);" (具體的語(yǔ)法: validate+ 在 validation.xml 文件中定義的 form 的名字);如:
<html:form action="<%=action%>" method="post" onsubmit="return validateEditForm(this);">
-?????????
在
html:form
內(nèi)部塊中添加:
<html:javascript formName="editForm"/>
?????? 如此 2 步即可。雖然, validation 框架非常簡(jiǎn)單易用,但是還是有需要注意的地方。
使用注意
1.?????? 使用 validation 框架后, form 必須從 ValidatorForm 中派生,同時(shí)必須在你的 validate 方法中先調(diào)用基類的 validate 方法。對(duì)于使用 Dyna 開(kāi)頭的方法來(lái)創(chuàng)建 formbean 的讀者,你也必須改為以 dyna 開(kāi)頭含有 validator 的 form 。
2.?????? 注意 DynaValidatorForm ( ValidatorForm )和 DynaValidatorActionForm ( ValidatorActionForm )的區(qū)別。剛開(kāi)始時(shí)從幫助中沒(méi)看明白這 2 者的區(qū)別,后來(lái)從網(wǎng)上一篇文章中得到了用法的區(qū)別。前者主要的視角是 formbean ,而后者的視角是 action 。
當(dāng) formbean 被不同的 action 使用時(shí),對(duì)于不同的 action 而言,使用的 formbean 的屬性集合有大有小。此時(shí)如果仍然以 formbean 為主體,會(huì)造成其他 action 的不正常使用。因此, struts 中提出了 DynaValidatorActionForm ( ValidatorActionForm )。此時(shí)在 validation.xml 中的 form 標(biāo)簽的 name 屬性改為 action 的 path 屬性,又由于 action 中有 attribute 和 name 屬性, validation 框架就可根據(jù)這個(gè) action 得到對(duì)應(yīng)的 formbean 。例子:
<formset>
? <form name="/createAddress">
??? <field property="city"
????????? depends="required">
????? <arg0 key="prompt.city"/>
??? </field>
? </form>
? <form name="/editAddress">
??? <field property="state"
????????? depends="required">
????? <arg0 key="prompt.state"/>
??? </field>
? </form>
</formset>
3.?????? 與 DispatchAction 的配合。 Struts1.1 的 DispatchAction 使得相關(guān)的 Action 的關(guān)系緊密,大大減少了應(yīng)用中 Action 的個(gè)數(shù),但是隨之而來(lái)也帶來(lái)了使用 Validation 框架的不便,不能不說(shuō)是一個(gè)遺憾。讀者也許認(rèn)為這種情況可以使用第 2 條的解決方案來(lái)解決,即采用 DyanValidatorActionForm ,然后在 Validation.xml 文件中 form 的名稱使用不同的 Actiond 的 path ,即在 validation.xml 中使用: <form name="/user.do?method=doAdd"> 、 ??? <form name="/user.do?method=doLoad"> 。然而,在目前的版本中 Validation 框架并不支持這種辨認(rèn)。一種繞過(guò)這個(gè)情況的方法是,針對(duì)同一個(gè) Action 實(shí)現(xiàn)類在 Struts-config.xml 文件中定義多個(gè) Action 的 path ,在不需要進(jìn)行驗(yàn)證的地方將 Action 的 validate 屬性置為 false 。即:
struts-config.xml :
<action attribute="editForm" path="/user" name="editForm" input="/editUser.jsp"
parameter="method" scope="request" type="foxgem.struts.UserDispatchAction"
???? validate="true">
?????????????? <forward name="load" path="/editUser.jsp"/>
?????????????? <forward name="action" path="/userquery.do?pageId=1"/>
</action>
???????
<action attribute="editForm" path="/loaduser" name="editForm" input="/editUser.jsp"
??????? ? parameter="method" scope="request" type="foxgem.struts.UserDispatchAction"
??????? ? validate="false">
?????????????? <forward name="load" path="/editUser.jsp"/>
?????????????? <forward name="action" path="/userquery.do?pageId=1"/>
</action>
然后在
validation.xml
文件中使用
2
的方法。
結(jié)束語(yǔ)
?????? 總的說(shuō)來(lái), validation 框架大大的提高了頁(yè)面驗(yàn)證的開(kāi)發(fā)效率,更吸引人的是這些驗(yàn)證方法可通過(guò)自定義的 validator 來(lái)得到復(fù)用。使得這些驗(yàn)證代碼更加集中,可維護(hù)性得到加強(qiáng)。當(dāng)然隨著項(xiàng)目的進(jìn)行, validation.xml 和 validator-rules.xml 會(huì)隨之增長(zhǎng),這部分的維護(hù)工作加重了。
?????? 同時(shí),由于不能非常好的和 DispatchAction 一起協(xié)作,也使得大量使用 DispatchAction 的項(xiàng)目不能非常好的使用它。建議大量使用 DispatchAction 和頁(yè)面驗(yàn)證非常復(fù)雜多變的項(xiàng)目可以暫時(shí)按原來(lái)的方法來(lái)驗(yàn)證,不使用 validation 框架。
?????? 至于 validation 框架的其他詳細(xì)信息,請(qǐng)參見(jiàn) struts 的文檔,在此不再贅述。
參考資料
n???????? http://raibledesigns.com/wiki/Wiki.jsp?page=SecuringDispatchAction DispatchAction 與 validation 框架的協(xié)作解決方案來(lái)源于此。
n????????
http://otn.oracle.com/oramag/oracle/04-jan/o14dev_struts.html
Check Your Form with Validator
n????????
http://www-900.ibm.com/developerWorks/cn/java/l-struts1-1/
深入
Struts 1.1
n????????
http://javaboutique.internet.com/tutorials/Struts11Val/
Stepping through the Struts 1.1 Validator