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

Struts 1 Java Discussion :

options dynamique


Sujet :

Struts 1 Java

  1. #1
    Membre expérimenté Avatar de fred777888999
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 250
    Par défaut options dynamique
    Bonjour,

    debutant java-struts, je cherche a faire qq chose qui a forcement ete fait 1 000 000 000 de fois au minimum et pour lequel je ne trouve aucune explication claire sur le net (alors que j'imagine que ca doit exister forcement, mais la saloperie de proxy ici filtre 99% des sites, heureusement pas dvp).
    Le truc est simplement le remplissage d'une liste select avec des valeurs en base, j'ai un objet BDD qui contient une methode static get comme suit :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public class BDD implements java.io.Serializable
    {
            private int idBDD;
            private String nom;
            public BDD() {}
     
            public int getIdBDD() { return this.idBDD; }
            public String getNom() { return this.nom; }
     
            public static BDD[] getListeBDD(Connection connexion)
            {
                    CallableStatement st = null;
                    ResultSet rs = null;
                    String requete = "BEGIN ? := get_BDDs(); END;";
                    ArrayList listeBDD = new ArrayList();
                    BDD lBDDRetour[] = null;
                    try
                    {
                            st = connexion.prepareCall(requete);
                            st.registerOutParameter(1, OracleTypes.CURSOR);
                            st.execute();
     
                            rs = (ResultSet) st.getObject(1);
     
                            while(rs.next())
                            {
                                    BDD maBDD = new BDD();
                                    maBDD.setIdBDD( rs.getInt("idBdd") );
                                    maBDD.setNom( rs.getString("nom") );
                                    listeBDD.add( maBDD );
                            }
     
                            rs.close();
                            st.close();
                            BDD lBDD[] = new BDD[listeBDD.size()];
                            for ( int i = 0; i < listeBDD.size(); i++ )
                            {
                                    lBDD[i] = (BDD) listeBDD.get(i);
                            }
                            lBDDRetour = lBDD;
                    }
                    catch(Exception ex)
                    {
                            ex.printStackTrace();
                    }
     
                    return lBDDRetour;
            }
    }
    La copie de vecteur ne me plait deja pas des masses dans ce code, mais passons....
    dans mon fichier de config struts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form-bean name="frmBDD" type="org.apache.struts.action.DynaActionForm">
          <form-property name="id" type="java.lang.Integer"/>
          <form-property name="description" type="java.lang.String"/>
          <form-property name="idSchemaBaseOrg" type="sgdt.metier.BDD[]"/>
    </form-bean>
    Ce qui me permetra de mettre la valeur initiale de ma combo quand j'aurai trouve la syntaxe.
    (j'ote ce qui ne sert a rien pour mon probleme)
    dans mon action :
    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
    public class ActionBDD extends ActionFWT
    {
            public ActionForward execute(ActionMapping mapping, ActionForm form,
                            HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, SQLExc
    eption
            {
                    Connection lCnx = null;
                    DynaActionForm lForm = (DynaActionForm) form;
     
                    // Lecture de la table BDD pour remplir la combo.
                    System.out.println("Lecture combo");
                    if ( lCnx == null )
                    {
                            lCnx = getConnection(request);
                    }
                    BDD lBDDs[] =  BDD.getListeBDD(lCnx);
     
                    request.setAttribute("beanBDD", lBDDs);
                    return mapping.findForward("next");
            }
    }
    et dans ma page jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:options name="beanBDD" property="idBDD" labelProperty="nom"/>
    qui genere le superbe code d'erreur :

    javax.servlet.ServletException: No getter method available for property idBDD for bean under name beanBDD
    Qu'ai-je donc completement loupe comme notion ???
    Toute aide est la bienvenue car la je seche et personne autour de moi ne semble apte a me fournir un coup de main digne de ce nom.
    Merci d'avance
    Fred.

  2. #2
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Essaie plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:options collection="beanBDD" property="idBDD" labelProperty="nom"/>
    Par contre, je ne comprends pas pourquoi tu codes ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                            BDD lBDD[] = new BDD[listeBDD.size()];
                            for ( int i = 0; i < listeBDD.size(); i++ )
                            {
                                    lBDD[i] = (BDD) listeBDD.get(i);
                            }
    Dans la jsp, tu pourrais très bien afficher directement le contenu de l'ArrayList de bean BDD que tu as appelé listeBDD sans passer par l'étape précédente.

  3. #3
    Membre expérimenté Avatar de fred777888999
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 250
    Par défaut
    Tout d'abord, merci d'avoir repondu.

    Ca change un peu le message, dans le sens ou je l'attendais, mais je n'aime pas me manifester sans tester :

    javax.servlet.ServletException: No getter method available for property nom for bean under name beanBDD
    Pour l'autre pb, effectivement ce serai possible, mais je ne connais pas la taille du vecteur avant d'etre alle au bout de mon curseur, je ne peux donc pas allouer le bon nombre d'elements des le debut.
    Je suis certain qu'il existe une methode pour me donner un tableau d'objet a partir d'une arrayList mais je ne la connais pas et la doc ici n'est pas hyper riche, d'ou les maladresses

    Une autre idee ?

  4. #4
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Excuse-moi d'insister mais je ne comprends pas pourquoi tu tiens absolument à constituer un tableau d'objets à partir d'une ArrayList d'objets.

    Tu peux très bien afficher une ArrayList d'objets dans la jsp sans connaître sa taille.

    Sinon, tu as bien codé le tag html:options dans un tag html:select ?
    Si c'est le cas, montre-nous comment.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 30
    Par défaut
    je suis de l'avis de c_nvy concernant ta conversion de ton arraylist en tableau.
    par contre pour tes options tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <html:select ...>
      <logic:iterate collection="${beanBDD}" id="bdd">
        <html:option value="${bdd.idBDD}"><c:out value="${bdd.nom}"/></html>
      </logic:iterate>
    </html:select>

  6. #6
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Citation Envoyé par marieR
    je suis de l'avis de c_nvy concernant ta conversion de ton arraylist en tableau.
    par contre pour tes options tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <html:select ...>
      <logic:iterate collection="${beanBDD}" id="bdd">
        <html:option value="${bdd.idBDD}"><c:out value="${bdd.nom}"/></html>
      </logic:iterate>
    </html:select>
    Ce code ne fonctionnera qu'en J2EE 1.4.

    Il y a plus simple, sans logic:iterate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html:select property="idSelecte">
       <html:options collection="listeBDD" property="idBDD" labelProperty="nom"/>
    </html:select>
    en ayant fait au préalable un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.setAttribute("listeBDD",listeBDD) ;
    Autre solution avec l'ArrayList listeBDD, propriété du form-bean :

    dans l'Action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DynaActionForm lForm = (DynaActionForm) form;
    lForm.setListeBDD(listeBDD) ;
    dans la jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <html:form action="tonAction">
      <html:select property="idSelecte">
         <html:optionsCollection property="listeBDD" value="idBDD" label="nom"/>
      </html:select>
    </html:form>

  7. #7
    Membre expérimenté Avatar de fred777888999
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 250
    Par défaut
    Re-bonjour et encore merci de votre aide, je n'etais pas en ligne hier soir...
    En fait, mon probleme est plus simple, quoi que.
    Actuellement, pour constituer ma liste, j'utilise le bout de code jsp suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <li><label for="cbxBase" title="Base de données">Base</label>
        <html:select styleId="cbxBase" property="id" name="frmBDD" >
        <logic:iterate name="beanBDD" id="bBDD">
            <html:option value="idBDD"><bean:write name="bBDD" property="nom"/></html:option>
        </logic:iterate>
    Qui me genere bien le HTML souhaite, simplement je n'arrive pas a comprendre pourquoi je ne peux pas remplacer la boucle par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <html:options property="idBDD" labelProperty="nom"/>
    sans avoir une erreur qui me dit que je n'ai pas de getter pour idBDD et nom
    ni comment initialiser la valeur de la combo qui ne prend visiblement pas celle de fmbBDD.id (qui est bien valide quand je fais un bean:write de cette derniere).
    La boucle ne va pas m'empecher de dormir, je ne ferai meme pas un drame de la remplacer par une qui ecrit les tags options "a l'ancienne" style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <option value="<bean:write name="bBDD" property="idBDD"/>">
       <bean:write name="bBDD" property="nom"/>
    </option>
    si j'etais foutu d'ecrire un test qui compare la valeur de bBDD.idBDD et frmBDD.id pour generer un code selected="selected" conditionnelement. Mais comme je l'ai dit je suis un grand debutant en jsp et je ne parviens pas a trouver la syntaxe a base de balise <bean> (la balise <c> n'etant visiblement pas reconnue par le serveur ce qui me semble etrange...) pour comparer les pptes de deux 'haricots'.
    Pour le reste, j'ai effectivement simplifie en retournant un ArrayList plutot qu'un tableau de BDD et ca fonctionne aussi mal qu'avant (c'etait d'ailleur ce que j'avais fait au depart, mais j'ai essaye avec un type identifie plutot qu'une collection car je pensais que c'etait ca qui l'empechait d'acceder a ma propriete idBDD ou nom).

  8. #8
    Membre expérimenté Avatar de fred777888999
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 250
    Par défaut
    Comme suggere par ce qui va devenir mon modo prefere, le code suivant a fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:optionsCollection name="beanBDD" value="idBDD" label="nom"/>
    Merki +++ donc... Ceci dit, meme si ca a fonctionne, je suis interesse par la syntaxe qui permet de comparer 2 beans meme si ici ca ne me sert a rien.
    Fred.

  9. #9
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Citation Envoyé par fred777888999
    Ceci dit, meme si ca a fonctionne, je suis interesse par la syntaxe qui permet de comparer 2 beans meme si ici ca ne me sert a rien.
    Fred.
    Le plus simple, c'est d'utiliser la JSTL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <c:if test="${bBDD.idBDD eq frmBDD.id}">
       test ok
    </c:if>

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

Discussions similaires

  1. [WB18] champ Menu: sous-options dynamiques?
    Par fdelepine dans le forum WebDev
    Réponses: 0
    Dernier message: 10/12/2013, 14h55
  2. Créer des options dynamiquement
    Par gwyohm dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/07/2010, 16h56
  3. option dynamique avec JS et submit
    Par duboisa dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 19/02/2010, 16h12
  4. options dynamiques dans un select
    Par duboisa dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 18/02/2010, 14h45
  5. [Dojo] Menu digit : option dynamique
    Par kelthalorn dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 24/08/2009, 16h29

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