首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Struts 動態表單應用:DynaActionForm 與 DynaBeans 實作指南

     編輯:Java 程式設計入門

背景動機

早期 Struts 版本需為每個表單撰寫 ActionForm 類別,僅包含 Bean 屬性與 validate()/reset() 方法,程式碼冗長且維護困難。Struts 1.1 引入 DynaBeans,透過 XML 設定動態生成表單 Bean,免除硬式編碼。

傳統 ActionForm 寫法範例

以客戶資料表單為例(欄位:姓名、地址、電話等),傳統寫法需完整定義所有屬性與驗證邏輯:

package article1;

import org.apache.struts.action.*;

public class CustomerForm extends ActionForm {
    // 驗證方法
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();
        if (nullOrBlank(lastName)) errors.add("lastName", new ActionError("article1.lastName.missing"));
        // ... 其他欄位驗證省略 ...
        return errors;
    }

    // 輔助方法
    protected boolean nullOrBlank(String str) {
        return (str == null || str.length() == 0);
    }

    // 七個私有屬性
    private String lastName, firstName, street, city, state, postalCode, phone;

    // 七組 getter/setter
    public String getLastName() { return lastName; }
    public void setLastName(String lastName) { this.lastName = lastName; }
    // ... 其餘 getter/setter 省略 ...
}

DynaActionForm 改寫優勢

  • 零程式碼定義表單:在 struts-config.xml 中以 <form-bean> 宣告屬性名稱與型別
  • 動態屬性存取:執行期透過 DynaBean 介面 get(name)/set(name, value) 操作
  • 整合 Validator 外掛:驗證規則移至 validation.xml 設定,達成聲明式驗證
  • 彈性擴充:新增欄位只需修改 XML,無須重新編譯 Java 類別

配置範例

<form-bean name="customerForm" type="org.apache.struts.validator.DynaValidatorForm">
    <form-property name="lastName" type="java.lang.String"/>
    <form-property name="firstName" type="java.lang.String"/>
    <form-property name="street" type="java.lang.String"/>
    <form-property name="city" type="java.lang.String"/>
    <form-property name="state" type="java.lang.String"/>
    <form-property name="postalCode" type="java.lang.String"/>
    <form-property name="phone" type="java.lang.String"/>
</form-bean>

搭配 DynaValidatorForm,驗證規則可在 validation.xml 定義:

<form name="customerForm">
    <field property="lastName" depends="required">
        <msg name="required" key="article1.lastName.missing"/>
    </field>
    <!-- 其他欄位同理 -->
</form>

Action 中取值方式

public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) {
    DynaBean dynForm = (DynaBean) form;
    String lastName = (String) dynForm.get("lastName");
    // 處理商業邏輯...
}

適用場景與注意事項

  • 適合:欄位頻繁變動、原型快速開發、大量相似表單
  • 不適合:需複雜自訂驗證邏輯、強型別編譯期檢查、效能極度敏感場合
  • 可混合使用:核心表單用傳統 ActionForm,邊緣表單用 DynaActionForm
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved