Je suis en train de développer un site web marchand en Java Web, et j’ai quelques soucis avec le “panier de commande”
J’ai créé une servlet que voici :
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// vecteur d'id de livres commandés (données de test)
Vector livres = new Vector();
livres.add(1);
livres.add(2);
livres.add(3);
Iterator itLivres = livres.iterator(); // va servir pour chercher les infos dans la base
// recherche de résultats correspondants (titre, auteur, etc) dans la base de données
try {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException ex) {
Logger.getLogger(LettreLivre.class.getName()).log(Level.SEVERE, null, ex);
}
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/projet_java", "", "");
Statement stmt = con.createStatement();
// définition de la clause where
String where = "WHERE";
boolean premierPassage = true;
while(itLivres.hasNext())
{
if(premierPassage == true)
where += " id_livre="+itLivres.toString();
else
where += " OR id_livre="+itLivres.toString();
premierPassage = false;
}
ResultSet rs = stmt.executeQuery("SELECT * FROM livre "+where+";");
// renvoi du resultset vers la vue
request.setAttribute("TabPanier", rs);
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/panier.jsp");
dispatcher.forward(request, response);
} catch (SQLException ex) {
System.out.println(ex);
}
}
et voici ma page jsp (sans le code html, pour que ça soit plus clair) :
Tu ne peux pas exploiter un ResultSet en dehors de sa transaction JDBC associée. C’est pourquoi, en général, tous les résultats du ResultSet sont “recopiées” dans une liste de POJO métiers.
Remarque : je ne sais pas pour qui tu travailles, mais tu aurais fort interet à exploiter la communauté Java pour t’éviter de réinventer la roue.
Merci pour ta réponse ! Je n’étais pas au courant de ça
Par contre, même en mettant les résultats dans un tableau que je renvoie (request.setAttribute), j’ai toujours et encore la même erreur…
Enfin presque …
j’ai rajouté ça dans ma servlet :
// on met les résultats du resultset dans un tableau (le resultset ne peut pas s'utiliser en dehors de sa transaction JDBC
Vector<Vector<String>> livresCommandes = new Vector<Vector<String>>();
while(rs.next())
{
// création du tableau qui contiendra les données d'un livre (auteur, etc)
Vector<String> enCours = new Vector<String>();
enCours.add(rs.getString("titre_livre"));
enCours.add(rs.getString("auteur_livre"));
enCours.add(rs.getString("editeur_livre"));
enCours.add(rs.getString("en_vente_livre"));
enCours.add(rs.getString("date_apparition_site_livre"));
enCours.add(rs.getString("prix_vente_livre"));
// ajout au vecteur de vecteur
livresCommandes.add(enCours);
}
// renvoi du tableau contenant les données du resultset vers la vue
request.setAttribute("TabPanier", livresCommandes);
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/panier.jsp");
dispatcher.forward(request, response);
Merci pour ces réponses, j’ai réussi a résoudre mon problème.
Par contre, j’ai utilisé un ArrayList comme Sans-Nom me l’a proposé, mais je ne comprends pas comment récupérer chaque élément de la liste … A chaque fois il me retourne qqch comme :
Comment est-ce que je peux récupérer chaque valeur ? (“true”, “Da Vinci”, “19.9”, etc…)
J’ai fais un itérator de cette manière, mais comme dit je n’arrive pas a rentrer plus en profondeur dans le tableau
ArrayList panierItem = new ArrayList();
panierItem = (ArrayList) request.getAttribute("TabPanier");
Iterator it = panierItem.iterator();
while(it.hasNext())
{
out.println("<hr/>"+it.next());
}
J’ai un peu cherché sur le net, mais je n’ai rien trouvé qui permettrait de résoudre mon problème :s
EDIT : Je précise que mon arraylist contient un hashmap qui me permet de lier une String à une autre (auteur_livre = truc)
Edité le 14/12/2009 à 09:23
Vais essayer ça, merci.
Si je n’ai pas créé d’objet c’est parce que en théorie on ne crée pas d’objet qui n’a pas d’action à effectuer (c’est un anti-pattern il me semble).
Disons qu’entre une map et un objet, la différence c’est que le compilateur peut t’éviter quelques merdes… ensuite, c’est technique (genre occupation mémoire, temps parcours, etc).