2015-11-12 3 views
0

Je suis encore nouveau pour servlets et des trucs JDBC et voudrais un peu d'aide sur le code suivant:Servlets: problème avec stockage/impression des attributs spécifiques à l'aide HttpSession, tableau

try{ 
     String selectSQL = "select * from product_list where category = '"+category+"'"; 
     Statement stmt = conn.createStatement(); 
     ResultSet rs1 = stmt.executeQuery(selectSQL); 

     ArrayList<Float> idList = new ArrayList<Float>(); 

out.println("<table border=\"1\"><tr><th>Item_ID</th><th>Item_name</th><th>Title</th><th>Category</th><th>Image_name</th><th>Price</th><th>Stock_Count</th></tr>"); 

while(rs1.next()){ 

    out.println("<tr><td>"+ rs1.getFloat("item_id") + "</td>"); 
    out.println("<td>" + rs1.getString("item_name") + "</td>"); 
    out.println("<td>"+"<a href =\"ItemDetail\">" + rs1.getString("title")+"</a>" + "</td>"); 
    out.println("<td>" + rs1.getString("category") + "</td>"); 
    out.println("<td>" + rs1.getString("image_name") + "</td>"); 
    out.println("<td> " + rs1.getFloat("price") + "</td>"); 
    out.println("<td> " + rs1.getFloat("stock_count") + "</td>"); 
    out.println("</tr>"); 
     HttpSession session = request.getSession(true); 
     idList.add(rs1.getFloat("recording_id")); 
     session.setAttribute("id", idList); 
} 
out.println("</table>"); 

     conn.close(); 
    } catch(SQLException se) { 
     System.err.println(se); 
    } 

Ce que je veux faire est que stocke chaque élément item_id dans la session mais n'affiche que les détails de celui sur lequel l'utilisateur clique sur son lien (chaque titre a le même lien hypertexte) dans une autre servlet, j'ai tenté de stocker tous les identifiants dans une liste de tableaux Rien ne se passe sur l'autre servlet qui est censé avoir reçu la liste des matrices, y at-il quelque chose que j'ai mal fait, toute aide serait appréciée.

Voici le code utilisé dans un servlet différent pour recevoir l'attribut du tableau ci-dessus

HttpSession session = request.getSession(true); 
    ArrayList<Float> id = (ArrayList<Float>) session.getAttribute("id"); 
+0

Le code a été mis à jour –

+0

C'est un code vraiment méchant mais essayez de placer le HttpSession avant la table que vous imprimez. Créer une session avant d'imprimer la sortie – Olu

+0

Je sais -_- le code est mauvais, et mettre le HttpSession avant d'imprimer la table n'a pas fait de différence, toujours rien ne s'affiche dans l'autre servlet, je pense que quelque chose ne va pas dans la partie tableau du code. –

Répondre

0

Voici un exemple de code de travail. Modifier en conséquence

//My first servlet using Java-8 
try (Connection con = DriverManager.getConnection("xxxx")) { 
     String category = "fish"; 
     try (PrintWriter out = response.getWriter()) { 
      try (ResultSet rs1 = con.createStatement() 
        .executeQuery("select * from product_list where category = '" + category + "'")) { 
       HttpSession session = request.getSession(); 
       ArrayList<Float> list = new ArrayList<>(); 
       out.print(
         "<table border=\"1\"><tr><th>Item_ID</th><th>Item_name</th><th>Title</th><th>Category</th><th>Image_name</th><th>Price</th><th>Stock_Count</th></tr>"); 
       while (rs1.next()) { 
        list.add(rs1.getFloat("item_id")); 
        out.println("<tr><td>" + rs1.getFloat("item_id") + "</td>"); 
        out.println("<td>" + rs1.getString("item_name") + "</td>"); 
        out.println("<td>" + "<a href ='" + request.getContextPath() + "/Second?id="+rs1.getFloat("item_id")+"'>" 
          + rs1.getString("title") + "</a>" + "</td>"); 
        out.println("<td>" + rs1.getString("category") + "</td>"); 
        out.println("<td>" + rs1.getString("image_name") + "</td>"); 
        out.println("<td> " + rs1.getFloat("price") + "</td>"); 
        out.println("<td> " + rs1.getFloat("stock_count") + "</td>"); 
        out.println("</tr>"); 
       } 
       session.setAttribute("list", list); 
       out.println("</table>"); 
      } 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

et mon deuxième servlet est ici

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    // then just use that to get it through a GET Http Method 
    String id = request.getParameter("id"); 
    HttpSession session = request.getSession(); 
    ArrayList<Float> list = (ArrayList<Float>) session.getAttribute("list"); 
    response.getWriter().append("item: ").append(String.valueOf(list.get(0))); 
} 

imprime à l'écran la sortie élément: 45,0

Hope it helps.

+0

Merci, le code ci-dessus fonctionne mais comment l'appliquer à mon propre code? Désolé je suis toujours un noob au codage. –

+0

Voir Modifier. mais modifiez selon que je n'ai pas ammended la chaîne de connexion de base de données – Olu

+0

vous recommande d'utiliser un pool de source de données et chanceux pour vous Tomcat fournit un – Olu

0

Jeff, Jeff, Jeff ....

La réponse à votre question, je pense est assez simple, mais je voudrais vous aider à nettoyer un peu parce qu'il ya beaucoup de choses qui pourraient être fait mieux ici. Ce code a des fuites de ressources et peut vous apprendre de mauvaises habitudes.

La raison pour laquelle les ID de n'apparaissent pas correctement est probablement cette ligne:

HttpSession session = request.getSession(true); 
    idList.add(rs1.getFloat("recording_id")); 
    session.setAttribute("id", idList); 
} //End while 

Vous réinitialiser le idlist attribut à chaque fois que vous itérer ResultSet. Vous devez extraire la session en dehors de la boucle, modifier ArrayList et définir l'attribut une fois.

HttpSession session = request.getSession(true); //Get the session only once 
ArrayList<Float> idList = new ArrayList<Float>(); //Declare output variables outside of the try block. 

//Now declare your JDBC resources; always declare them as null outside of the try block. 
//This allows you to close them properly later. 

PreparedStatement stmt = null; 
ResultSet rs1 = null; 

try{ 
    String selectSQL = "select * from product_list where category = ?"; 

    stmt = conn.prepareStatement(selectSQL); 

    stmt.setString(1, category); 

    rs1 = stmt.executeQuery(selectSQL); 

    out.println("<table border=\"1\"><tr><th>Item_ID</th><th>Item_name</th><th>Title</th><th>Category</th><th>Image_name</th><th>Price</th><th>Stock_Count</th></tr>"); 

    while(rs1.next()){ 

     out.println("<tr><td>"+ rs1.getFloat("item_id") + "</td>"); 
     out.println("<td>" + rs1.getString("item_name") + "</td>"); 
     out.println("<td>"+"<a href =\"ItemDetail\">" + rs1.getString("title")+"</a>" + "</td>"); 
     out.println("<td>" + rs1.getString("category") + "</td>"); 
     out.println("<td>" + rs1.getString("image_name") + "</td>"); 
     out.println("<td> " + rs1.getFloat("price") + "</td>"); 
     out.println("<td> " + rs1.getFloat("stock_count") + "</td>"); 
     out.println("</tr>"); 
     idList.add(rs1.getFloat("recording_id")); //Add to the list in the loop. 

     } 

    out.println("</table>"); 

    } catch(SQLException se) { 
     System.err.println(se); //This is OK, but consider 'throw new RuntimeException(se)' here instead so that the exception propagates. 
    } finally { 
    //Close the resources backwards from the way that they were opened. 
    //Check them all for null first in case there's an error in the middle somewhere, 
    //otherwise you'll get a NullPointerException from the finally block and it will "swallow" 
    //the original error. 
    if(rs1 != null) { 
     try { 
     rs1.close(); 
     } catch(SQLException x) { 
     System.err.println(x); //Don't throw here; keep trying to close resources 
     } 
    } 

    if(stmt != null) { 
     try { 
     stmt.close(); 
     } catch(SQLException x) { 
     System.err.println(x); 
     } 
    } 

    if(conn != null) { 
     try { 
     stmt.close(); 
     } catch(SQLException x) { 
     System.err.println(x); 
     } 
    } 
} 

session.setAttribute("id", idList); //Set the list once and only once. 
+0

Merci pour la réponse, j'ai essayé d'exécuter le code ci-dessus mais j'ai reçu une erreur 'java.sql.SQLException: indice de paramètre hors de portée (1> nombre de paramètres, ce qui est 0).' affiché sur la console, qu'est-ce que cela signifie? –

+0

Aussi, que fait ce code? stmt.setString (1, catégorie); –

+0

Le code ci-dessus utilise PreparedStatement, qui lie une variable à la valeur "category". Cela empêche les attaques par injection SQL, car la valeur du paramètre ne fait pas partie de l'instruction. Si vous deviez utiliser une déclaration à la place, quelqu'un pourrait mettre '; DROP TABLE PRODUCT_LIST' comme catégorie et faites disparaître votre table. Quant à l'erreur ... vous êtes sûr que le selectSQL contient un '?', Correct? C'est la clé. – Brad