为什么删除功能在我的jsp文件中不起作用?

时间:2018-06-25 04:49:36

标签: java mysql jsp

我创建了一个表来显示数据,并且每个数据旁边都有一个复选框。我想创建一个函数,如果用户单击该数据的复选框并按Delete键,则该数据将从表和数据库中删除。我想出了代码,但它不会删除数据。我的代码有什么问题?

Display on Webpage

HTML

   <%
        String id = request.getParameter("hiddenID");
        String sql1="";
        {
            sql1 = "select * from exercise1";
            PreparedStatement pstmt1=conn.prepareStatement(sql1);   
            ResultSet rs1 = pstmt1.executeQuery();
            while(rs1.next()){


            String arm      = rs1.getString("Arm");
            String time1    = rs1.getString("Time1");

            out.println("<tr>");
            out.println("<td style = 'width: 20%'>");
            out.println(arm);
            out.println("</td>");
            out.println("<td style = 'width: 5%'>");
            out.println(time1);
            out.println("</td>");
        %>


        <td style="width: 5%"><input class="mychkbox" type="checkbox"
        value="<%=id%>" form="multipleDele" name="DeleteChkbox" /></td> 

        <%
            out.println("</tr>");
                }   
            conn.close();
                }
        %>

这是我的delete.jsp文件

    <%
    String[] id = request.getParameterValues("DeleteChkbox");
    int count=0;
    Connection conn = null;
    try {
        Class.forName("com.mysql.jdbc.Driver");
        // Step 2: Define Connection URL
        String connURL = "jdbc:mysql://localhost/medicloud?user=root&password=root";
        // Step 3: Establish connection to URL
        conn = DriverManager.getConnection(connURL);

        if (id != null)
        {
        for(int i=0;i<id.length;i++){
        String sqlStr = "DELETE from exercise1 WHERE id=?";
        PreparedStatement pstmt = conn.prepareStatement(sqlStr);
        pstmt.setInt(1, Integer.parseInt(id[i]));
        //pstmt.setInt(1, Integer.parseInt(id[i]));
        int rec=pstmt.executeUpdate();
        if (rec==1)
            count++;
        }
        }


            //System.out.println(functions);
%>
    <form action="exercise.jsp" method="post">
        <label><%=count%> record(s) deleted!!</label>
        <input type="submit" value="Return" name="ReturnBtn" />
    </form>
<%

        conn.close();
    } catch (Exception e) {
        out.println(e);
    }
%>

2 个答案:

答案 0 :(得分:0)

您正在写入复选框值的id不是来自数据库结果。它是通过请求参数在JSP中检索的:

String id = request.getParameter("hiddenID");

...,然后将其写入每个复选框字段:

<input class="mychkbox" type="checkbox" value="<%=id%>" form="multipleDele" name="DeleteChkbox" />

您不会为每个复选框写一个不同的ID。

因此,它可能不是任何数据库记录的ID,因此没有一个被删除。

构建HTML时,您应该在while循环中读取每个记录的id

我怀疑您需要这样的东西:

<input class="mychkbox" type="checkbox" value="<%=rs1.getString("id")%>" form="multipleDele" name="DeleteChkbox" />

答案 1 :(得分:0)

您的图像分为三列:手臂锻炼,次数和动作。 DeleteChkboox字段只会告诉您是否为特定行选择了该字段。您需要获取已选择删除的ID。未选中的复选框不会显示在一系列复选框中,因此您的表单必须考虑到这一点。它看起来应该像

<form action = "...">
    <input type="submit" value="delete">
    <input type="submit" value="assign">
    <table>
    <c:forEach items="${ records }" var="r">
        <tr>
            <td>
                ${ r.exercise }
            </td>
            <td>
                ${ r.times }
            </td>
            <td>
                <input type="checkbox" value="${ r.id }" name="userAction">
            </td>
        </tr>
    </c:forEach>
    </table>
</form>

然后,您需要更改jsp,以便获取所选行的ID。将迭代ID的jsp部分更改为

<%
    // get array of ids
    String[] ids = request.getParameterValues("userAction");

    int count=0;
    Connection conn = null;
    try {
        Class.forName("com.mysql.jdbc.Driver");
        // Step 2: Define Connection URL
        String connURL = "jdbc:mysql://localhost/medicloud?user=root&password=root";
        // Step 3: Establish connection to URL
        conn = DriverManager.getConnection(connURL);

        if (ids != null) {
            for(int i=0; i < ids.length; i++) {
                String sqlStr = "DELETE from exercise1 WHERE id=?";
                PreparedStatement pstmt = conn.prepareStatement(sqlStr);

                pstmt.setInt(1, Integer.parseInt(ids[i]));

                int rec=pstmt.executeUpdate();
                if (rec==1) {
                    count++;
                }
            }
        }
    }

%>

此外,如果可以帮助的话,在jsps中运行sql更新通常不是最好的主意。考虑将这种逻辑移至控制器类,并使用jsp层进行演示。

编辑

根据您的评论“它不起作用”,您不必看这个特定的问题(为什么您编写的代码不能删除数据),您必须查看更大的图景:您要解决的问题是什么完成吗?

用简单的英语看起来像这样:

  1. 向用户显示一组记录
  2. 允许用户标记要删除的记录(复选框数组);允许用户提交此信息(记录ID)
  3. 处理(删除)提交的ID

第1步

遍历<form>元素内jsp中的记录列表 对于每条记录,创建一个复选框,其值为该记录的ID

第2步

添加一个删除按钮,允许用户提交ID形式

第3步

处理提交的信息:获取在请求中提交的ID列表,对其进行迭代,并逐个删除记录

您坚持哪一步?