2012-02-02 21 views
0

私のアプリケーションのこの部分を操作することはできません。私はいくつかのレコード(データベースから正しくロードされている)をJSPページからmysqlデータベースで削除し、チェックボックスをチェックして、送信ボタンをクリックしなければなりません。 データが正しく表示されていても、何もDB から削除されなかった。ここでコードがあります: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 st allright ...何が問題なの?

+0

私は単純なアプリケーションでテストします。コンソールモード。コードをデバッグします。接続は開いていますか?何か例外はありましたか?メインtry-finallyブロックにキャッチを追加します。 – Devart

答えて

0

チェックボックスの値は、アイテムのIDでなければなりません。このような何か:

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

無関係具体的な問題に、あなたは正しくPreparedStatementを使用していません。 PreparedStatement#setXxx()の呼び出しでプレースホルダー?を使用する代わりに、ユーザーが制御する要求パラメーター値をSQLストリング内で連結したため、SQLインジェクションホールが残っています。また、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

関連する問題