【问题标题】:Updating database record after displaying to user显示给用户后更新数据库记录
【发布时间】:2012-01-06 18:00:31
【问题描述】:

我有一个关于如何使用 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 或其他方式,我也愿意尝试,如果它是一个可能的解决方案。

感谢您的帮助!

【问题讨论】:

  • 5 件事:1) 干得好!数据库逻辑和前端 jsp 之间的分离 :) 2) 孤独-tag? 3) input-tag 不会自行关闭。 4) 如何提交您将生成的这些表格之一?站在文本字段中按?因为,你知道,没有提交按钮;) 5)为什么你的表单标签上没有方法属性?
  • 1) 谢谢,我最初是开始学习这个做脚本的,后来才知道这是过时的错误方法 :D 2) 已修复,谢谢,正在快速复制粘贴,但我没有删除足够的内容3) 已修复 4) 添加了提交按钮,很好的观察 :) 5) 添加了 get 方法(不确定是 get 还是 post)
  • 过时与否,有分离。我相信分离!在这种情况下我会使用 post ,因为您要写入数据,而不是读取它:) 新问题!当servlet(/runthis/servlet)获取表单数据时,servlet如何知道数据库中的哪一行要更新?
  • 啊,我也应该补充一下。我通常通过向 /runthis/servlet?id=${row[x]} 中调用的 servlet 传递参数来做到这一点,并在该 servlet 中使用 request.getParamater 获取该值(id)以运行和检索适当的行/查询。
  • 好计划!最后一个问题(我认为):选择/选项列表是否真的正确填充?现在在我看来,每个员工只能有一个选择,而且他们已经在同一个部门。你试过那个部分了吗?

标签: java servlets jstl


【解决方案1】:

我认为你需要这样做:

<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,但它也可以在您在上面讨论中提到的 url 中发送!

关于更新记录中每个元素的评论:

这可以通过不同的方式完成。一种方法是先从数据库加载记录,然后比较字段以了解要更新的字段。但这需要在更新之前从数据库中额外读取。

另一种方法(我在我提出的解决方案中准备的方法)是隐藏字段,一个用于表单中的每个输入。此隐藏字段保存其输入对应项的原始值。这样,您可以将原始值与新值进行比较,而无需从数据库中读取。另一方面,您现在正在为每个发布请求通过线路传输双倍的数据量。

【讨论】:

  • 谢谢你,很抱歉回复晚了,这有助于解决问题。有时我认为您只需要与另一个人推理即可使其发挥作用。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
相关资源
最近更新 更多