在批量編輯、明細錄入等場景中,需要提交多行同結構數據。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
}
<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。
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();
test[3].name 時,先調用 getTest() 獲取 List。list.get(3) 獲取第 4 個元素(若不存在則創建)。setName() 完成賦值。注意:此方案適用於「提交行數 ≥ 現有行數」場景。若需支持刪除行,需結合標記字段或單獨處理刪除邏輯。