posts - 495,comments - 227,trackbacks - 0

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

posted on 2006-08-17 19:51 SIMONE 阅读(708) 评论(0)  编辑  收藏 所属分类: struts