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

JSP Servlet MySQL 實作:Checkbox 批次審核功能完整解決方案

     編輯:程式設計綜合問答

開發者需實作「從 MySQL 讀取資料顯示於 JSP 表格,每列含 Checkbox 供審核勾選,提交時將勾選值批次更新資料庫」。本文提供完整架構設計、代碼範例與關鍵技術點解析。

核心架構設計

資料庫表結構

CREATE TABLE items (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    status TINYINT DEFAULT 0 COMMENT '0:待審核 1:通過 2:拒絕',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

關鍵技術點:Checkbox 值綁定與批次獲取

環節關鍵代碼說明
JSP 顯示<input type="checkbox" name="ids" value="<%=item.getId()%>">value 必須綁定資料庫主鍵 ID
Servlet 獲取String[] ids = request.getParameterValues("ids");必須用 getParameterValues 獲取陣列,單值用 getParameter 只會取第一個
批次更新UPDATE items SET status=1 WHERE id IN (?,?,...)使用 PreparedStatement 批次處理或 IN 查詢,防止 SQL 注入

完整代碼實作

1. 實體類

public class Item {
    private int id;
    private String name;
    private int status; // 0待審 1通過 2拒絕
    // getter/setter/toString
}

2. DAO 層

public class ItemDAO {
    // 查詢所有
    public List findAll() { /* JDBC 查詢 */ }
    
    // 批次審核通過
    public int batchApprove(String[] ids) throws SQLException {
        if (ids == null || ids.length == 0) return 0;
        String placeholders = String.join(",", Collections.nCopies(ids.length, "?"));
        String sql = "UPDATE items SET status=1 WHERE id IN (" + placeholders + ")";
        try (Connection conn = getConnection();
             PreparedStatement ps = conn.prepareStatement(sql)) {
            for (int i = 0; i < ids.length; i++) {
                ps.setInt(i + 1, Integer.parseInt(ids[i]));
            }
            return ps.executeUpdate();
        }
    }
}

3. Servlet 控制器

@WebServlet("/item/*")
public class ItemServlet extends HttpServlet {
    private ItemDAO dao = new ItemDAO();
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        String action = req.getPathInfo(); // /list, /approve
        if ("/list".equals(action)) {
            req.setAttribute("items", dao.findAll());
            req.getRequestDispatcher("/WEB-INF/views/item_list.jsp").forward(req, resp);
        }
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        String[] ids = req.getParameterValues("ids");
        int count = dao.batchApprove(ids);
        req.setAttribute("message", "成功審核 " + count + " 筆資料");
        doGet(req, resp); // 重導向列表頁
    }
}

4. JSP 視圖 (item_list.jsp)

<form method="post" action="<%=request.getContextPath()%>/item/approve">
<table class="table">
    <thead>
        <tr><th>選取</th><th>ID</th><th>名稱</th><th>狀態</th></tr>
    </thead>
    <tbody>
        <c:forEach items="${items}" var="item">
        <tr>
            <td><input type="checkbox" name="ids" value="${item.id}" 
                ${item.status == 1 ? 'disabled checked' : ''}></td>
            <td>${item.id}</td>
            <td>${item.name}</td>
            <td>${item.status == 0 ? '待審核' : (item.status == 1 ? '已通過' : '已拒絕')}</td>
        </tr>
        </c:forEach>
    </tbody>
</table>
<button type="submit" class="btn btn-primary">批次審核通過</button>
</form>

進階優化建議

  • 全選/反選:jQuery $('[name="ids"]').prop('checked', this.checked)
  • 狀態標識:已審核項目自動 disabled+checked,防止重複提交
  • 事務控制:批次更新包裝在 Transaction 中,確保原子性
  • 分頁查詢:大量資料時加入 PageHelper 或手寫 LIMIT/OFFSET
  • CSRF 防護:表單加入隱藏 Token,Servlet 驗證

常見錯誤避坑指南

錯誤後果修正
Checkbox 無 value 屬性提交空字串,無法識別 ID必須 value="${item.id}"
用 getParameter("ids")只取到第一個勾選值必須 getParameterValues("ids")
直接拼接 SQLSQL 注入風險使用 PreparedStatement 佔位符
未檢查 ids 為 null無勾選時拋 NPE判空後再處理

總結

Checkbox 批次操作核心在於:JSP 綁定 ID 到 value、Servlet 用 getParameterValues 獲取陣列、DAO 批次 SQL 更新。掌握這三步,配合 JSTL/EL 表達式簡化視圖,即可實作穩健的審核功能。

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