如何从 jsp 页面中删除数据库记录?

Posted

技术标签:

【中文标题】如何从 jsp 页面中删除数据库记录?【英文标题】:How can I delete database records from a jsp page? 【发布时间】:2011-11-18 03:21:43 【问题描述】:

下面的代码是我项目的一部分,这段代码的输出是我得到了数据库中所有帖子的标题以及所有条目前面的删除超链接。当我为相应的标题单击删除时,它应该从 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>

【问题讨论】:

他们还那样编写 JSP 代码吗? 应该只从页面中删除吗?或者也来自数据库? 如果也从数据库中删除会更好.. @ring 不。非常气馁。 @ring, @andrew :尊敬的成员,我只是高级 java(jsp、servlet 等)的初学者,所以这就是我以我知道的方式编写的原因。请帮助解决查询。 【参考方案1】:

首先,您真的想在 JSP 文件中使用 JSTL 而不是“原始”java。 而且,就像前面的评论者已经提到的那样,你会把这个 现在在 servlet/控制器中的逻辑。

如果你真的喜欢用 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>

【讨论】:

当搜索机器人出现抓取链接时......再见记录! 你是绝对正确的 ;-) 只是按照原始代码。好电话。 @lauwie:谢谢你的帮助。我将正确学习 servlet 的基础知识。【参考方案2】:

创建一个带有记录 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文件中被认为是一种不好的做法,如果它是数据库交互代码肯定是这样。我建议花一些时间学习 servlet。

另见:

Our Servlets wiki page How to avoid Java code in JSP files?

【讨论】:

@BalusC:谢谢先生的所有帮助。我会好好学习 servlet。【参考方案3】:

理想的方法是将所有逻辑移至 Servlet。不推荐我在下面提到的这种方法,原因有很多,随着您获得更多经验,您将学习。但是现在让我们假设您将只使用 JSP。有很多方法可以做到这一点,但这是其中一种方法。

此方法使用两个 JSPS,第一个 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 我完全同意。这就是为什么我在帖子的开头和结尾都有免责声明。但是我假设他需要这个来学习,并且不会把它放在现场。 @kensen john:我在执行上述代码时遇到了这个错误。 javax.servlet.ServletException: java.sql.SQLException: [Microsoft][SQL Server Native Client 10.0][SQL Server]列名“primary_key_id”无效。 @user936516 我以primary_key_id为例,你必须使用包含行id的列名,特定于你正在使用的表。

以上是关于如何从 jsp 页面中删除数据库记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用asp从access数据库中删除特定记录?

jsp中如何把数据库中查询出来的数据输出到jsp页面。

如何删除 JSP 页面中的所有“\n”? (使用 javax.servlet.Filter?)

c# asp.net GridView中如何删除一条记录后刷新页面

jsp分页中,删除最后一页的记录之后怎么回到首页

如果在jsp中删除记录失败,则显示错误消息