IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Remplir un select à partir d'une table bdd


Sujet :

Servlets/JSP Java

  1. #1
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut Remplir un select à partir d'une table bdd
    voilà j'ai une jsp qui contient une liste SELECT que je veux remplir à partir d'une table de ma bdd, que voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    public String[] arrayFil = new String[]{};
     
    public String[] fillList(String table, String champs) {
            List rowValues = new ArrayList();
     
            String query = "SELECT " + champs + " FROM " + table;
            try {
                stat = cnx.prepareStatement(query);
                rslt = stat.executeQuery();
     
     
                while (rslt.next()) {
                    //int i = 1;
                        rowValues.add(rslt.getString(1));
                    //array.add(rslt.getString(i++));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (rslt != null) {
                        rslt.close();
                    }
                } catch (Exception e) {
                };
                try {
                    if (stat != null) {
                        stat.close();
                    }
                } catch (Exception e) {
                };
            }
            arrayFil = (String[]) rowValues.toArray(new String[rowValues.size()]);
            return arrayFil;
        }
    et voici le code de ma jsp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <select>
                                    <option name="filiere" value="0"></option>
                                    <% DBinstructions obj = new DBinstructions();
                                    String[] Fil = new String[]{};
                                        Fil = obj.fillList("filiere", "filiere");
                                        for (int i = 0; i < Fil.length ; i++) {
                                    %>
                                    <option name="filiere" value="1" >
                                        <% Fil[i].toString();%>
                                    </option>
                                    <% }
                                    %>
                                </select>
    quand je déroule ça me donne des emplacements vides
    Nom : 2016-02-19_15-50-21.jpg
Affichages : 292
Taille : 28,1 Ko

    je n'arrive pas à trouver l'erreur

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    L'erreur se situe ici : <% Fil[i].toString();%>. Pour que la valeur se retrouve écrite dans le flux, il faut <%= Fil[i].toString() %>.

    D'ailleurs, tu peux simplifier et optimiser ta boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <% DBinstructions obj = new DBinstructions();
                                    String[] Fil = obj.fillList("filiere", "filiere"); // inutile de créer un tableau vide, dont tu ne te sers pas
                                        for (int i=0; i < Fil.length ; i++) {
                                    %>
                                    <option name="filiere" value="1" >
                                        <%= Fil[i] /* c'est déjà du String, donc pas la peine de faire .toString() */ %>
                                    </option>
                                    <% }
                                    %>
    En remplaçant en plus le for par un forEach (for(String fil : Fil) ce serait encore plus simple.

    Autre chose, en revanche : le value devrait être différent pour chaque ligne, et devrait être la clef de la valeur dans la base de données. Ceci te filialibilisera tes affectations et te simplifiera l'affectation de la clef étrangère, ou les requêtes que tu pourrais faire à partir de la sélection. Au lieu de faire un tableau de String, tu fais un tableau d'instances d'une classe avec 2 attributs, id et name. Ou alors, tu construis ton select/option directement dans la boucle de parcours du ResultSet. Ou encore, tu fais une méthode fillOptions() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (rslt.next()) {
                    //int i = 1;
                        rowValues.add(String.format("<OPTION value=\"%s\">%s</OPTION>",rslt.getString(1),rslt.getString(2));
                    //array.add(rslt.getString(i++));
                }
    et tu n'as plus qu'à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <% DBinstructions obj = new DBinstructions(); 
    for (String option : obj.fillOptions("filiere", "filiere")) {
         out.println(option); // écrit dans le flux de la jsp
    }
    %>
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    ça a marché merci beaucoup
    pour la clé je ne peux pas écrire votre suggestion du code car ma méthode fillList est sur une classe java non pas une jsp ou servlet
    alors j'ai besoin d'une autre méthode, puisque ça a fonctionné je vais la chercher maintenant, mais comment faire un tableau d'instance dans une jsp?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Hind4Dev Voir le message
    pour la clé je ne peux pas écrire votre suggestion du code car ma méthode fillList est sur une classe java non pas une jsp ou servlet
    ça n'empêche pas de le faire. Tu utilises bien ta classe DBinstructions dans la JSP : de la même façon, tu peux bien sûr faire une classe qui représente la donnée associée à sa clef, l'importer dans la JSP et faire que la méthode renvoie un tableau d'instances de cette classe au lieu de String.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    voilà j'ai fait celà mais il y'a des erreurs et je ne sais pas comment extraire le id et le champs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     //classe filiere contient les deux champs avec //un constructeur des setters et des getters
    public Filiere[] arrayFil = new Filiere[]{};
     
    public Filiere[] fillList(String table, String id ,String champs) {
            List rowValues = new ArrayList();
     
            String query = "SELECT " + id+","+champs + " FROM " + table;
            try {
                stat = cnx.prepareStatement(query);
                rslt = stat.executeQuery();
     
     
                while (rslt.next()) {
                    //int i = 1;
                        rowValues.add(rslt.getObject(1));
                    //array.add(rslt.getString(i++));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (rslt != null) {
                        rslt.close();
                    }
                } catch (Exception e) {
                };
                try {
                    if (stat != null) {
                        stat.close();
                    }
                } catch (Exception e) {
                };
            }
            arrayFil = (Filiere[]) rowValues.toArray(new Filiere[rowValues.size()]);
            return arrayFil;
        }
    la jsp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <% DBinstructions obj = new DBinstructions();
           Filiere[] Fil = obj.fillList("filiere", "code_f","filiere");
           for (int i = 0; i < Fil.length ; i++) {
            %>
             <option name="filiere" value="<% Fil[i]%>" >//Fil[i].quoi?? le id
             <%= Fil[i]%>//Fil[i].quoi?? le champs
            </option>
              <% }
              %>

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ta classe Filiere, elle est comme ça un peu près :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class Filiere {
     
          private int id; // là je sais pas quel est le type de ta clef dans ta base, c'est peut-être du String...
          private String name;
     
          public Filiere(int id, String name) {
                 this.id=id;
                 this.name=name;
          }
     
          public int getId() {
               return id;
          }
     
           public String getName() {
                return name;
           }
     
    }
    La lecture c'est tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public Filiere[] fillList(String table, String id ,String champs) {
            List<Filiere> rowValues = new ArrayList<>();
     
            String query = "SELECT " + id+","+champs + " FROM " + table;
            try {
                stat = cnx.prepareStatement(query);
                rslt = stat.executeQuery();
     
     
                while (rslt.next()) {
                    //int i = 1;
                        rowValues.add(    new Filiiere( rslt.getInt(1), rslt.getString(2) );
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (rslt != null) {
                        rslt.close(); // inutile ça aussi (le stat.close() referme le resultset) : d'ailleurs, un try-with-resource simplifierait encore plus.
                    }
                } catch (Exception e) {
                };
                try {
                    if (stat != null) {
                        stat.close();
                    }
                } catch (Exception e) {
                };
            }
           return rowValues.toArray(new Filiere[rowValues.size()]); 
        }
    et donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <% DBinstructions obj = new DBinstructions();
           Filiere[] Fil = obj.fillList("filiere", "code_f","filiere");
           for (int i = 0; i < Fil.length ; i++) {
            %>
             <option name="filiere" value="<%= Fil[i].getId() %>" > 
             <%= Fil[i].getName() %> 
            </option>
              <% }
              %>
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    il reste juste une petite erreur, là il m'affiche dans le select le id non pas le nom de la filiere même si j’enlève le signe = de <%= Fil[i].getCode_f()%> j'ai besoin des id en cachette

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ce qu'il y a en contenu de la balise <option> est le texte affiché, ce qu'il y a dans l'attribut value est l'identifiant (la valeur envoyée au serveur dans la requête), et celle-ci n'est pas visible dans la combo.

    Si c'est inversé, soit c'est inversé dans la création de la balise, soit dans la classe.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    pourtant j'ai spécifié le champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <option name="filiere" value="<% Fil[i].getCode_f();%>" >     
                                   <%= Fil[i].getFiliere()%>
                                    </option>
    ils sont ordonnés dans la classe déjà je les ai généré automatiquement

  10. #10
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    c'est bon j'ai ajouté ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (rslt.next()) {
                    rowValues.add(new Filiere(rslt.getString("code_f"), rslt.getString("filiere")));
                }
    ça fonctionne
    merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Dojo] Remplir un Grid à partir d'une table SQL
    Par lagoule dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 10/06/2009, 11h13
  2. [MySQL] Remplir un array à partir d'une table
    Par Dauphin dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/06/2007, 07h25
  3. Réponses: 12
    Dernier message: 28/11/2006, 15h34
  4. [MySQL] Aide select à partir d'une table
    Par carlosdz dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 28/06/2006, 22h47
  5. Remplir deux listes select à partir d'une autre
    Par Raduris dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/11/2005, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo