Struts 開發中,為每個表單字段編寫 get/setXxx() 方法極其繁瑣。本文介紹一種技巧:自定義 CustomForm extends ActionForm 內部持有 Map<String, Object>,通過重寫參數設置入口 setFormvalue(String key, Object value),配合 JSP 中特殊的 property="formvalue(fieldName)" 語法,利用 Struts 反射機制實現所有表單參數自動收集到 Map,Action 中一次性取出完整參數映射,徹底告別樣板代碼。
property 屬性值,尋找對應的 setXxx() 方法property="formvalue(username)",Struts 會嘗試調用 setFormvalue("username", value)HashMapgetFormvalueMap() 即獲取全部參數package com.jacktan.struts.formbean;
import java.util.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
public class CustomForm extends ActionForm {
private Map formvalueMap = new HashMap();
public void setFormvalueMap(Map m) { this.formvalueMap = m; }
public Map getFormvalueMap() { return this.formvalueMap; }
// 關鍵:Struts 反射調用此方法
public void setFormvalue(String key, Object value) {
formvalueMap.put(key, value);
}
public Object getFormvalue(String key) {
return formvalueMap.get(key);
}
}
package com.jacktan.struts.action;
import java.util.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import com.jacktan.struts.formbean.CustomForm;
public class CustomAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
Map formValues = ((CustomForm) form).getFormvalueMap();
// formValues 即包含所有提交參數
return mapping.findForward("Success");
}
}
<html:form action="login">
<html:text property="formvalue(username)" size="12" maxlength="12"/>
<html:password property="formvalue(password)" size="12" maxlength="12" redisplay="false"/>
<html:submit value="登錄"/>
</html:form>
property="formvalue(username)" 中的 username 將作為 Map 的 key,可對應數據庫字段名或自定義標識。
<form-beans>
<form-bean name="CustomForm" type="com.jacktan.struts.formbean.CustomForm"/>
</form-beans>
<action-mappings>
<action path="/login" type="com.jacktan.struts.action.CustomAction"
name="CustomForm" scope="request">
<forward name="login" path="main.jsp"/>
</action>
</action-mappings>
Set set = formValues.entrySet();
Iterator it = set.iterator();
while (it.hasNext()) {
Map.Entry me = (Map.Entry) it.next();
System.out.println("Key: " + me.getKey() + ", Value: " + me.getValue());
}
Tomcat 控制台將打印所有提交參數,也可接入 Log4j 記錄。
| 優點 | 缺點/注意事項 |
|---|---|
| 消除大量 getter/setter 樣板代碼 | 失去編譯期類型檢查,key 拼寫錯誤運行時才發現 |
| 動態表單、字段可變場景極其友好 | 無法使用 Struts 內置 validate() 機制(需自行實現) |
| Action 代碼極簡潔,參數傳遞靈活 | JSP 寫法非常規,團隊需統一認知 |
| 天然支持動態字段、批量處理 | 類型轉換需自行處理(Map 存 Object) |
對於核心穩定業務表單,仍建議使用標準 ActionForm 獲得類型安全與框架級驗證支持。此技巧作為工具箱補充,關鍵時刻大幅提效。