Struts 2 使用 OGNL 表達式綁定表單欄位到 Action 屬性。對於 List<POJO>,欄位名需包含索引:
items[0].propertyName
items[1].propertyName
...
<s:iterator value="items" status="stat">
<!-- 隱藏主鍵 -->
<input type="hidden" name="items[%{#stat.index}].id" value="<s:property value='id'/>" />
<!-- 可編輯欄位 -->
<input type="text" name="items[%{#stat.index}].name" value="<s:property value='name'/>" />
<select name="items[%{#stat.index}].categoryId">
<s:iterator value="categories" var="cat">
<option value="<s:property value='id'/>" <s:if test='id == top.items[#stat.index].categoryId'>selected</s:if>>
<s:property value='name'/>
</option>
</s:iterator>
</select>
</s:iterator>
public class ItemAction extends ActionSupport {
private List<Item> items = new ArrayList<>(); // 必須初始化
public List<Item> getItems() { return items; }
public void setItems(List<Item> items) { this.items = items; }
// execute()...
}
items.id(無索引) → 只能綁定單一物件。items 未初始化 → OGNL 無法建立列表元素,拋 NullPointerException。stat.index 確保連續。掌握 items[索引].屬性 命名,即可輕鬆實現列表資料的批次編輯與提交。