我有一个关于如何使用JSTL和java servlet更新数据库中特定记录的问题。
好的调用一条记录,我使用servlet运行查询以使用这种格式填充jsp页面。
ResultSet results = getRecords.executeQuery(); //run database query
Result result = ResultSupport.toResult(results);
request.setAttribute("result", result);
RequestDispatcher rd = request.getRequestDispatcher("/showReport.jsp"); //redirect to this page with query info
rd.forward(request, response);
在jsp页面中,我使用这种格式填充页面 行号对应于查询运行方式的值的索引。
<c:forEach var="row" items="${result.rowsByIndex}">
<form action = "/runthis/servlet?id=${row[0]}" method = "get" >
Employee Name<input type="text" value="<c:out value="${row[2]}"/>" />
Department<select>
<option value="<c:out value="${row[4]}"/>"><c:out value="${row[4]}"/></option></select>
<input type="submit" value="Save">
</form>
</c:forEach>
例如,如果有人更改了员工姓名,但单独留下了部门字段,反之亦然,那我该如何处理呢?
我想我应该能够将这个表单操作踢到“更新servlet”,但如果我不需要,我宁愿不“更新”记录中的每个元素。
此外,我还在学习网络开发,所以如果你能想出一个更好的方法来预先填充东西,通过javascript或其他什么,我也愿意尝试,如果它是一个可能的解决方案。
感谢您的帮助!
答案 0 :(得分:0)
我认为你需要做这样的事情:
<c:forEach var="row" items="${result.rowsByIndex}">
<form action="/runthis/servlet" method="post">
<input type="hidden" name="id" value="<c:out value="${row[1]}"/>" />
<input type="hidden" name="EmployeeName_orig" value="<c:out value="${row[2]}"/>" />
Employee Name<input type="text" name="EmployeeName" value="<c:out value="${row[2]}"/>" />
<input type="hidden" name="Department_orig" value="<c:out value="${row[4]}"/>" />
Department
<select id="Department" name="Department">
<option value="<c:out value="${row[4]}"/>"><c:out value="${row[4]}"/></option>
</select>
<input type="submit" value="Save" />
</form>
</c:forEach>
然后,在您的更新servlet(此处称为/ runthis / servlet)中,您执行某种形式的更新员工,并设置行为id的名称和部门。请注意,我在隐藏字段中发送了ID,但也可以像我们在上面的讨论中提到的那样在网址中发送!
关于更新记录中每个元素的评论:
这可以通过不同方式完成。一种方法是首先从数据库加载记录,并比较字段以了解要更新的字段。但这需要在更新之前从数据库中额外读取。
另一种方式(我在我提出的解决方案中准备的那种方法)是隐藏字段,表单中的每个输入都有一个字段。此隐藏字段保存其输入对应项的原始值。这样,您可以将原始值与新值进行比较,而无需从数据库中读取数据。另一方面,您现在正在为每个帖子请求传输双倍数据。