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 :

Comment initialiser une liste déroulante ?


Sujet :

Struts 1 Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 3
    Par défaut Comment initialiser une liste déroulante ?
    Bonjour,

    Je souhaite obtenir un formulaire rempli au premier affichage par des données issues d'un fichier xml. Ce formulaire peut par la suite être modifié par l'utilisateur.
    Tout fonctionne, sauf "l'initialisation" du formulaire. Voici le code simplifié au maximum et qui présente le problème :

    index.jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
     
    <html>
    <head>
    	<title>Test de liste</title>
    </head>
    <body>
    	<html:link forward="liste">Afficher la liste</html:link><br>
    </body>
    </html>
    liste.jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
     
    <html>
    <head>
    	<title> Test de Liste </title>
    </head>
    <body>
    	<html:form action="/liste">
    		<html:select property="liste" />
    		le nom de la liste est <%=request.getParameter("name")%>
    	</html:form>
    </body>
    ListeForm.java
    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
     
    package monpackage;
     
    import java.util.ArrayList;
    import org.apache.struts.action.ActionForm;
     
    public class ListeForm extends ActionForm {
     
    	private static final long serialVersionUID = 1461018176686577004L;
    	private String name;
    	private ArrayList liste;
     
    	public void setName(String name) {
    		this.name=name;
    	}
     
    	public String getName() {
    		return this.name;
    	}
     
    	public void setListe (ArrayList liste) {
    		this.liste = liste;
    	}
     
    	public ArrayList getListe() {
    		return this.liste;
    	}
     
    	public void reset() {
    		this.name = null;
    		this.liste = null;
    	}
    }
    ListeAction.java
    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
     
    package monpackage;
     
    import java.util.ArrayList;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
     
    public class ListeAction extends Action {
     
    	public ActionForward execute(
    			ActionMapping mapping, 
    			ActionForm form, 
    			HttpServletRequest request, 
    			HttpServletResponse response) 
    	throws Exception
    	{
    		ListeForm formulaire = (ListeForm) form;
     
    		String name1 = "coucou"; String name2 = "coucou2";
    		ArrayList<String> liste = new ArrayList<String>();
    		liste.add(name1); liste.add (name2);
     
    		formulaire.setListe(liste);
    		request.setAttribute("liste", liste);
    		formulaire.setName("test");
    		request.setAttribute("name", "test");
    		return mapping.getInputForward();
    	}
    }
    struts-config.xml
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE struts-config PUBLIC
      "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
      "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
     
    <struts-config>
     
      <form-beans>
        <form-bean name="listeForm"
                   type="monpackage.ListeForm"/>
      </form-beans>
     
      <global-forwards>
        <forward name="liste" path="/liste.do"/>
      </global-forwards>
     
      <action-mappings>
        <action path="/liste"
                type="monpackage.ListeAction"
                name="listeForm"
                scope="session"
                validate="false"
                input="/liste.jsp">
        </action>
      </action-mappings>
    </struts-config>
    Tout ceci donne pour résultat un menu déroulant vide. et un paramètre name = null dans la page liste.jsp.

    Est-ce que quelqu'un saurait pourquoi?
    En lisant des docs j'ai cru comprendre que le processus est le suivant :
    il lit le liste.jsp, il voit le html:form, le bean listeForm n'existant pas, il n'instancie, il effectue le reset, il effectue l'action, et il effectue le populate() du bean en utilisant les attributs de la requête ( qui sont présents grâce aux request.setAttribute() de l'action ).
    Me trompe-je?

    Merci

    PS : Je précise que je ne souhaite pas passer par une rédéfinition de la méthode init() car je souhaite pouvoir repasser plusieurs fois par cette action ( avec enregistrement du fichier xml ) dans la même session.

    J'utilise struts 1.3.8 / Tomcat 6.0.13 / SYsdeo 3.2.1 / eclipse 3.2.2

  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
    Pour initialiser le formulaire dans la méthode execute de l'Action ListeAction, ce code suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		ListeForm formulaire = (ListeForm) form;
     
    		String name1 = "coucou"; String name2 = "coucou2";
    		ArrayList<String> liste = new ArrayList<String>();
    		liste.add(name1); liste.add (name2);
     
    		formulaire.setListe(liste);
    Et pour afficher la liste déroulante dans la jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <html:form action="pathDuneAutreAction">
       <html:select property="name">
          <html:options property="liste"/>
       <html:select>
       <html:submit value="Valider"/>
    </html:form>
    Il te faut créer une autre Action qui s'exécutera au submit du formulaire et qui te permettra de récupérer l'élément sélecté.
    Dans le mapping de cette Action, il faudra référencer le form-bean listeForm via l'attribut name.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 3
    Par défaut suite
    Bonjour,

    Merci de ta réponse. En effet, ceci marche. En fait le vrai problème que j'ai survient lorsque je souhaite afficher la liste d'une propriété de plusieurs objets.
    J'obtiens alors l'erreur (classique...) "can't find bean under name listeArbo" etc..
    Le code est sensiblement le même. J'ai ajouté une classe Arbo qui a pour attribut nomArbo, et qui a les getters et les setters correspondant. Dans ma classe ListeForm, j'ai un listeArbo (ArrayList) ainsi qu'un nomArbo (String) ainsi que les getters et setters correspondant.
    liste.jsp est modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	<html:form action="/listeArbo" >
    	<logic:present name="listeForm" property="listeArbo">
    	  <html:select property="nomArbo">
          	    <html:options collection="listeArbo" property="nomArbo"/>
    	  </html:select>
    	  <html:submit value="Valider"/>
    	</logic:present>
    	</html:form>
    et on a l'action ListeAction modifiée comme suit (pour l'initialisation du select) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                    ArboForm formulaire = (ArboForm) form;
    		Arbo arbo1 = new Arbo("arbo1");
    		Arbo arbo2 = new Arbo("arbo2");
    		ArrayList listeArbo = new ArrayList();
    		listeArbo.add(arbo1);
    		listeArbo.add(arbo2);
    		formulaire.setListeArbo(listeArbo);
    D'après ce que j'ai cru comprendre, il ne trouve pas le bean listeArbo dans le scope, et la je ne comprends plus.. Dois-je faire ListArbo une classe qui possèderait un ArrayList comme attribut ?

  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
    Quand la collection est une propriété de l'ActionForm, il faut utiliser le tag html:optionsCollection comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html:select property="nomArbo">
        <html:optionsCollection property="listeArbo" value="nomArbo" label="nomArbo"/>
    </html:select>

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 3
    Par défaut dans le mille
    Bon ba c'est ça, Merci beaucoup !
    J'ai pourtant déja vu ce code passer sous mes yeux, mais j'ai pas du l'essayer tel quel (il devait me manquer le label)...

    a+

  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
    Effectivement, tu es obligé de coder l'attribut label même dans le cas où la propriété est la même dans value et label car si tu ne le codes pas, par défaut, il va chercher une propriété label, et comme elle n'existe pas, tu te retrouves avec une erreur du style :
    No getter method available for property label ...
    Le seul cas où tu n'as pas besoin de coder les attributs label et value dans le tag html:optionsCollection, c'est quand la collection est une collection de LabelValueBean car un LabelValueBean a pour propriétés value et label.

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

Discussions similaires

  1. Comment ré-initialiser une liste déroulante ?
    Par jeje22 dans le forum Access
    Réponses: 5
    Dernier message: 03/06/2009, 21h32
  2. Comment initialiser une liste déroulante d'un formulaire
    Par Blu3b3rry dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 30/07/2008, 18h55
  3. [AJAX] Comment rafraîchir une liste déroulante alimentée par ajax
    Par lodan dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/03/2007, 09h01
  4. Réponses: 1
    Dernier message: 04/07/2006, 23h11
  5. Comment initialiser une liste de composants avec une boucle ?
    Par EricSid dans le forum Composants VCL
    Réponses: 5
    Dernier message: 06/04/2005, 18h46

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