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

Struts2 接收前端傳遞的對象集合:實體類聲明 List 屬性即可自動封裝

     編輯:程式設計綜合問答

問題背景

頁面需批量提交多個對象(如訂單明細行),傳統做法在 Action 聲明 String[] ids 接收主鍵數組,現希望直接接收 List<OrderItem> 對象集合。

解決方案:OGNL 表達式自動裝配

1. 實體類定義

public class Order {
    private List items = new ArrayList<>(); // 必須初始化
    // getter/setter
}

public class OrderItem {
    private Long productId;
    private Integer quantity;
    private BigDecimal price;
    // getter/setter
}

2. JSP 頁面命名規範

<c:forEach items="${order.items}" varStatus="vs">
  <input name="items[${vs.index}].productId" value="${item.productId}" />
  <input name="items[${vs.index}].quantity" value="${item.quantity}" />
  <input name="items[${vs.index}].price" value="${item.price}" />
</c:forEach>

關鍵點:name="items[0].productId"、name="items[1].productId"… OGNL 會自動按索引實例化 OrderItem 並注入屬性。

3. Action 接收

public class OrderAction extends ActionSupport {
    private Order order = new Order(); // 必須初始化
    // getter/setter

    public String save() {
        // order.getItems() 已自動封裝好 List
        orderService.save(order);
        return SUCCESS;
    }
}

進階:動態新增行(JS + 索引管理)

let idx = ${fn:length(order.items)}; // 初始索引
$('#addRow').click(() => {
  const html = `
    <tr>
      <td><input name="items[${idx}].productId" /></td>
      <td><input name="items[${idx}].quantity" type="number" /></td>
      <td><input name="items[${idx}].price" type="number" step="0.01" /></td>
    </tr>`;
  $('#itemTable tbody').append(html);
  idx++;
});

常見坑點

現象原因解決
List 為 null實體類未初始化集合private List<T> list = new ArrayList<>();
索引不連續導致漏數據刪除行後索引斷層提交前 JS 重排索引或用 items[${vs.index}] 由 JSTL 生成
類型轉換失敗前端傳 "abc" 給 Integer配置 TypeConverter 或前端校驗

最佳實踐總結

  1. ✅ 實體類集合屬性 必須初始化
  2. ✅ 頁面輸入框 name 遵循 listName[index].property 規範
  3. ✅ 動態行由前端維護連續索引,或後端接收 Map<Integer, T> 兼容稀疏索引
  4. ✅ 大量數據考慮分頁提交或 AJAX 批量保存,避免請求體過大

總結

Struts2 強大的 OGNL 表達式引擎讓「對象集合自動封裝」變得極其簡單:實體類聲明 List + 頁面按索引命名,框架其餘自動完成。掌握此模式,徹底告別手動解析數組、逐個 set 的樣板代碼。

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