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 :

[html:select] Génération d'une liste déroulante


Sujet :

Struts 1 Java

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Points : 13
    Points
    13
    Par défaut [html:select] Génération d'une liste déroulante
    Bonjour a tous.


    Voila j'ai un petit probleme pour générer une liste de choix composée d'élements provenant d'une base de données. (je suis débutant en Struts... )

    Voila mon bean :
    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
     
    public class Drink {
     
    	String drinkName;
    	String drinkDescription;
    	int drinkPrice;
     
    	public Drink(){
    	}
     
    	public String getDrinkDescription() {
    		return drinkDescription;
    	}
     
    	public void setDrinkDescription(String drinkDescription) {
    		this.drinkDescription = drinkDescription;
    	}
     
    	public String getDrinkName() {
    		return drinkName;
    	}
     
    	public void setDrinkName(String drinkName) {
    		this.drinkName = drinkName;
    	}
     
    	public int getDrinkPrice() {
    		return drinkPrice;
    	}
     
    	public void setDrinkPrice(int drinkPrice) {
    		this.drinkPrice = drinkPrice;
    	}
    }
    Ma classe 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
     
    public class DeleteDrinkAction extends Action {
     
    	public ActionForward execute(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response) throws Exception {
     
                    Drinksdao dao = new Drinksdao();
     
    		Collection<Drink> Drinkslist = dao.ListDrink();
    		dao.closeDB();
                    request.setAttribute("liste", Drinkslist);
     
    		return mapping.findForward("deletelist");
    	}
    }
    Mon dao :
    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
     
    ...
           public Collection<Drink> ListDrink(){
     
    		req = "SELECT name FROM drinks ORDER BY name";
    		Read(req);
     
    		Drink d;
    		Collection<Drink> drinks = new Vector<Drink>();
     
    		try {
    			while(results.next()){
    				d = new Drink();
    				d.setDrinkName(results.getString("name"));
    				drinks.add(d);
     
    				return drinks;
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
     
    		return null;
    	}
    ...
    Et enfin pour finir mon code jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <html:select name="liste" property="drinkName">
    	<html:optionsCollection property="liste" name="drinkName"/>
    </html:select>
    L'erreur qui m'est annoncé est qu'il ne trouve pas de getter pour drinkName.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.servlet.ServletException: No getter method available for property drinkName for bean under name liste
    Je précise que je n'ai pas utilisé de balise form pour le moment ni de classe ActionForm (ca viendra). Mon but est pour l'instant d'afficher simplement la liste de ce qui est contenu dans ma base sous la forme d'un menu select.

    Je suis sous Java 5 avec Struts 1.2.

    Si qqun à une idée je suis preneur

    Merci d'avance
    Bonne journée

  2. #2
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Je vais peut etre dire une connerie mais je crois qu il faut que ta classe Drink herite de ActionForm.

    Qu as tiu mis dans ton struts-config.xml ?

  3. #3
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Essaie plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html:select property="drinkName">
       <html:options collection="liste" property="drinkName" labelProperty="drinkName"/>
    </html:select>

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Alors si j'essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <html:select property="drinkName">
       <html:options collection="liste" property="drinkName" labelProperty="drinkName"/>
    </html:select>
    J'obtient l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cannot find bean under name org.apache.struts.taglib.html.BEAN
    Voila mon fichier struts-config :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <struts-config>
    	<action-mappings>
    		<action path="/DeleteDrinkAction" scope="request"  type="projet.actions.DeleteDrinkAction">
    			<forward name="deletelist" path="del_drink"></forward>
    		</action>
            </action-mappings>
    </struts-config>
    Je precise que j'utilise les tiles, je n'ai pas déclaré de form-beans dans le fichier de config, je pense que je n'en ai pas besoin vu que ma jsp n'est pas un form (enfin je débute je peux me tromper)...

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Quand tu ecris <html:select name="liste" property="drinkName">, tu cherches dans la variable 'liste' une propriété 'drinkName' (mais liste est une collection).

    Dans ton cas, tu veux que le select soit rattaché à drinkName (dans l'actionForm) pour la valeur sélectionnée, donc il faudrait <html:select property="drinkName">

    Après tu précises d'où tu tires tes données pour l'itération dans <html:options... />, et ce que tu as mis est OK...

    J'espère que c'est assez clair...

    A+

  6. #6
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Le message d'erreur que tu obtiens est normal car il ne trouve pas de bean drinkName (celui référencé dans le tag html:select et non celui référencé dans le tag html:options).

    Pour que cela fonctionne, il faut créer une ActionForm, avec getter et setter sur la propriété drinkName, déclarer le form-bean et ajouter la référence au form-bean dans le mapping de l'Action via l'attribut name dans le struts-config.xml, et enfin mettre le tag html:select dans un tag html:form.

    Petite précision : il faut obligatoirement passer par un formulaire pour pouvoir récupérer le drinkName sélecté.

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Ok merci bcp j'ignorais le fait qu'il falait absolument passer par un formulaire.

    Par contre je ne sais pas trop comment créer ma classe ActionForm avec un getter et un setter car je travaille sur une collection, de plus dois-je faire un appel de cette classe ActionForm depuis ma Form ?

    J'imagine aussi que dans le fichier struts-config je dois mettre le paramètre validate à falise.

    Merci bcp d'avance car je pense que je touche au but

  8. #8
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Dans l'Action DeleteDrinkAction, comme tu as codé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    request.setAttribute("liste", Drinkslist);
    tu peux très bien créer seulement getter et setter sur la propriété drinkName dans l'ActionForm.

    Dans le mapping de l'Action qui s'exécute au submit du formulaire, soit celle qui te permet de récupérer le drinkName sélecté, tu références le form-bean dans l'attribut name.
    Ainsi, au submit du formulaire, l'ActionForm sera automatiquement initialisée et la propriété drinkName sélectée sera chargée via le setter.

    Il faut bien sûr avoir mis ton html:select dans un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <html:form action="processSelect">
       <html:select property="drinkName">
          <html:options collection="liste" property="drinkName" labelProperty="drinkName"/>
       </html:select>
    </html:form>

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Voila mon ActionForm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class DrinkFormDel extends ActionForm {
    	private static final long serialVersionUID = 1L;
    	Drink drinkName;
     
    	public Drink getDrinkName() {
    		return drinkName;
    	}
     
    	public void setDrinkName(Drink drinkName) {
    		this.drinkName = drinkName;
    	}
    }
    Mon struts-config :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <struts-config>
       <form-beans>
          <form-bean name="form2" type="projet.forms.DrinkFormDel" />
       </form-beans>
     
       <action-mappings>
          <action path="/DeleteDrinkAction" scope="request" type="projet.actions.DeleteDrinkAction" 
    		    name="form2" validate="false" input="index">
    			<forward name="deletelist" path="del_drink"></forward>
    		</action>
       </action-mappings>
    </struts-config>
    Mais j'ai toujours la meme erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cannot find bean under name org.apache.struts.taglib.html.BEAN
    J'ai bien sur ajouté la balise form a ma jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <html:form action="processSelect">
    <html:select property="drinkName">
       <html:options collection="liste" property="drinkName" labelProperty="drinkName"/>
    </html:select>
    </html:form>
    Je comprend plus trop...

  10. #10
    Membre actif Avatar de DrHelmut
    Homme Profil pro
    Software craftsman - JS, Java...
    Inscrit en
    Octobre 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Software craftsman - JS, Java...
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 114
    Points : 228
    Points
    228
    Par défaut
    laisse tomber les balises struts et simplifie toi la vie avec la JSTL !

    Avec les tags JSTL plus besoin de se prendre la tête avec le paramétrage des beans ou leur portée (request/session...) !

    <select name="drinkName" id="drinkName">
    <c:forEach var="drink" items="liste">
    <option value="${drink.name}">${drink.name}</option>
    </c:forEach>
    </select>

    Il faut dire que je trouve struts particulièrement lourd coté affichage : le html c'est fastoche comme tout et, de plus, les taglibs struts gènent quand on veut ajouter du javascript (entre autres) !

    De plus, pour un intégrateur ou maquettiste HTML c'est parlant comme cela

  11. #11
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Tout d'abord, la propriété drinkName de ton ActionForm doit être un String.

    Ensuite, l'Action DeleteDrinkAction est l'Action qui s'exécute avant l'affichage du formulaire et qui constitue la collection liste.

    Il faut donc créer une deuxième Action qui s'exécutera au submit du formulaire (dans l'exemple de tag html:form que je t'ai donné, je lui ai donné le path processSelect, ne sachant pas comment tu comptais l'appeler) et la déclarer dans le struts-config.xml.
    C'est elle qu'il faut lier au form-bean que tu as appelé form2.
    Et c'est dans cette Action que tu pourras récupérer le drinkName sélecté.

  12. #12
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Merci pour votre aide et bonne soirée

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

Discussions similaires

  1. [AC-2010] Ajouter selection [Tous] dans une liste déroulante
    Par mcharmat dans le forum IHM
    Réponses: 2
    Dernier message: 23/11/2013, 19h11
  2. [MySQL] Génération d'une liste déroulante
    Par MYST42 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 11/05/2009, 18h19
  3. [PEAR][HTML_QuickForm] Génération d'une liste déroulante
    Par Garra dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 21/08/2008, 22h01
  4. Réponses: 1
    Dernier message: 29/04/2008, 14h36
  5. [Tableaux] select à partir d'une liste déroulante
    Par baignassou dans le forum Langage
    Réponses: 4
    Dernier message: 26/03/2008, 17h23

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