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 :

Changer les valeurs d'une page en fonction d'une sélection


Sujet :

JSF Java

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2008
    Messages : 179
    Points : 172
    Points
    172
    Par défaut Changer les valeurs d'une page en fonction d'une sélection
    Bonjour,

    j'ai récemment posé une question similaire, mais ma question était centrée sur un problème spécifique rencontré, et non sur mon problème en général.
    Et comme depuis, j'ai remplacé ce problème par d'autres, je reprends mon problème depuis zéro.

    Je dispose d'une page avec un ensemble de champs variables (dont certains sont éditables).
    Les valeurs dépendent d'une valeur choisie dans une liste déroulante (h:selectone).
    Le bean est obligatoirement en scope "request".

    Ma question est donc... "comment faire celà"?

    J'ai tenté plusieurs méthodes, mais me suis heurté à ma grande relative méconnaissance des mécanismes JSF. En gros, je n'ai jamais réussi à recharger ma page avec les nouvelles valeurs correspondantes au nouveau choix de la liste déroulante...

    Le code que j'ai tenté (parmi d'autres qui ne fonctionnaient pas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <h:selectOneMenu 	        		
    	value="#{monBean.currentOffer}"
      required="true"
    	onchange="this.form.submit();">
      <f:selectItems value="#{monBean.allSelectionItems}"/>
    </h:selectOneMenu>
    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
    	/**
             * The selectable offers
             */
       	List<SelectItem> 			allSelectionItems;
     
    	/**
             * The current selection.
             */
    	private OfferObject       currentOffer; 
     
    	//	 =============== INIT ===============================
    	@PostConstruct
    	public void initProfileBean() {   
    		List <OfferObject> allOfferObjects = offerService.getAllOffers();
    		allOffersItems = new ArrayList<SelectItem>();
    		for (OfferObject offer : allOfferObjects)
    		{
    			allOffersItems.add(new SelectItem( offer.getId(),offer.getName() ));
    		}
    		currentOffer			= allOfferObjects.get(0);
    	}
     
     
     
    	//	 =============== Getters / Setter ===============================
     
    	public int getCurrentOfferSelection() {
    		return currentOffer.getId();
    	}
     
    	public void setCurrentOfferSelection(int currentOfferSelection) {
    		this.currentOffer = offerService.getById(currentOfferSelection);
    	}}
    Ici, mes valeurs ne sont pas rechargées.. et mon setter (setCurrentOfferSelection) n'est simplement jamais appelé...

    Si vous avez des idées, je vous en remercie d'avance.. et d'ici là, merci déjà de m'avoir lu jusqu'ici.
    Roger l'Âne: le lapin devenu grand....
    _______________________________________________________________
    Développeur bio-informatique; spécialiste en rien, généraliste en tout.

    Capitan ! Capitan ! On a aperçu le Loup ! Il a pris d'assaut une chaise à porteurs, à l'aide d'un cul-de-jatte et d'un lapin !
    (Pavillon noir !, Alain Ayroles/Jean-Luc Masboux, éd. Delcourt, coll. Terres de Légendes, 1997, p. 18)

  2. #2
    Membre du Club Avatar de koack
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    Points : 68
    Points
    68
    Par défaut
    Hello,

    n'y aurait il pas un probleme avec le getter et le setter de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private OfferObject       currentOffer; 
     
    public int getCurrentOfferSelection() {
             return currentOffer.getId();
    }
     
    public void setCurrentOfferSelection(int currentOfferSelection) {
             this.currentOffer = offerService.getById(currentOfferSelection);
    }

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2008
    Messages : 179
    Points : 172
    Points
    172
    Par défaut
    koack, merci de ta réponse.

    Sauf si tu as vu quelque chose qui m'a échappé, je ne vois pas le problème cependant(*) ; les getter/setter sont une "virtualisation" de la sélection courante. Ou plutôt, il s'agit d'une redirection : la sélection courante est en fait l'id de mon offre courante. Et comme j'ai construit ma liste de SelectItems à partir de la liste des Id existant, ça ne pose (normalement) pas de problème (pas sécurité j'ai quand même ajouté un test absent ici par souci de lisibilité)

    * Par contre je ne jurerai pas qu'il s'agit d'une façon de faire "propre". Je ne fais pas toujours les choses dans les règles de l'art (et c'est probablement un euphémisme)
    Roger l'Âne: le lapin devenu grand....
    _______________________________________________________________
    Développeur bio-informatique; spécialiste en rien, généraliste en tout.

    Capitan ! Capitan ! On a aperçu le Loup ! Il a pris d'assaut une chaise à porteurs, à l'aide d'un cul-de-jatte et d'un lapin !
    (Pavillon noir !, Alain Ayroles/Jean-Luc Masboux, éd. Delcourt, coll. Terres de Légendes, 1997, p. 18)

  4. #4
    Membre du Club Avatar de koack
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    Points : 68
    Points
    68
    Par défaut
    bonjour,

    je ne vois pas le getter setter de currentOffer, il devrait ressembler a ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private OfferObject       currentOffer; 
     
    public OfferObject getCurrentOffer() {
             return currentOffer;
    }
     
    public void setCurrentOffer(OfferObject currentOffer) {
             this.currentOffer =currentOffer;
    }
    et
    Ici, mes valeurs ne sont pas rechargées.. et mon setter (setCurrentOfferSelection) n'est simplement jamais appelé...
    Pourquoi serait il appelé ?

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2008
    Messages : 179
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par koack Voir le message
    bonjour,

    je ne vois pas le getter setter de currentOffer, il devrait ressembler a ca :
    ...
    Et il ressemble en effet à ça.
    Là encore, je n'avais pas mis tout mon code, pour ne pas alourdir.
    Je n'avais inséré que le getter/setter de la sélection courante : puisqu'il était un peu "spécial", il pouvait être la cause de mes problèmes. Les autres sont des ultra classiques ("source"->"générer les getter et setter"!)


    Citation Envoyé par koack Voir le message
    et
    Pourquoi serait il appelé ?
    Là je me heurte probablement à ma méconnaissance de JSF : il me semblait qu'au moment où on soumettait le formulaire (mon "form.submit()") le setter de la sélection courante du h:selectone allait être appelé : ça me semblait logique...
    Mais ce que tu sembles (tacitement) dire, c'est que ce n'est pas le cas... et alors j'en reviens à ma question initiale.. comment alors prendre en compte le changement de sélection pour recharger les champs de ma page en fonction de la nouvelle sélection?

    Merci en tous cas et déjà pour ces premières remarques.
    Roger l'Âne: le lapin devenu grand....
    _______________________________________________________________
    Développeur bio-informatique; spécialiste en rien, généraliste en tout.

    Capitan ! Capitan ! On a aperçu le Loup ! Il a pris d'assaut une chaise à porteurs, à l'aide d'un cul-de-jatte et d'un lapin !
    (Pavillon noir !, Alain Ayroles/Jean-Luc Masboux, éd. Delcourt, coll. Terres de Légendes, 1997, p. 18)

  6. #6
    Membre du Club Avatar de koack
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    Points : 68
    Points
    68
    Par défaut
    Re,

    donc si j'ai bien compris ce que vous cherchez a faire c'est mettre a jour votre page avec la valeur selectionnée d'un selectOneMenu afin d'agir sur l'affichage d'autres composants dans votre page.

    On va prendre le cas de deux selectOneMenu, le 2 ieme depend du choix du 1er.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <h:selectOneMenu value="#{Bean.currentOffer}" required="true"
    onchange="this.form.submit()" valueChangeListener="#{Bean.eventlistener}">
    <f:selectItems value="#{Bean.allSelectionItems}"/>
    </h:selectOneMenu>	
    <h:selectOneMenu value="#{Bean.currentOfferbis}">
    <f:selectItems value="#{Bean.allSelectionItemsBis}"/>
    </h:selectOneMenu>
    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
     
    //source :
    //http://www.jtips.info/index.php?title=JSF/ValueChangeListener
     
    public void eventlistener(ValueChangeEvent event) {
    PhaseId phaseId = event.getPhaseId();
    if (phaseId.equals(PhaseId.ANY_PHASE)) {
         event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
         event.queue();
    } 
    else if (phaseId.equals(PhaseId.UPDATE_MODEL_VALUES)) {
    // le champ d'instance myValue est mis à jour par
    // le listener et ne sera pas écrasé plus tard par
    // invocation du setter
    System.out.println("Mise a jour de la valeur des autres composants")
    }
    }
    Ps :

    il me semblait qu'au moment où on soumettait le formulaire (mon "form.submit()") le setter de la sélection courante du h:selectone allait être appelé : ça me semblait logique...
    Je suis d'accord mais le probleme ici c'est que votre getter setter ...CurrentOfferSelection ne correspond pas a value="#{monBean.currentOffer}" donc ne sera jamais appelé

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2008
    Messages : 179
    Points : 172
    Points
    172
    Par défaut
    Merci de nouveau de ton message.
    Je me suis un peu plongé dans le cycle de vie de JSF pour comprendre la manip (je découvre chaque jour combien je suis novice en JSF!)... et une fois convaincu, l'ai appliquée.

    Seulement, avant même de changer quoi que ce soit lors de la deuxième invocation de l'événement (si j'ai bien compris, c'est ce à quoi je dois m'appeler après qu'il aie été mise en pile : event.queue()), je me suis contenté de faire un println() comme tu le fais d'ailleurs. Et je n'y passe jamais... ce qui donne l'impression que l'événement est simplement perdu ou que le listener n'est pas capable de l'intercepter à nouveau. Là encore, il semble que qqchose m'aie échappé.. est-ce que le scope (request) pourrait y être pour qqchose?
    Ou est-ce simplement que je n'ai pas compris ta réponse?

    Je remets mon code au cas où qqchose qui m'aurait encore échappé. Cette fois je ne fais pas d'ajustement de lisibilité pour éviter les pbs de recopie.

    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
    <h:form styleClass="css" id="form_offer">
    	<fieldset>
    		<p class="message">
    	        <label>
    	            <h:outputText value="#{bundle.offer_label}" />
    	        </label>
            	<h:selectOneMenu 	        		
            		value="#{offerBean.currentOfferSelection}"
    				required="true" 
    				onchange="this.form.submit();"
    				valueChangeListener="#{offerBean.offerChangeListener}">
      				<f:selectItems value="#{offerBean.allOffersItems}"/>
    			</h:selectOneMenu>
    		</p>
    		...
    		</fieldset>
    </h:form>
    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
    private List<SelectItem> 	  allOffersItems;
    private Offer       	      currentOffer;
     
    //	 =============== INIT ===============================
    @PostConstruct
    public void initProfileBean() {
    	final List<Offer> allOffers = offerService.getAllOffers();
    	allOffersItems = new ArrayList<SelectItem>();
    	for (Offer offer : allOffers){
    		allOffersItems.add(new SelectItem(offer.getId(),offer.getName()));
    	}
    	setCurrentOfferSelection(1);
    }
     
    //	 =============== LISTENERS ===============================
    @PostConstruct
    public void offerChangeListener(ValueChangeEvent event){
    	PhaseId phaseId = event.getPhaseId();
    	if (phaseId.equals(PhaseId.ANY_PHASE)) {
    		event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
    		event.queue();
    		System.out.println("=========== phaseId :"+phaseId.toString()+" ===============");
     
    	} 
    	else if (phaseId.equals(PhaseId.UPDATE_MODEL_VALUES)) {
    		System.out.println("============== TEST ========================================");
    	}
     
    }
     
    //	 =============== GETTERS / SETTERS ===============================	
     
    public Offer getCurrentOffer() {
    	return currentOffer;
    }    
    public void setCurrentOffer(Offer currentOffer) {
    	this.currentOffer = currentOffer;
    }
    public List<SelectItem> getAllOffersItems() {
    	return allOffersItems;
    }
    public void setAllOffersItems(List<SelectItem> allOffersItems) {
    	this.allOffersItems = allOffersItems;
    }
    public int getCurrentOfferSelection() {
    	return currentOffer.getId();
    }
    public void setCurrentOfferSelection(int currentOfferSelection) {
    	this.currentOffer = offerService.getById(currentOfferSelection);
    }

    PS :
    Citation Envoyé par koack Voir le message
    Je suis d'accord mais le probleme ici c'est que votre getter setter ...CurrentOfferSelection ne correspond pas a value="#{monBean.currentOffer}" donc ne sera jamais appelé
    Ah oui, en effet : j'avais bien raté quelque chose. Par chance, c'était une erreur de recopie lorsque j'ai posé ma question.
    Roger l'Âne: le lapin devenu grand....
    _______________________________________________________________
    Développeur bio-informatique; spécialiste en rien, généraliste en tout.

    Capitan ! Capitan ! On a aperçu le Loup ! Il a pris d'assaut une chaise à porteurs, à l'aide d'un cul-de-jatte et d'un lapin !
    (Pavillon noir !, Alain Ayroles/Jean-Luc Masboux, éd. Delcourt, coll. Terres de Légendes, 1997, p. 18)

  8. #8
    Membre du Club Avatar de koack
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    Points : 68
    Points
    68
    Par défaut
    Re,

    Pourquoi avoir mis @PostConstruct sur la methode qui gere l'event ?

    PostConstruct ne sert qu'a appliquer des initialisations apres le constructeur.
    Sert par exemple pour utiliser un objet injecté.
    Donc supprimez le.
    Modifiez les getter / setter de currentOfferSelection comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public int getCurrentOfferSelection() {
    	return currentOfferSelection;
    }
    public void setCurrentOfferSelection(int currentOfferSelection) {
    	this.currentOfferSelection = currentOfferSelection;
    }
    A part ca je ne vois rien.Ajoutez <h:messages>

    Le bout de code qui gere les phases du cycle JSF sert a setter la valeur de currentOfferSelection avant d'appliquer les changemens desiré a la page.
    Sans ce code nous aurions :

    le constructeur du bean->les getters->gestion de l'event->les setters->les getters

    Alors que ce que l'on souhaite c'est :

    le constructeur du bean->les getters->les setters->gestion de l'event->les getters

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2008
    Messages : 179
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par koack Voir le message
    Re,

    Pourquoi avoir mis @PostConstruct sur la methode qui gere l'event ?
    Parceque je suis définitivement et indécrottablement incapable de copier/coller sans laisser glisser une erreur! On est bien d'accord, toutefois.

    Pour continuer... en fait, j'arrive finalement bien à récupérer mon événement, mais pas sur tous les items (certains semblent ne pas déclencher mon listener). Mais ça, c'est très probablement un problème autre... auquel je m'attaque aussitôt. En tous les cas, je progresse, et c'est un très bon point!

    Pour terminer, je te remercie beaucoup pour tes précieux conseils. Je connais JSF un petit peu mieux (ou un peu moins mal) grâce à toi!
    Roger l'Âne: le lapin devenu grand....
    _______________________________________________________________
    Développeur bio-informatique; spécialiste en rien, généraliste en tout.

    Capitan ! Capitan ! On a aperçu le Loup ! Il a pris d'assaut une chaise à porteurs, à l'aide d'un cul-de-jatte et d'un lapin !
    (Pavillon noir !, Alain Ayroles/Jean-Luc Masboux, éd. Delcourt, coll. Terres de Légendes, 1997, p. 18)

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/05/2014, 12h21
  2. Parametrer la couleur de fonds d'une page en fonction d'une autre
    Par miklbet dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 09/06/2011, 11h21
  3. Réponses: 1
    Dernier message: 20/01/2007, 14h06
  4. [Frames] un lien vers une page de Frames vers une page sans
    Par jamesleouf dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 23/09/2005, 18h25
  5. inserer une page php externe dans une page JSP
    Par vrossi59 dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/07/2005, 16h25

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