DynaValidatorForm类和DynaActionForm类

来源:互联网 发布:绍兴黄酒 知乎 编辑:程序博客网 时间:2024/05/16 11:04

 

DynaActionForm类

DynaActionForm的目的就是减少ActionForm的数目,利用它你不必创建一个个具体的ActionForm类,而是在配置文件中配置出所需的虚拟ActionForm。例如,在下表中通过指定<form-bean>的type为"org.apache.struts.action.DynaActionForm"来创建一个动态的ActionForm--loginForm。

<form-beans> <form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="actionClass" type="java.lang.String"/> <form-property name="username" type="java.lang.String"/> <form-property name="password" type="java.lang.String"/> </form-bean> </form-beans>

动态的ActionForm的使用方法跟普通的ActionForm相同,但是要注意一点。普通的ActionForm对象需要为每个属性提供getter和setter方法,以上面的例子而言,我们需要提供getUsername() 和 setUsername()方法取得和设置username属性,同样地有一对方法用于取得和设置password属性和actionClass属性。

如果使用DynaActionForm,它将属性保存在一个HashMap类对象中,同时提供相应的get(name) 和 set(name)方法,其中参数name是要访问的属性名。例如要访问DynaActionForm中username的值,可以采用类似的代码:

String username = (String)form.get("username");

由于值存放于一个HashMap对象,所以要记得对get()方法返回的Object对象做强制性类型转换。正是由于这点区别,如果你在Action中非常频繁地使用ActionForm对象,建议还是使用普通的ActionForm对象。

在Struts 1.1中,除了DynaActionForm以外,还提供了表单输入自动验证的功能,在包org.apache.struts.validator中提供了许多有用的类,其中最常见的就是DynaValidatorForm类。

 

DynaValidatorForm类

DynaValidatorForm是DynaActionForm的子类,它能够提供动态ActionForm和自动表单输入验证的功能。和使用DynaActionForm类似,你必须首先在配置文件中进行配置:

<form-beans> <form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm">     <form-property name="actionClass" type="java.lang.String"/>           <form-property name="username" type="java.lang.String"/>     <form-property name="password" type="java.lang.String"/>     </form-bean></form-beans>

同时要定义验证的插件:

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

其中的validator.xml和validator-rules.xml分别表示验证定义和验证规则的内容(可以合并在一起),比如针对上例中的DynaValidatorForm,我们有如下验证定义(validator.xml):

<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE form-validation PUBLIC    "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"    "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd"><!--      Validation Rules      $Id: validation.xml--><form-validation>    <!-- ========== Default Language Form Definitions ===================== --><formset>     <form name="loginForm">           <field property="username" depends="required, minlength,maxlength">      <arg0     key="prompt.username"/>                 <arg1     key="${var:minlength}" name="minlength" resource="false"/>              <arg2     key="${var:maxlength}" name="maxlength" resource="false"/>                     <var>                        <var-name>maxlength</var-name>            <var-value>16</var-value>                </var>                 <var>              <var-name>minlength</var-name>             <var-value>3</var-value>                </var>             </field>           <field property="password" depends="required, minlength,maxlength" bundle="alternate">                 <arg0     key="prompt.password"/>          <arg1     key="${var:minlength}" name="minlength" resource="false"/>                 <arg2     key="${var:maxlength}" name="maxlength" resource="false"/>         <var>                      <var-name>maxlength</var-name>             <var-value>16</var-value>               </var>                 <var>              <var-name>minlength</var-name>       <var-value>3</var-value>              </var>              </field>       </form>     </formset></form-validation>

从上述定义中,我们可以看到对于字段username有三项验证:required, minlength, maxlength,意思是该字段不能为空,而且长度在3和16之间。而validator-rules.xml文件则可以采用Struts提供的缺省文件。注意在<form-bean>中定义的form是如何与validation.xml中的form关联起来的。最后,要启动自动验证功能,还需要将Action配置的validate属性设置为true。

<action path="/login"    type="com.ncu.test.LoginAction"name="loginForm"            scope="request"           input="tile.userLogin"validate="true">

此时,Struts将根据xml配置文件中的定义来检验表单输入,并将不符合要求的错误信息输出到页面。但是你可能会想:这个功能虽然好,可是什么检验都跑到服务器端执行,效率方面和用户易用性方面是不是有些问题?你可能会怀念起那简单的JavaScript客户端验证。

不用担心,在Struts 1.1中也支持JavaScript客户端验证。如果你选择了客户端验证,当某个表单被提交以后,Struts 1.1启动客户端验证,如果浏览器不支持JavaScript验证,则服务器端验证被启动,这种双重验证机制能够最大限度地满足各种开发者的需要。 JavaScript验证代码也是在validator-rules.xml文件中定义的。要启动客户端验证,你必须在相应的JSP文件中做如下设置:

  1. 为<html:form>增加onsubmit属性
  2. 设置Javascript支持

 

下表中列出了一JSP文件的示例代码,红字部分为Javascript验证所需代码。

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><table bgcolor="#9AFF9A" cellspacing="0" cellpadding="10" border="1" width="100%"> <tr> <td>  <table cellspacing="0" cellpadding="0" border="0" width="100%">  <tr bgcolor="#696969">     <td align="center">           <font color="#FFFFFF">Panel 3: Profile</font>        </td>    </tr>  <tr>        <td><br>     <html:errors/>        <html:form action="/login.do" focus="username"    onsubmit="return validateLoginForm(this);">        <html:hidden property="actionClass"/>         <center>            <table>             <tr>               <td>UserName:</td>          <td><html:text property="username" size="20"/></td>      </tr>      <tr>         <td>Password:</td>          <td><html:password property="password" size="20"/></td>           </tr>         <tr>         <td colspan=2><html:submit property="submitProperty" value="Submit"/></td>           </table>         </center>        </html:form>     <html:javascript formName="loginForm" dynamicJavascript="true" staticJavascript="false"/>      <script language="Javascript1.1" src="staticJavascript.jsp"></script>     </td>  </tr>  </table> </td> </tr></table>

其中onsubmit的值为"return validateLoginForm(this);",它的语法为:

return validate + struts-config.xml中定义的form-bean名称 + (this);

staticJavascript.jsp的内容为:

<%@ page language="java" %><%-- set document type to Javascript (addresses a bug in Netscape according to a web resource --%><%@ page contentType="application/x-javascript" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><html:javascript dynamicJavascript="false" staticJavascript="true"/>