JSP 頁面通過 <c:forEach> 遍歷列表渲染表格,每行包含「修改」「刪除」操作。點擊操作時,後端需要知道是哪一行的數據(如管理員 ID)。

在每行的操作列放置一個表單,隱藏域存儲該行唯一標識(ID),提交時自動攜帶。
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<table class="data-table">
<thead>
<tr><th>管理員名稱</th><th>郵箱</th><th>操作</th></tr>
</thead>
<tbody>
<c:forEach items="${adminList}" var="admin">
<tr>
<td>${admin.name}</td>
<td>${admin.email}</td>
<td>
<!-- 修改表單 -->
<form action="editAdmin" method="get" style="display:inline;">
<input type="hidden" name="id" value="${admin.id}" />
<button type="submit" class="btn-edit">修改</button>
</form>
<!-- 刪除表單 -->
<form action="deleteAdmin" method="post" style="display:inline;" onsubmit="return confirm('確定刪除?');">
<input type="hidden" name="id" value="${admin.id}" />
<button type="submit" class="btn-del">刪除</button>
</form>
</td>
</tr>
</c:forEach>
</tbody>
</table>
@Controller
@RequestMapping("/admin")
public class AdminController {
@GetMapping("/editAdmin")
public String edit(@RequestParam("id") Long id, Model model) {
Admin admin = adminService.findById(id);
model.addAttribute("admin", admin);
return "admin/form"; // 跳轉編輯頁
}
@PostMapping("/deleteAdmin")
public String delete(@RequestParam("id") Long id, RedirectAttributes ra) {
adminService.deleteById(id);
ra.addFlashAttribute("msg", "刪除成功");
return "redirect:/admin/list";
}
}
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 隱藏域 + 表單提交 | RESTful、無 JS 依賴、安全(POST 刪除)、瀏覽器原生支持 | 頁面較多 form 標簽 | 傳統 MVC、安全要求高 |
| JS 綁定點擊事件 + AJAX | 無刷新體驗好、可批量操作 | 需處理 CSRF、JS 錯誤導致功能失效 | 前後端分離、富交互頁面 |
鏈接攜帶參數 <a href="del?id=1"> | 簡單 | GET 請求刪除不安全、暴露 ID、易被爬蟲誤觸發 | 僅查看詳情等安全操作 |
| data-* 屬性 + JS 取值 | HTML 乾淨 | 依賴 JS、需防 XSS | Vue/React 等前端框架 |
@EnableWebSecurity 自動驗證 Token)。deleted=1),保留審計日誌。