首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

深入 Struts 1.1(4)ActionForm

深入 Struts 1.1(4)ActionForm

ActionForm对于 ActionForm 你可以从以下几个方面来理解它:      
  • ActionForm 表示 HTTP 窗体中的数据,可以将其看作是模型和视图的中介,它负责保存视图中的数据供模型或者视图使用。Struts 1.1 文档中把它比作 HTTP 和 Action 之间的防火墙,这体现了 ActionForm 具有的过滤保护的作用,只有通过 ActionForm 验证的数据才能够发送到 Action 处理。
  • ActionForm 是与一个或多个 ActionConfig 关联的 JavaBean,在相应的 action 的 execute 方法被调用之前,ActionForm 会自动利用请求参数来填充自己(初始化属性)。
  • ActionForm 是一个抽象类,你必须通过继承来实现自己的类。
ActionForm 首先利用属性的 getter 和 setter 方法来实现初始化,初始化完毕后,ActionForm 的 validate 方法被调用,你可以在其中来检查请求参数的正确性和有效性,并且可以将错误信息以 ActionErrors 的形式返回到输入窗体。否则,ActionForm 将被作为参数传给 action 的 execute 方法以供使用。
ActionForm bean 的生命周期可以设置为 session(缺省)和 request,当设置为 session 时,记得在 reset 方法中将所有的属性重新设置为初始值。
由于 ActionForm 对应于 HTTP 窗体,所以随着页面的增多,你的 ActionForm 将会急速增加。而且可能同一类型页面字段将会在不同的 ActionForm 中出现,并且在每个 ActionForm 中都存在相同的验证代码。为了解决这个问题,你可以为整个应用实现一个 ActionForm 或者至少一个模块对应于一个 ActionForm。
但是,聚合的代价就是复用性很差,而且难维护。针对这个问题,在 Struts 1.1 中提出了 DynaActionForm 的概念。
DynaActionForm 类
DynaActionForm 的目的就是减少 ActionForm 的数目,利用它你不必创建一个个具体的 ActionForm 类,而是在配置文件中配置出所需的虚拟 ActionForm。例如,在下表中通过指定 <form-bean> 的 type 为"org.apache.struts.action.DynaActionForm"来创建一个动态的 ActionForm--loginForm。
1
2
3
4
5
6
7
<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 的值,可以采用类似的代码:
1
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 类似,你必须首先在配置文件中进行配置:
1
2
3
4
5
6
7
<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>




同时要定义验证的插件:
1
2
3
4
5
<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):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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。
1
2
3
4
5
<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 文件中做如下设置:      
  • 为 <html:form> 增加 onsubmit 属性
  • 设置 Javascript 支持
下表中列出了一 JSP 文件的示例代码,红字部分为 Javascript 验证所需代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<%@ 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 的内容为:
1
2
3
4
5
6
<%@ 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"/>




如果 validator-rules.xml 中定义的基本验证功能不能满足你的需求,你可以自己添加所需的验证类型。
返回列表