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

Struts 多行表單提交:List 自動收集機制與動態擴容實現

     編輯:Java 相關知識

Struts 多行表單數據綁定難題與解決方案

在批量編輯、明細錄入等場景中,需要提交多行同結構數據。Struts 的自動屬性收集機制默認不支援 List 索引動態增長,本文提供一種通過繼承 ArrayList 實現自動擴容的優雅方案。

領域模型設計

public class TestBean {
    private List<SubTestBean> test = new ArrayList<>();
    // getter/setter
}

public class SubTestBean {
    private int id;
    private String name;
    // getter/setter
}

JSP 表單結構(假設 testBean 已放入 request)

<c:forEach items="${testBean.test}" varStatus="status">
    <input name="test[${status.index}].id" value="${item.id}"/>
    <input name="test[${status.index}].name" value="${item.name}"/>
</c:forEach>

顯示無問題,但提交時若 List 大小不足,Struts 調用 get(index) 會拋出 IndexOutOfBoundsException。

核心技巧:繼承 ArrayList 覆寫 get() 實現自動擴容

public class TestArrayList extends ArrayList<SubTestBean> {
    @Override
    public SubTestBean get(int index) {
        // 關鍵:當索引超出當前大小,自動補齊新元素
        while (index >= size()) {
            add(new SubTestBean());
        }
        return super.get(index);
    }
}

應用方式

將領域模型中的 List 初始化替換:

// 原代碼
private List<SubTestBean> test = new ArrayList<>();

// 修改為
private List<SubTestBean> test = new TestArrayList();

原理解析

  1. Struts 解析 test[3].name 時,先調用 getTest() 獲取 List。
  2. 再調用 list.get(3) 獲取第 4 個元素(若不存在則創建)。
  3. 自動擴容確保索引位置始終有對象可用,隨後調用 setName() 完成賦值。

注意:此方案適用於「提交行數 ≥ 現有行數」場景。若需支持刪除行,需結合標記字段或單獨處理刪除邏輯。

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