我该如何在JSP页面上删除数据库记录?

3

以下是我项目中的一部分代码,它的输出结果是获取数据库中所有文章的标题,并在每个条目前面放置一个删除超链接。当我点击相应标题的删除链接时,该文章应该从JSP页面中被删除。我应该如何编写这段代码?

<label><h3>Post published:</h3></label>
      <%
               rs = stmt.executeQuery("select title from Postdata");
       %>

                <table id="rounded-corner" summary="all posts">

                    <tbody>
                        <% while (rs.next()) {%>
                        <tr>
                            <td>
                                <%=rs.getString(1)%>
                            </td>
                            <td>

                                <a href><%=""%>Delete</a>
                            </td>
                        </tr>
                        <%}%>
                    </tbody>
                </table>

Screen shot of this code


2
他们还用那种方式编写JSP吗? - ring bearer
应该只从页面中删除还是也从数据库中删除? - Mikita Belahlazau
最好也从数据库中删除它。 - code_freak
@ring 不行。强烈不建议。 - Andrew
@ring,@andrew:尊敬的成员们,我只是一个高级Java(JSP、Servlet等)的初学者,所以我写出了我所知道的方式。请帮忙解决这个问题。 - code_freak
显示剩余2条评论
3个回答

4

首先,您真的希望在JSP文件中使用JSTL而不是“原始”Java。另外,正如上一个评论者已经提到的,您应该将此逻辑放在servlet/controller中。

如果您真的想要在JSP中完成这个操作,代码应该类似于以下内容(使用JSTL):

<sql:setDataSource var="ds" ... />
<c:set var="title" value="${param['title']}"/>

<sql:update dataSource="${ds}">
   DELETE FROM Postdata where title = ?
   <sql:param value="${title}" />
</sql:update>

当您创建链接时,请按照以下方式进行:

<td><a href="?title=[title to remove]">Delete</a></td>

3
当搜索机器人来到并爬行这些链接时……再见记录! - BalusC
1
你说得完全正确 ;-)只是按照原始代码操作。做得好。 - lauwie
@lauwie:谢谢您的帮助。我会好好学习Servlet的基础知识。 - code_freak

4
创建一个具有隐藏输入值的记录 ID 和提交按钮的 POST 表单。我假设你的表格有一个 id 列,并且你已经选择了它。
<form action="delete" method="post">
    <input type="hidden" name="id" value="<%=rs.getLong("id")%>" />
    <input type="submit" value="Delete" />
</form>

在servlet中(或者如果你真的需要它的话,可以在JSP中),只需作为请求参数获取ID即可。
String id = request.getParameter("id");

那么就执行您的JDBC操作即可。
preparedStatement = connection.prepareStatement("DELETE FROM PostData WHERE id = ?");
preparedStatement.setLong(1, Long.valueOf(id));
preparedStatement.executeUpdate();

与具体问题无关,将Java代码放在JSP文件中被认为是一种不良的实践,尤其是含有数据库交互代码。我建议花些时间学习Servlets。

另请参阅:


@ BalusC:非常感谢您的帮助,我会好好学习Servlets的。 - code_freak

2
理想的方法是将所有逻辑移动到一个Servlet中。我下面提到的这种方法出于许多原因不建议使用,随着你获得更多经验,你会了解到这些原因。但是现在让我们假设你只使用JSP。有许多方法可以做到这一点,但这是其中一种方法。
这种方法使用两个JSP文件,第一个JSP用于显示记录。第二个JSP是一个处理JSP,它将为您执行删除操作。
以下是详细信息。
第一个JSP将显示记录。 当单击“删除”时,将调用第二个JSP。
第二个JSP将删除记录,然后重定向回第一个JSP。这是一种非常低效的方式,不建议使用。但它快速而且简单,并且可以节省创建Servlet、Java文件等的时间。
JSP1.jsp将具有与您发布的代码相同的代码。还要检索记录的主键。这将用于标识需要删除的记录。此ID将作为参数传递给第二个JSP。
<%
      rs = stmt.executeQuery("select primary_key_id, title from Postdata");
%>
  <table id="rounded-corner" summary="all posts">

     <tbody>
        <% while (rs.next()) {
             String primaryKey = rs.getString(1);
        %>
         <tr>
             <td>
                <%=rs.getString(2)%>
             </td>
             <td>

                 <a href ="JSP2.jsp?deleteid=<%=primaryKey%>">Delete</a>
              </td>
          </tr>
          <%}%>

        </tbody>
     </table>

JSP2.jsp
从请求中获取参数,然后执行该ID的删除查询。然后重定向回JSP1。

<%
    String recordToDelete = request.getParameter("deleteid");

    // Use PreparedStatements here instead of Statment
    rs = stmt.executeQuery("delete from Postdata where primary_key_id="+ recordToDelete );

     response.sendRedirect("JSP1.jsp"); // redirect to JSP one, which will again reload.
%>

这种方法不被推荐,但你可以了解需要做什么。


当搜索机器人来爬取链接时...再见记录! - BalusC
@BalusC 我完全同意。这就是为什么我在帖子的开头和结尾都有免责声明的原因。然而,我假设他需要这个来学习,并不会将其实际应用。 - kensen john
@kensen john:当我执行以上代码时,出现了以下错误。javax.servlet.ServletException: java.sql.SQLException: [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid column name 'primary_key_id'。 - code_freak
@user936516 我使用primary_key_id作为示例,你必须使用保存行ID的列名,具体取决于你正在使用的表格。 - kensen john

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接