通过复选框和提交按钮删除mysql多条记录

通过复选框和提交按钮删除mysql多条记录,mysql,jsp,servlets,checkbox,submit,Mysql,Jsp,Servlets,Checkbox,Submit,我无法使用我应用程序的这一部分。我必须从jsp页面中删除mysql数据库中的一些记录(从DB正确加载),选中复选框并单击submit按钮。 即使数据显示正确,也不会从数据库中删除任何内容 代码如下: 这是课程 /* ArticoliManager.java */ public class ArticoliManager { public void cancellaArticolo(String chboxArticoliDaCancellare[]) throws SQLException{

我无法使用我应用程序的这一部分。我必须从jsp页面中删除mysql数据库中的一些记录(从DB正确加载),选中复选框并单击submit按钮。 即使数据显示正确,也不会从数据库中删除任何内容 代码如下:

这是课程

/* ArticoliManager.java */
public class ArticoliManager {

public void cancellaArticolo(String chboxArticoliDaCancellare[]) throws SQLException{
Connection con = DBConnectionPool.getConnection();
PreparedStatement ps = null;
try {
    for(String deleteThem:chboxArticoliDaCancellare){
    String query = "DELETE * FROM articoli WHERE id='"+deleteThem+"'";
    ps = con.prepareStatement(query);
    ps.executeUpdate();
    con.commit();
}
}
finally {
    if (ps != null) {
        try {
            ps.close();
        }
        catch (SQLException ignored) {
        }
    }
    try {
        con.close();
    }
    catch (SQLException ignored) {
    }
}

}
}
这是servlet

/* CancellaArticolo.java
*/
public class CancellaArticoloServlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException, SQLException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    HttpSession session = request.getSession();
    int idArticoloDaCancellare = 0;
    try {
        ArticoliManager am = new ArticoliManager();
        String chboxArticoliDaCancellare[] = request.getParameterValues("chbox");
        am.cancellaArticolo(chboxArticoliDaCancellare);
        request.getRequestDispatcher("gestione_admin.jsp").forward(request, response);
    } finally {            
        out.close();
    }
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    try {
        processRequest(request, response);
    } catch (SQLException ex) {
        Logger.getLogger(CancellaArticoloServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
}

/** 
 * Handles the HTTP <code>POST</code> method.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    try {
        processRequest(request, response);
    } catch (SQLException ex) {
        Logger.getLogger(CancellaArticoloServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
}

/** 
 * Returns a short description of the servlet.
 * @return a String containing servlet description
 */
@Override
public String getServletInfo() {
    return "Short description";
}// </editor-fold>
这是jsp页面的一部分

/* gestione_admin.jsp */
<%    
                            for (int i=0; i<al.size(); i++){
                            out.println("<table>");
                            out.println("<tr>");
                            out.println("<td>");
                            %>
                            <form action="CancellaArticolo">
                            <input type="checkbox" name="chbox" value="<%=+al.get(i).getId()%>"/>
                            <%
                            out.println("<b>Autore: </b>"+al.get(i).getAutore()+"                    <b>Articolo: </b>"+al.get(i).getTitolo()+"</td>");
                            out.println("</tr>");
                            out.println("</table>");
                            %>
                            </form>
                            <%
                            }
                            %>
                            <input type="submit" value="Cancella Articoli Selezionati"></input>
                            </form>
/*gestione_admin.jsp*/

看起来几乎没问题。。。有什么问题吗?

复选框值必须是项目的ID。大概是这样的:


当您费心调试
chboxArticoliDaCancellare
值时,应该已经发现了这一点。正如您所看到的,它们都是
“chkbox”

您还需要确保输入元素都位于与“提交”按钮相同的内,该按钮用于发送所需数据。因此,基本上:


...
...
...
...
...


与具体问题无关,您没有正确使用
PreparedStatement
。您仍然有一个SQL注入漏洞,因为您将用户控制的请求参数值连接到SQL字符串中,而不是使用占位符
PreparedStatement#setXxx()
调用。另外,考虑一下JSTL/EL,它会让你的演示代码更干净。

我会在简单的应用程序上测试它,例如在控制台模式下。调试代码。连接打开了吗?有例外吗?将catch添加到主try finally块。是的,问题是chechbox值,我已经更正了它。现在它删除记录,但只删除最后一条记录,即使选中了其他复选框,也会将
con.commit()
行从循环中删除。当您关闭它时,它将已被提交。顺便说一下,要提高性能,请改用
addBatch()
executeBatch()
。另请参见我已尝试过,但它继续仅删除最后选定的记录。字符串[]chboxArticoliDaCancellare似乎未正确填充。那么,您没有正确填充复选框值。也许他们最后都有最后一件物品的ID。只要查看生成的HTML源代码是否正确,并在JSP代码中追溯问题的原因。
应该围绕表格和按钮。