早期 Struts 版本需為每個表單撰寫 ActionForm 類別,僅包含 Bean 屬性與 validate()/reset() 方法,程式碼冗長且維護困難。Struts 1.1 引入 DynaBeans,透過 XML 設定動態生成表單 Bean,免除硬式編碼。
以客戶資料表單為例(欄位:姓名、地址、電話等),傳統寫法需完整定義所有屬性與驗證邏輯:
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 省略 ...
}
struts-config.xml 中以 <form-bean> 宣告屬性名稱與型別DynaBean 介面 get(name)/set(name, value) 操作validation.xml 設定,達成聲明式驗證<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>
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DynaBean dynForm = (DynaBean) form;
String lastName = (String) dynForm.get("lastName");
// 處理商業邏輯...
}
ActionForm,邊緣表單用 DynaActionForm