javascript 支持
?????? 在 web 應用中,使用 javascript 的機會非常多。雖然不少書上提及客戶有可能從瀏覽器關閉 js 的執行,但是要想完全的不使用它,目前看來好像還不行。比如一些復雜的 UI 是必須通過 js 來實現的(如下拉式菜單等等)。那么 validation 框架支不支持客戶端的 js 驗證呢?
答案是:當然。具體做法是:
-????????? 在頁面 html:form 標簽內部添加 onsubmit="return validateEditForm(this);" (具體的語法: validate+ 在 validation.xml 文件中定義的 form 的名字);如:
<html:form action="<%=action%>" method="post" onsubmit="return validateEditForm(this);">
-?????????
在
html:form
內部塊中添加:
<html:javascript formName="editForm"/>
?????? 如此 2 步即可。雖然, validation 框架非常簡單易用,但是還是有需要注意的地方。
使用注意
1.?????? 使用 validation 框架后, form 必須從 ValidatorForm 中派生,同時必須在你的 validate 方法中先調用基類的 validate 方法。對于使用 Dyna 開頭的方法來創建 formbean 的讀者,你也必須改為以 dyna 開頭含有 validator 的 form 。
2.?????? 注意 DynaValidatorForm ( ValidatorForm )和 DynaValidatorActionForm ( ValidatorActionForm )的區別。剛開始時從幫助中沒看明白這 2 者的區別,后來從網上一篇文章中得到了用法的區別。前者主要的視角是 formbean ,而后者的視角是 action 。
當 formbean 被不同的 action 使用時,對于不同的 action 而言,使用的 formbean 的屬性集合有大有小。此時如果仍然以 formbean 為主體,會造成其他 action 的不正常使用。因此, struts 中提出了 DynaValidatorActionForm ( ValidatorActionForm )。此時在 validation.xml 中的 form 標簽的 name 屬性改為 action 的 path 屬性,又由于 action 中有 attribute 和 name 屬性, validation 框架就可根據這個 action 得到對應的 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 使得相關的 Action 的關系緊密,大大減少了應用中 Action 的個數,但是隨之而來也帶來了使用 Validation 框架的不便,不能不說是一個遺憾。讀者也許認為這種情況可以使用第 2 條的解決方案來解決,即采用 DyanValidatorActionForm ,然后在 Validation.xml 文件中 form 的名稱使用不同的 Actiond 的 path ,即在 validation.xml 中使用: <form name="/user.do?method=doAdd"> 、 ??? <form name="/user.do?method=doLoad"> 。然而,在目前的版本中 Validation 框架并不支持這種辨認。一種繞過這個情況的方法是,針對同一個 Action 實現類在 Struts-config.xml 文件中定義多個 Action 的 path ,在不需要進行驗證的地方將 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
的方法。
結束語
?????? 總的說來, validation 框架大大的提高了頁面驗證的開發效率,更吸引人的是這些驗證方法可通過自定義的 validator 來得到復用。使得這些驗證代碼更加集中,可維護性得到加強。當然隨著項目的進行, validation.xml 和 validator-rules.xml 會隨之增長,這部分的維護工作加重了。
?????? 同時,由于不能非常好的和 DispatchAction 一起協作,也使得大量使用 DispatchAction 的項目不能非常好的使用它。建議大量使用 DispatchAction 和頁面驗證非常復雜多變的項目可以暫時按原來的方法來驗證,不使用 validation 框架。
?????? 至于 validation 框架的其他詳細信息,請參見 struts 的文檔,在此不再贅述。
參考資料
n???????? http://raibledesigns.com/wiki/Wiki.jsp?page=SecuringDispatchAction DispatchAction 與 validation 框架的協作解決方案來源于此。
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