Récupération d'attribut (resultset) dans ma JSP

Bonjour tout le monde,

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


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.io.*"%>
<%@page import="java.sql.*"%>
<%@page import="javax.servlet.*"%>
<%@page import="java.util.Vector"%>
<%@page import="java.util.Iterator"%>

<%
                                ResultSet panierItem;

                                // affichage du resultset
                                panierItem = (ResultSet) request.getAttribute("TabPanier");


                                while(panierItem.next())
                                {
                                    out.println("<br />ligne : "+panierItem.getString("titre_livre"));
                                }
                                
                            %>

Et enfin le problème :
Quand je vais sur ma page jsp, j’ai une erreur qui dit :

Je vois pas trop de quoi ça pourrait venir … Si qqn pouvait m’éclairer ? (je début en Java Web)

Merci d’avance !
Edité le 11/12/2009 à 09:48

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 :slight_smile:
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);

et dans ma jsp :


<%
                                Vector<Vector<String>> panierItem;

                                // affichage du resultset
                                panierItem = (Vector<Vector<String>>) request.getAttribute("TabPanier");

                                out.println(panierItem.size());
%>

Et là, il me fait la meme erreur qu’avant, mais sur le “out.println(panierItem.size());”
Si je l’enlève ça marche … Une idée ?

Sinon, pour ta remarque, je fais cela dans le cadre d’un projet scolaire :slight_smile: Pour ça que ça donne l’impression de réinventer la roue.

Alors deux choses :

  1. Les Vector, c’est moche. Utilise ArrayList et surtout l’interface List.
  2. Crée une classe pour représenter ta donnée en base, c’est ce que vitamin1981 t’expliquais à propos de “POJO”.

Et tant qu’à faire du Java1.5++, utilise des generics partout où ça s’applique…

Ah oui d’accord je comprends mieux :slight_smile: Concernant les remarques de Sans-Nom, elles sont judicieuses mais pour le coup, chaque chose en son temps …

S’il y a une erreur que tu n’arrives pas à lire, tu peux utiliser une manière brutale pour y parvenir :

<%
Vector<Vector<String>> panierItem = (Vector<Vector<String>>) request.getAttribute("TabPanier");
try {
  out.println(panierItem.size());
}
catch (Throwable t) {
  t.printStackTrace();
  throw t;
}
%>

Ca devrait s’afficher dans la console de sortie du serveur d’applications que tu utilises. Ce message nous interesse.

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

Heu … pourquoi te faire chier avec une HashMap ? Crée un objet Machin, puis colle chaque attributs dedans ?

Comme ça, tu fais ça derrière :


ArrayList<Machin> panierItem = new ArrayList<Machin>();
panierItem = (ArrayList<Machin>) request.getAttribute("TabPanier");
for (Machin machin : panierItem) {
 out.println("<hr/>"+machin.getFoobar());
}

Et mieux, ça fonctionnera direct avec les pseudo tags JSP comme jsp:forEach (http://www.crazysquirrel.com/computing/java/jsp/jstl-forEach.jspx)…

Une JSP, c’est quand même mieux… sans code Java.

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

:slight_smile:

Quoi !? Non non ce n’est pas un anti pattern :slight_smile:

Ah oups oui, j’ai confondu avec le Poltergeist ( en.wikipedia.org… )

Bon, en tout cas, utiliser un tableau d’objets fonctionne à merveille ! Je me demande pourquoi je n’y ai pas pensé avant ^^

Merci beaucoup pour votre aide :slight_smile:

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