通过复选框和提交按钮删除mysql多条记录
我无法使用我应用程序的这一部分。我必须从jsp页面中删除mysql数据库中的一些记录(从DB正确加载),选中复选框并单击submit按钮。 即使数据显示正确,也不会从数据库中删除任何内容 代码如下: 这是课程通过复选框和提交按钮删除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{
/* 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代码中追溯问题的原因。
应该围绕表格和按钮。