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 :

Pb selectOneMenu dans dataTable


Sujet :

JSF Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut Pb selectOneMenu dans dataTable
    Bonjour,

    Je développe depuis peu une nouvelle application avec JSF 1.2 et richFaces 3.3.0GA.

    En suivant la 3ème méthode de la FAQ, j'arrive bien à MAJ chacune de mes lignes en utilisant un setPropertyActionListener.
    Par contre, je me trouve devant une impasse lorsque j'utilise un selectOneMenu dans une de mes colonnes.
    En effet, seule la dernière ligne de ma table prends en compte la nouvelle valeur alors que les autres gardent l'ancienne lors de la MAJ.

    Existe-t-il une bonne pratique que je n'ai pas mise en œuvre ?
    Es-ce un problème connu ? Quels solutions adopter ?

    Ma page xhtml:

    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
    <rich:dataTable id="tableMessage" cellpadding="0" cellspacing="0" 
                        width="700" border="0" var="mess" value="#{messageBean.messages}"
                        rowClasses="fondBlanc,fondCouleur">
     
    	    			<f:facet name="header">
                            <rich:columnGroup styleClass="fondCouleur">
                                <rich:column breakBefore="true"><h:outputText value="Message" /></rich:column>
                                <rich:column width="1%"><h:outputText value="Cible" /></rich:column>
                                <rich:column width="1%"><rich:spacer width="17" height="10"/></rich:column>
                            </rich:columnGroup>
                        </f:facet>
     
    	    			<rich:column colspan="1">
    	    				<h:inputText styleClass="sansBord" value="#{mess.corpsMessage}"/>
    	    			</rich:column>
     
    	    			<rich:column colspan="1">
    	    				<h:selectOneMenu id="selectTypeId" styleClass="sansBord" value="#{mess.typeUtilisateur.idTypeUtilisateur}" >
    	    					<f:selectItems value="#{messageBean.tousLesTypesUtilisateurs}"/>
    	    				</h:selectOneMenu>
    	    			</rich:column>
     
    	    			<rich:column colspan="1">
    	    				<h:commandLink action="#{messageBean.processSauvMessage}" >
    	    					<h:graphicImage value="../images/valider.jpg" width="17" height="17" title="Valider les modifications" />
    	    						<f:setPropertyActionListener value="#{mess}" target="#{messageBean.messToSave}" />
    	    				</h:commandLink>
    	    			</rich:column>
     
    	    		</rich:dataTable>
    Mon BackingBean:

    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
    public class MessageBBean {
     
    	private List<Message> messages;
    	private List<SelectItem> tousLesTypesUtilisateurs;
    	private Message messToSave;
     
    	public MessageBBean() {
    	}
     
    	public List<Message> getMessages() {
    		return messages;
    	}
     
    	public void setMessages(List<Message> messages) {
    		this.messages = messages;
    	}
     
    	public List<SelectItem> getTousLesTypesUtilisateurs() {
    		return tousLesTypesUtilisateurs;
    	}
     
    	public void setTousLesTypesUtilisateurs(
    			List<SelectItem> tousLesTypesUtilisateurs) {
    		this.tousLesTypesUtilisateurs = tousLesTypesUtilisateurs;
    	}
     
    	public Message getMessToSave() {
    		return messToSave;
    	}
     
    	public void setMessToSave(Message messToSave) {
    		this.messToSave = messToSave;
    	}
     
    	public String initMessages(){
    		try {
    			List<TypeUtilisateur> l = MessageDelegate.getAllTypeUtilisateurs();
    			this.tousLesTypesUtilisateurs = new ArrayList<SelectItem>();
    			for(TypeUtilisateur t : l){
    				this.tousLesTypesUtilisateurs.add(new SelectItem(t.getIdTypeUtilisateur(),t.getLibelleTypeUtilisateur()));
    			}
    			this.messages = MessageDelegate.getAllMessages();
    		} catch (Exception e) {
    			e.printStackTrace();
    			return "retourAccueil";
    		}
    		return "h1MessageGestion";
    	}
     
    	public void processSauvMessage(){
     
    		this.messToSave = MessageDelegate.updateMessage(this.messToSave);		
    		String rien = initMessages();
    		FacesContext.getCurrentInstance().renderResponse();
    	}

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu fais où la MAJ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Bonjour et merci de ton intérêt,

    Je fais la MAJ via un commandLink sur chaque ligne. J'utilise un "setPropertyActionListener" pour passer l'objet sélectionne comme dans la méthode 3 de la FAQ. Le tout pointe vers la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void processSauvMessage(){
     
    		this.messToSave = MessageDelegate.updateMessage(this.messToSave);		
    		String rien = initMessages();
    		FacesContext.getCurrentInstance().renderResponse();
    	}
    J'attaque mes EJB3 via une classe MessageDelegate à qui je délègue tous les appels JNDI (je suis sur jboss 4.x qui ne supporte pas l'injection @EJB).

    Je précise que mon entity Message comprend un objet TypeUtilisateur et que c'est justement celui là qui n'est pas mis à jour. Le problème étant que "messToSave" ne contient pas la valeur modifiée par le "selectOneMenu" lorsque je le reçoit dans ma fonction de MAJ.

    Merci d'avance...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Personne n'aurait une idée ?
    Quelque chose que j'aurais mal fait ou que je n'aurais pas fait ?

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par wushual1 Voir le message
    Personne n'aurait une idée ?
    Quelque chose que j'aurais mal fait ou que je n'aurais pas fait ?
    Je ne comprend pas ton problème..

    la valeur du selectOneMenu correspond à chaque ligne du bean, pour faire l'update tu récupère une ligne..
    cette valeur ne correspond pas à ce que tu as saisi?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Exactement !!

    En fait, lorsque je récupère ma ligne et que je regarde la valeur correspondant à ce que doit modifier mon selectOneMenu (en l'occurrence un objet TypeUtilisateur), j'ai l'ancienne valeur.

    De plus, je me suis aperçu que seule la dernière ligne de mon tableau récupère la valeur modifiée (celle que je veux effectivement sauvegarder)...

    Ajout:

    En fait dans chaque ligne de mon tableau, j'ai un objet message:
    Long id
    String corpsMessage
    TypeUtilisateur type
    Date dateFinVal

    Dans la colonne correspondant au type, j'utilise un selectOneMenu qui est une List<SelectItem> remplie avec (idType.toString(), libType).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Je dois mal m'y prendre.

    Lorsque vous avez une liste de Produits lProduits qui contiennent tous leur catégorie correspondante:
    P1[idProduit,nomProduit,cat1] avec cat1[idCateg,nomCateg]
    P2...
    P3...

    Vous désirez les mettre dans un dataTable (ça c'est bon) mais pour gérer les changements de catégories, vous désirez utiliser un selectOneMenu (on a à dispo une liste des catégories lCategorie(selectItem[idCateg,nomCateg])).

    Pouvez-vous me mettre un exemple de code permettant d'afficher la bonne catégorie correspondante à la ligne du produit et côté BackingBean, la fonction d'update Correspondante.

    J'ai l'impression d'être passé à côté de quelque chose d'important mais je ne vois pas quoi...

  8. #8
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    le selectOneMenu ne se positionne pas sur la bonne valeur quand la table est affichée.?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Si, lorsque j'arrive sur ma page, la table est initialisée avec les bonnes valeurs.

    Là, je change la valeur du typeUtilisateur d'un message du tableau (aucune action effectuée côté BackingBean) puis je clique sur mon commandLink de validation de la ligne.

    Côté BackingBean, le message que je reçois a toujours l'ancienne valeur du typeUtilisateur et non, celle que j'ai positionné.

    Chose étrange: seule la dernière ligne de ma liste de Message reçoit la valeur que j'ai modifiée (en bref, ça fonctionne uniquement sur le dernière ligne). De plus, ça fonctionne aussi lorsqu'après avoir modifié la dernière ligne, j'assigne à la ligne précédente, la même valeur que la dernière ligne...

  10. #10
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    dans la méthode dans le bean

    récupère la ligne courante comme ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TonBean bean = (TonBean ) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("mess");
    et regarde la valeur du selectOneMenu si c'est la bonne valeur ou pas..

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Malheureusement, j'obtiens la même valeur que dans mon messToSave passé via:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <f:setPropertyActionListener value="#{mess}" target="#{messageBean.messToSave}"
    à savoir l'ancienne valeur...

    Doit-on normalement associer une action particulière lorsqu'on manipule le selectOneMenu ?

  12. #12
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par wushual1 Voir le message
    Malheureusement, j'obtiens la même valeur que dans mon messToSave passé via:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <f:setPropertyActionListener value="#{mess}" target="#{messageBean.messToSave}"
    à savoir l'ancienne valeur...

    Doit-on normalement associer une action particulière lorsqu'on manipule le selectOneMenu ?

    bizard

    essaye de faire dans le selectOneMenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a4j:support event="onchange" reRender="table" />

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Dans ce cas là, juste après la modification de selectOneMenu, il me raffiche la table avec l'ancienne valeur...

  14. #14
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par wushual1 Voir le message
    Dans ce cas là, juste après la modification de selectOneMenu, il me raffiche la table avec l'ancienne valeur...
    tu as bien la table dans un formulaire..?
    normalement ouii d'autres input fonctionne bien...
    je teste chez moi..je te tiens au courant

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Oui, la table est bien dans un formulaire

    Je te remercie d'avance de regarder car, je commence à vraiment sécher sur le problème là ;p

  16. #16
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par wushual1 Voir le message
    Oui, la table est bien dans un formulaire

    Je te remercie d'avance de regarder car, je commence à vraiment sécher sur le problème là ;p
    ça fonctionne bien chez moi..

    regarde la déclaration de ton bean dans le faces-config

    est ce que typeUtilisateur est bien déclaré..

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Hum, je n'ai pas de bean typeUtilisateur dans mon faceconfig !!

    J'ai juste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <managed-bean>
      <managed-bean-name>messageBean</managed-bean-name>
      <managed-bean-class>bean.MessageBBean</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
     </managed-bean>
    Qu'entends-tu exactement ?

  18. #18
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    faut l'ajouter et ajoute la property typeUtilisateur avec la valeur #{typeUtilisateur }

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Je ne comprends pas bien.
    Je dois ajouter un property dans mon messageBean avec la valeur #{typeUtilisateur} tel que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <managed-bean>
      <managed-bean-name>messageBean</managed-bean-name>
      <managed-bean-class>bean.MessageBBean</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
      <managed-property>
       <property-name>typeUtilisateur</property-name>
       <property-class>com.sigat.entity.TypeUtilisateur</property-class>
       <value>#{typeUtilisateur }</value>
      </managed-property>
     </managed-bean>
    Et ajouter dans mon messageBean:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private TypeUtilisateur typeUtilisateur;
     
    public TypeUtilisateur getTypeUtilisateur() {
    		return typeUtilisateur;
    	}
     
    	public void setTypeUtilisateur(TypeUtilisateur typeUtilisateur) {
    		this.typeUtilisateur = typeUtilisateur;
    	}
    Si c'est bien ça, rien ne change dans le comportement de mon tableau...

    Edit: Si tu pouvais me montrer ce que tu as fait stp...

  20. #20
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <managed-bean>
      <managed-bean-name>messageBean</managed-bean-name>
      <managed-bean-class>bean.MessageBBean</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
      <managed-property>
       <property-name>typeUtilisateur</property-name>
       <value>#{typeUtilisateur }</value>
      </managed-property>
     </managed-bean>
    <managed-bean>
      <managed-bean-name>typeUtilisateur</managed-bean-name>
      <managed-bean-class>com....TypeUtilisateur</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
     </managed-bean>

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/02/2012, 22h14
  2. SelectOneMenu dans un dataTable
    Par amarmama dans le forum JSF
    Réponses: 4
    Dernier message: 25/04/2008, 19h41
  3. Réponses: 3
    Dernier message: 29/12/2006, 16h11
  4. panelTab dans dataTable
    Par Alec6 dans le forum JSF
    Réponses: 4
    Dernier message: 30/11/2006, 18h59
  5. Réponses: 2
    Dernier message: 07/07/2005, 11h47

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