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

Struts 技巧:用 Map 封裝 ActionForm 一次性獲取所有表單參數

     編輯:Java 相關知識

Struts 開發中,為每個表單字段編寫 get/setXxx() 方法極其繁瑣。本文介紹一種技巧:自定義 CustomForm extends ActionForm 內部持有 Map<String, Object>,通過重寫參數設置入口 setFormvalue(String key, Object value),配合 JSP 中特殊的 property="formvalue(fieldName)" 語法,利用 Struts 反射機制實現所有表單參數自動收集到 Map,Action 中一次性取出完整參數映射,徹底告別樣板代碼。

核心原理

  • Struts 根據 property 屬性值,尋找對應的 setXxx() 方法
  • 若 property="formvalue(username)",Struts 會嘗試調用 setFormvalue("username", value)
  • 自定義 Form 實現該方法,將鍵值對存入內部 HashMap
  • Action 中調用 getFormvalueMap() 即獲取全部參數

三步實現

1. 自定義 CustomForm

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);
    }
}

2. Action 中一次性獲取

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");
    }
}

3. JSP 表單特殊語法

<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,可對應數據庫字段名或自定義標識。

Struts 配置

<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)

適用場景

  • 字段極多、頻繁變動的動態表單(如配置管理、報表參數)
  • 需要將表單數據直接轉為 Map 交給通用 Service 處理
  • 原型開發、快速迭代階段

對於核心穩定業務表單,仍建議使用標準 ActionForm 獲得類型安全與框架級驗證支持。此技巧作為工具箱補充,關鍵時刻大幅提效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved