2012-02-02 1 views
0

Мне не удается выполнить эту часть моего приложения. Мне нужно удалить некоторые записи (правильно загруженные из БД) в базе данных mysql со страницы jsp, установив флажки и нажав кнопку отправки. Даже если правильно отображаются данные, ничего не было удалено из БД Вот код:Удалите mysql несколько записей по кнопке и отправьте кнопку

Вот класс

/* 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) { 
    } 
} 

} 
} 

Вот сервлет

/* 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> 

похоже almo все в порядке ... в чем проблема?

+0

Я бы проверил его на простом приложении, например. в режиме консоли. Отлаживайте свой код. Открыта ли связь? Были ли исключения? Добавьте catch в главный блок try-finally. – Devart

ответ

0

Значение флажка должно быть идентификатором элемента. Что-то вроде этого:

<input type="checkbox" name="chbox" value="<%=al.get(i).getId()%>"/> 

Вы должны уже обнаружили это, когда вы потрудились отладки chboxArticoliDaCancellare значения. Как и у вас, все они "chkbox".

Вам также необходимо убедиться, что входные элементы находятся внутри таких же<form>, что и кнопка отправки, которая должна посылать нужные данные. Так, в основном:

<form action="yourServletURL" method="post"> 
    ... 
    <input type="checkbox" ... /> 
    ... 
    <input type="checkbox" ... /> 
    ... 
    <input type="checkbox" ... /> 
    ... 
    <input type="submit" ... /> 
    ... 
</form> 

Unrelated к конкретной проблеме, вы не используете PreparedStatement правильно. У вас все еще есть отверстие для инъекций SQL, потому что вы связали контролируемое пользователем значение параметра запроса внутри строки SQL вместо использования заполнителя ? с вызовом PreparedStatement#setXxx(). Кроме того, рассмотрим возможность просмотра JSTL/EL, это сделает ваш код презентации более чистым.

+0

Да, проблема в значении chechbox, я исправил его. Теперь он удаляет запись, но только последнюю запись, даже если другие флажки отмечены. – Franky

+0

Удалите строку 'con.commit()' из цикла. Это уже будет сделано, когда вы его закроете. Кстати, чтобы повысить производительность, вместо этого используйте 'addBatch()' и 'executeBatch()'. См. Также http://stackoverflow.com/questions/2467125/reusing-a-preparedstatement-multiple-times – BalusC

+0

Я пробовал, но он продолжает удалять только последнюю выбранную запись кажется, что String [] chboxArticoliDaCancellare не заселен правильно – Franky

Смежные вопросы