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

JSF Java Discussion :

Itération dans JSF 2.1 ?


Sujet :

JSF Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 11
    Par défaut Itération dans JSF 2.1 ?
    Salut,
    je développe une application web avec l'outil jsf, je voudrais faire le truc suivant on choisis un nombre d'une liste choix de 1-5 , automatiquement on affiche un nombre exacte de champ de texte . j'ai un problème a réaliser ça voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <h:selectOneMenu value="#{valeur}" converter="javax.faces.Number" >
    				     <f:selectItem id="item1" itemLabel="1" itemValue="1" />
    	  				 <f:selectItem id="item2" itemLabel="2" itemValue="2" />
    					 <f:selectItem id="item3" itemLabel="3" itemValue="3" />
    					 <f:selectItem id="item4" itemLabel="4" itemValue="4" />
    					 <f:selectItem id="item5" itemLabel="5" itemValue="5" />
    <a4j:support event="onchange" reRender="text"/>	 			 				 			
     
    </h:selectOneMenu> 		
     <ui:repeat id="text" var="v" value="#{valeur}" >
         <h:inputText  id="v"/> 
      </ui:repeat>
    Et merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 162
    Par défaut
    Bonjour swoop314,

    Tu nous dis que tu as un problème à réaliser ce que tu souhaites, mais que ce passe t-il avec ce code ? Un erreur est générée ? Si oui, laquelle ? Sinon, est-ce que la page s'affiche ? Des précisions nous seraient utiles.

    En attendant je vois que tu as mappée la valeur de ton selectOneMenu à aucun ManagedBean apparent, est-ce normal ?

    <h:selectOneMenu value="#{valeur}" ... />
    Si tu ne déclare pas le préfixe de ton ManagedBean, comment enregistres-tu la valeur choisie ? Et comment ton itérateur (ui:repeat) pourrais boucler avec cette valeur ?
    Le problème vient surement de là.

  3. #3
    Membre Expert
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Par défaut
    Salut,

    le sujet était intéressant, et très loin d'être évident et donc je me suis penché dessus avec intérêt, car cela paraissait simple au premier abord.

    Mais bonne nouvelle, j'ai réussi.

    Tout d'abord, une chose importante et non des moindre pour que le code fonctionne avec des échanges AJAX, il faut cette variable dans le web.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        <context-param>
            <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
            <param-value>false</param-value>
        </context-param>
    Visiblement c'est un "bug" connu qui sera pris en compte avec JSF 2.2, en tout cas en ce qui concerne les f:ajax et les @ViewScoped.

    Enfin bref, venons en au problème.

    Générer des inputText, c'est bien mais encore faut-il que chacun d'entre eux soit associé avec la propriété d'un bean pour accueuillir la valeur saisie.

    Pour ma part j'ai choisie une Map <String, String> pour stocker les identifiants des inputTexts ainsi que la valeur saisie.

    donc voici le Managed 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    package beans;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;
    import javax.faces.event.AjaxBehaviorEvent;
     
    /**
     * Bean managé pour stocker la valeur du h:selectOneMenu. Ce bean permettra de génerérer un liste dynamique de composants h:inputText ainsi que leur "id" respectif.
     *
     * @author francois.robin
     */
    @ManagedBean
    @ViewScoped
    public class ValeurBean
    {
     
        /**
         * valeur qui representera la saisie du h:selectOneMenu.
         */
        private int value = 0;
        /**
         * Map qui stocke les valeurs saisies. première string : identifiant du composant ; seconde string : valeur saisie dans le composant;
         */
        private Map<String, String> composantValues = new HashMap<String, String>();
     
        /**
         * initialise la Map d'identifiants de du composant. Cette méthode est invoquée par AJAX lors de la modification de la valeur dans la combo box.
         *
         * @param e evenement AJAX
         */
        public void onChangeListener(AjaxBehaviorEvent e)
        {
            composantValues.clear();
            for (int i = 0; i < value; i++)
            {
                String composantId = String.format("compId_%d", i);
                String composantDefaultValue = String.format("valeur initiale de %s", composantId);
                composantValues.put(composantId, composantDefaultValue);
            }
        }
     
        /**
         * @return the value
         */
        public int getValue()
        {
            return value;
        }
     
        /**
         * @param value the value to set
         */
        public void setValue(int value)
        {
            this.value = value;
        }
     
        /**
         * @return the composantValues
         */
        public Map<String, String> getComposantValues()
        {
            return composantValues;
        }
     
        /**
         * @param composantValues the composantValues to set
         */
        public void setComposantValues(Map<String, String> composantValues)
        {
            this.composantValues = composantValues;
        }
     
        /**
         * renvoie la liste des identifiants h:inputText
         *
         * @return liste des identifiants
         *
         */
        public List<String> getComposantsIds()
        {
            return new ArrayList(composantValues.keySet());
        }
     
        /**
         * reproduit dans la console les valeurs saisies dans les h:inputText
         */
        public void verifSaisies()
        {
            System.out.println("Vérification des saisies .. : " + value);
            for (String valeur : composantValues.values())
            {
                System.out.println(valeur);
            }        
        }
    }

    et enfin le code de la page JSF (f:ajax)

    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
     
    <h:form id="mainForm" >
                <h:panelGrid columns="1">
                    <h:selectOneMenu id="combobox" value="#{valeurBean.value}" >               
                        <f:selectItem id="item0" itemLabel="Aucun" itemValue="0" />
                        <f:selectItem id="item1" itemLabel="1" itemValue="1" />
                        <f:selectItem id="item2" itemLabel="2" itemValue="2" />
                        <f:selectItem id="item3" itemLabel="3" itemValue="3" />
                        <f:selectItem id="item4" itemLabel="4" itemValue="4" />
                        <f:selectItem id="item5" itemLabel="5" itemValue="5" />
                        <f:ajax event="change" render="inputs" listener="#{valeurBean.onChangeListener}"/> 			 				 			
                    </h:selectOneMenu> 
     
                    <h:panelGrid id="inputs" columns="2"> 
                        <c:forEach  var="idComposant" items="#{valeurBean.composantsIds}" >
                            <h:outputLabel id="outputlabel_#{idComposant}" value="Composant #{idComposant}"  />
                            <h:inputText   id="#{idComposant}" value="#{valeurBean.composantValues[idComposant]}" size="30"/>                    
                        </c:forEach>              
                    </h:panelGrid>
     
                    <h:commandButton id="button" value="Soumettre la saisie" actionListener="#{valeurBean.verifSaisies}">
                        <f:ajax execute="inputs" render="mainForm display" />       
                    </h:commandButton>  
     
                    <h:panelGroup id="display">
                        Valeurs saisies :
                        <c:forEach var="saisie" items="#{valeurBean.composantValues.values()}">
                            <li>#{saisie}</li>
                        </c:forEach>
                    </h:panelGroup>    
                </h:panelGrid>
            </h:form>
    Enjoy

    PS1 : ça faisait longtemps que j'avais pas eu un cas comme ça en JSF, ça détend les neurones

    PS2 : biensûr ça fonctionne, cela va sans dire ;-)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/06/2007, 11h45
  2. Comment sauter une itération dans une boucle ?
    Par Kaeguri dans le forum Fortran
    Réponses: 3
    Dernier message: 20/04/2007, 12h30
  3. Notion UserControl dans JSF
    Par Verboz dans le forum JSF
    Réponses: 1
    Dernier message: 03/04/2007, 14h39
  4. itération sous jsf
    Par lieto dans le forum JSF
    Réponses: 11
    Dernier message: 15/03/2007, 13h34
  5. Réponses: 9
    Dernier message: 13/11/2006, 13h59

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