JSP单表单通过hidden元素传选中行数据到Servlet,删除总删首行如何解决
问题根因
你当前的写法将所有行对应的poststudentId隐藏输入框都放在同一个表单内,且所有隐藏输入框的name属性完全一致。表单提交时会把所有同名参数全部传递到后端,Servlet默认取第一个参数值,所以无论点击哪一行的操作按钮,最终拿到的都是第一行的id,导致始终删除第一行。
另外注意你的原代码有语法错误:<td>${record.Id</td>少了}闭合,正确写法是<td>${record.Id}</td>。
单表单实现方案
如果需要保留单个表单的结构,通过JS动态绑定点击事件即可实现,改动很小:
步骤1:调整JSP结构
把隐藏输入框移到c:forEach循环外部,全表单仅保留一个poststudentId隐藏框;给循环内的所有提交按钮新增data-id属性存储当前行的id:
<!-- 隐藏输入框放在循环外,全表单唯一,记得给表单加id="mainForm"方便后续JS获取 --> <input type="hidden" value="" id="poststudentId" name="poststudentId" /> <c:forEach var="record" items="${SLIST}"> <tr> <td>${record.Id}</td> <td>${record.lastName}</td> <!-- 每个按钮都用data-id存当前行id --> <td><input type="submit" value="View" name="option" class="view" data-id="${record.Id}" /></td> <td><input type="submit" value="Edit" name="option" class="Edit" data-id="${record.Id}" /></td> <td><input type="submit" value="Delete" name="option" class="Delete" data-id="${record.Id}" /></td> </tr> </c:forEach>
步骤2:添加JS点击逻辑
监听所有提交按钮的点击事件,点击时先把当前按钮对应的行id赋值给全局隐藏框,再提交表单:
const form = document.getElementById('mainForm'); const allSubmitBtns = form.querySelectorAll('input[type="submit"]'); const hiddenIdInput = document.getElementById('poststudentId'); allSubmitBtns.forEach(btn => { btn.addEventListener('click', function() { // 把当前按钮的data-id赋值给隐藏输入框 hiddenIdInput.value = this.dataset.id; // 不需要阻止默认提交,赋值后会自动提交表单 }); });
步骤3:Servlet端获取参数
后端正常取值即可:
String studentId = request.getParameter("poststudentId"); String option = request.getParameter("option"); // 拿到View/Edit/Delete操作标识 // 后续根据option和studentId处理对应逻辑即可
可选无JS替代方案(多表单)
如果不想写JS,也可以每行单独包裹一个独立表单,不需要改动后端逻辑:
<c:forEach var="record" items="${SLIST}"> <tr> <form method="post" action="你的Servlet地址"> <input type="hidden" value="${record.Id}" name="poststudentId" /> <td>${record.Id}</td> <td>${record.lastName}</td> <td><input type="submit" value="View" name="option" class="view" /></td> <td><input type="submit" value="Edit" name="option" class="Edit" /></td> <td><input type="submit" value="Delete" name="option" class="Delete" /></td> </form> </tr> </c:forEach>
内容的提问来源于stack exchange,提问作者VRR
相关产品推荐
相关产品推荐

