首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Spring WebWork 大量欄位傳值:模型自動注入 (ModelDriven/ParameterInterceptor)

     編輯:程式設計疑難解答

前端 60 欄位表單提交到 Action,逐個 setXxx 極其繁瑣。WebWork (Struts 2 前身) 提供 模型驅動 與 參數攔截器 自動映射:

方案一:實作 ModelDriven<T>

public class MyAction extends ActionSupport implements ModelDriven<MyForm> {
    private MyForm form = new MyForm();
    @Override public MyForm getModel() { return form; }
    // execute() 直接用 form.getXxx()
}

前端表單欄位名與 MyForm 屬性名一致 (如 name="userName"),框架自動調用 form.setUserName(value)。

方案二:Action 直接定義屬性 (ParameterInterceptor)

public class MyAction extends ActionSupport {
    private String field1, field2, ... field60; // 60 個屬性 + getter/setter
    // 框架自動注入同名參數
}

方案三:Map 接收動態欄位

private Map<String, Object> params = new HashMap<>();
public Map<String, Object> getParams() { return params; }
// 前端 name="params['field1']" 等,自動填入 Map

前端配合 (ExtJS 2)

// 表單提交時自動序列化為 key=value&key2=value2
form.submit({
    url: 'myAction.action',
    method: 'POST',
    // ExtJS 會自動將所有 field name 作為參數提交
});

核心原理

ParametersInterceptor 遍歷 request.getParameterMap(),對 Action (或 Model) 尋找同名 setXxx 方法,透過反射調用並自動類型轉換 (OGNL)。

注意事項

  • 屬性需提供 public setter。
  • 集合/陣列欄位名需加索引:name="list[0].name"。
  • 大量欄位建議拆分為嵌套物件 (如 user.name, address.city),對應 Action 中 User user; Address address; 結構。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved