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 :

c:choose / when / otherwise - ne fonctionne pas


Sujet :

JSF Java

  1. #1
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut c:choose / when / otherwise - ne fonctionne pas
    Bonjour,

    J'ai un cas qui parait tout simple, mai qui au final ne fonctionne pas .
    J'ai un bean qui contient 2 champs, un seul de ces 2 champs peut être renseigné dans le bean.

    Dans un tableau qui affiche ce bean, j'ai une colonne dans laquelle j'aimerais conditionner l'affichage de ces champs pour toujours afficher celui qui est renseigné :

    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
     
    <p:dataTable 	id="identites"
    	value="#{gestionIdentitesForm.listIdentites}" 
    	var="identite" widgetVar="identiteTable" filteredValue="#{gestionIdentitesForm.listIdentitesFiltered}"
    	emptyMessage="#{msg['AucuneIdentiteAAfficher']}" 
    	sortMode="multiple"
    	rowKey="#{identite.id}" paginator="true" paginatorPosition="bottom"  
    	rows="10" style="margin-bottom:10px" 
    	paginatorTemplate=" {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
    	rowsPerPageTemplate="10,30,50">
     
    ...
     
    <p:column headerText="#{msg['Localite']}" style="width:10%">
    		<!-- Test pour savoir s'il faut afficher la localité préenregistrée ou la localité libre -->
           		<c:choose>
           			<c:when test="${not empty identite.adressePrincipale.localite.nom}">#{identite.adressePrincipale.localite}</c:when>
           			<c:when test="${not empty identite.adressePrincipale.localiteLibre}">#{identite.adressePrincipale.codePostalLibre} #{identite.adressePrincipale.localiteLibre}</c:when>
    			<c:otherwise>#{msg[AucuneLocaliteRenseignee]}</c:otherwise>	
           		</c:choose>
    </p:column>
     
    ...
    </p:dataTable>
    Les champs du bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Localité préengistrée, en tant qu'objet
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Localite localite;
     
    // Code postal étranger, en saisie libre
    @Column(name = "CODE_POSTAL_LIBRE", length = 100)
    private String codePostalLibre;
     
    // Localité étrangère, en saisie libre
    @Column(name = "LOCALITE_LIBRE", length = 100)
    private String localiteLibre;
    Le problème est que rien n'est affiché dans la colonne, ni même "Aucune localité renseignée" qui correspond au cas otherwise.
    Qqun a-t-il une idée de ce qu'il me manque ?

    Merci d'avance pour votre aide

  2. #2
    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
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <c:when test="#{not empty identite.adressePrincipale.localite.nom}">
    PS : Pour ton autre problème, j'ai trouvé une autre solution
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    J'ai regardé 50 exemples mais j'ai pas été foutu de remarquer que c'était un # et pas un $
    Mais il doit y avoir encore un truc car ça ne marche pas encore. Ca affiche toujours rien

    Oui j'ai vu pour l'autre problème, c'est cool, merci :-)

  4. #4
    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
    Billets dans le blog
    1
    Par défaut
    ça devrait ressembler à ceci
    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
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:c="http://java.sun.com/jsp/jstl/core"
        xmlns:p="http://primefaces.org/ui">
         
        <h:body>
    
            <h:form id="form1">
    
            <c:choose>
                <c:when test="#{not empty testManager.statut.libelle}">
                    <h:outputText value="le libellé n'est pas vide"/>
                </c:when>
                
                <c:when test="#{testManager.statut.uid == 1}">
                    <h:outputText value="Option 1"/>
                </c:when>
    
                <c:when test="#{testManager.statut.uid == 2}">
                    <h:outputText value="Option 2"/>
                </c:when>
    
                <c:otherwise>
                    <h:outputText value="Ce n'est ni l'option 1, ni l'option 2"/>
                </c:otherwise>
            </c:choose>
            
            </h:form>
                    
        </h:body>
    </html>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Oui c'est bien ça :
    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
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    <ui:composition template="../../secured/modele/template.xhtml"
    	xmlns="http://www.w3.org/1999/xhtml"
    	xmlns:h="http://java.sun.com/jsf/html"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:p="http://primefaces.org/ui"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
    	xmlns:c="http://java.sun.com/jsp/jstl/core">
    	<ui:define name="contenu">
    		<h:form id="gestionIdentitesForm">
    			
    			<!-- <p:growl id="messages" life="2000" />  -->
    			
    			<!-- Dialogue de confirmation de suppression d'une identité -->
    			<p:dialog header="#{msg['ConfirmerLaSuppression']}" widgetVar="confDeleteDlg" resizable="false" id="confDelDlg"
                                showEffect="fade" hideEffect="fade" >
                	<p:outputLabel value="#{msg['EtesVousSurDeVouloirSupprimerCetteIdentite']}" />
                    <div align="center">
    	                <h:panelGrid id="display" columns="2" cellpadding="10">
    	                	<p:commandButton id="deleteButton" action="#{gestionIdentitesForm.supprimerIdentite}" oncomplete="PF('confDeleteDlg').hide()" 
    	                            update=":gestionIdentitesForm:identites, messages" value="#{msg['Oui']}" />
    	                	<p:commandButton id="cancelButton" onclick="PF('confDeleteDlg').hide()" value="#{msg['Non']}"/>
    	                </h:panelGrid>
                    </div>
                </p:dialog>
    			
    			<!-- Tableau d'affichage des identités -->
    			<h2>
    				<h:outputText value="#{msg['GestionDesIdentites']}" />
    			</h2>
    			
    			<p:dataTable 	id="identites"
    							value="#{gestionIdentitesForm.listIdentites}" 
    							var="identite" widgetVar="identiteTable" filteredValue="#{gestionIdentitesForm.listIdentitesFiltered}"
    							emptyMessage="#{msg['AucuneIdentiteAAfficher']}" 
    							sortMode="multiple"
    							rowKey="#{identite.id}" paginator="true" paginatorPosition="bottom"  
    							rows="10" style="margin-bottom:10px" 
    							paginatorTemplate=" {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
    							rowsPerPageTemplate="10,30,50">
    							
    				<f:facet name="header">
                		<p:outputPanel>
                			<div align="left">
                				<p:link outcome="saisirIdentite" value="# #{msg['AjouterUneIdentite']}" />
                    		</div>
                		</p:outputPanel>  
            		</f:facet>
    						
    				<p:column headerText="#{msg['ID']}" style="width:3%" rendered="#{gestionIdentitesForm.userSuperAdmin}" >
    	         		<h:outputText value="#{identite.id}" />
    	       		</p:column>
    	       		
    	       		<p:column filterBy="#{identite.typeIdentiteCi}" filterMatchMode="exact" headerText="#{msg['Type']}" style="width:8%">
    	       			<f:facet name="filter">
                   	 		<p:selectOneMenu onchange="PF('identites').filter()" >
                        		<f:selectItem itemLabel="#{msg['Type']}" itemValue="#{null}" noSelectionOption="true" />
                        		<f:selectItems value="#{gestionIdentitesForm.listTypeIdentite}" />
                    		</p:selectOneMenu>
                		</f:facet>
    
    					<h:outputText value = "#{identite.typeIdentiteCi.abrege}" />
    	        	</p:column>
    	       		
    				<p:column sortBy="#{identite.nom}" headerText="#{msg['Nom']}" style="width:10%" filterBy="#{identite.nom}" filterMatchMode="contains" >
    	          		 <h:outputText value="#{identite.nom}" />
    	        	</p:column>
    				
    				<p:column filterBy="identite.prenom" filterMatchMode="contains" sortBy="#{identite.prenom}" headerText="#{msg['Prenom']}" style="width:10%">
    	          		#{identite.prenom}
    	        	</p:column>
    	        	
    	        	<p:column filterBy="identite.raisonSociale" filterMatchMode="contains" sortBy="#{identite.raisonSociale}" headerText="#{msg['RaisonSociale']}" style="width:20%">
    	          		#{identite.raisonSociale}
    	        	</p:column>
    	        	
    	        	<p:column headerText="#{msg['Rue']}" style="width:15%">
    	          		#{identite.adressePrincipale.rueNumero}
    	        	</p:column>
    	        	
    	        	<p:column headerText="#{msg['Localite']}" style="width:10%">
    	          		<!-- Test pour savoir s'il faut afficher la localité suisse ou la localité libre -->
    	          		<c:choose>
    	          			<c:when test="#{not empty identite.adressePrincipale.localite.nom}">
    	          				#{identite.adressePrincipale.localite}
    	          			</c:when>
    	          			<c:when test="#{not empty identite.adressePrincipale.localiteLibre}">
    	          				#{identite.adressePrincipale.codePostalLibre} #{identite.adressePrincipale.localiteLibre}
    	          			</c:when>
    						<c:otherwise>
    							#{msg[AucuneLocaliteRenseignee]}
    						</c:otherwise>	
    	          		</c:choose>
    	        	</p:column>	        	
    	        	<p:column headerText="#{msg['NoTelProf']}" style="width:8%">
    	          		#{identite.adressePrincipale.noTelProf}
    	        	</p:column>
    	        	
    	        	<p:column headerText="#{msg['NoTelMobile']}" style="width:8%">
    	          		#{identite.adressePrincipale.noTelMobile}
    	        	</p:column>
    	        	
    	        	<p:column headerText="#{msg['NoTelPrive']}" style="width:8%">
    	          		#{identite.adressePrincipale.noTelPrive}
    	        	</p:column>
    	        	
    	        	<p:column headerText="#{msg['Email']}" style="width:15%">
    	          		#{identite.adressePrincipale.email}
    	        	</p:column>
     	        	
    	        	<p:column headerText="#{msg['Actions']}" style="width:7%">
    	          		<p:link value="# #{msg['Modifier']}" outcome="saisirIdentite" >
                 			<f:param name="idIdentite" value="#{identite.id}" />
             	 		</p:link>
    					/
             	 		<p:commandLink value="# #{msg['Supprimer']}" onclick="PF('confDeleteDlg').show()" >
             	 			<f:setPropertyActionListener target="#{gestionIdentitesForm.selectedIdentite}" value="#{identite}"/>
             	 		</p:commandLink>
    	        	</p:column> 
    			</p:dataTable>
    			
    		 	<p:messages id="messages" autoUpdate="true" globalOnly="true" />
     		</h:form>
    	</ui:define>
    </ui:composition>
    Peut-être que ça vient du bean ?
    Identite :
    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
     
    @OneToMany(mappedBy = "identite", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Adresse> adresses;
     
    public Adresse getAdressePrincipale() {
    		if (adresses != null && !adresses.isEmpty()) {
    			for (Adresse adresse : adresses) {
    				if (TypeAdresseCi.PRINCIPALE.equals(adresse.getTypeAdresse())) {
    					return adresse;
    				}
    			}
    		}
     
    		return null;
    }
    Ou Adresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Localité pré-enregistrée, en tant qu'objet
    	@ManyToOne(cascade = CascadeType.MERGE)
    	@JoinColumn(name = "AD_LOCALITE_ID")
    	private Localite localite;

  6. #6
    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
    Billets dans le blog
    1
    Par défaut
    Je dirais que ça ne vient pas de l'entity mais que c'est peut-être lié à ton paramétrage et à ta requête.
    Comme tu as positionné le chargement à Lazy, il se pourrait que la propriété n'est pas été chargée.
    Ça se traduirait par une erreur franche avec du code java mais via les EL, ça peut passer inaperçu.

    Quand tu veux utiliser des sous-attributs en Lazy loading dans une page, tu as (en gros) 2 possibilités :

    - garder l'entity "attaché" pendant tout le traitement (jusqu'à la fin de la réponse)
    - charger les données dont tu auras besoin dans la vue par la requête à l'aide de l'instruction "join fetch" ou "left join fetch"

    Quelle techno utilises-tu ? EJB ou DAO classique ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    J'utilise les EJB, par contre je comprends pas bien comment l'une ou l'autre des 2 solutions

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu peux commencer par ceci et dire ce que ça affiche?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <p:column headerText="#{msg['Localite']}" style="width:10%">
           			localité :#{identite.adressePrincipale.localite}
           			localité libre: #{identite.adressePrincipale.codePostalLibre} #{identite.adressePrincipale.localiteLibre}
           		<c:choose>
           			<c:when test="${not empty identite.adressePrincipale.localite.nom}">localité choisi</c:when>
           			<c:when test="${not empty identite.adressePrincipale.localiteLibre}">localité libre choisi</c:when>
    			<c:otherwise>autre</c:otherwise>	
           		</c:choose>
    </p:column>

  9. #9
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Les 2 premières lignes affichent les bonnes valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    localité :#{identite.adressePrincipale.localite}
    localité libre: #{identite.adressePrincipale.codePostalLibre} #{identite.adressePrincipale.localiteLibre}
    Par contre le choose affiche toujours "autre"

  10. #10
    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
    Billets dans le blog
    1
    Par défaut
    Avec les EJB, ta requête devrait ressembler à ceci quand tu as une relation manyToOne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Query query = getEntityManager().createQuery("select a from EntiteA a left join fetch a.pays");
    Pour les sous-listes, c'est un peu plus aléatoire (produit cartésien entre les tables) mais tu peux faire ta requête et ensuite faire une boucle de traitement et charger les propriétés sous-jacentes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (EntityA a : maListeEntityAs)
    {
       for (Pays p : a.getPays())
       {
          p.getLocalite().getLibelle();
    ...
       }
    }
    Ce n'est pas forcément terrible, tu imagines bien

    Il serait préférable d'accéder directement à la liste d'entité Pays en passant par une sous-requête de sélection (" where idPays in (...) ").

    Bref, je n'ai pas la structure de ta base de données pour faire plus précis mais ce sont des manières de faire ... et il y en a d'autres
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par doons Voir le message
    Les 2 premières lignes affichent les bonnes valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    localité :#{identite.adressePrincipale.localite}
    localité libre: #{identite.adressePrincipale.codePostalLibre} #{identite.adressePrincipale.localiteLibre}
    Par contre le choose affiche toujours "autre"
    Arf j'avais pas vu ton test est différent de ce que tu affiche. Affiche ceci?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    localité :#{identite.adressePrincipale.localite.nom}
    localite peut afficher quelque chose mais avec nom vide.

    Aussi, tu va probablement devoir utiliser autre chose que c:choose. Mon JSF commence à être loin, mais autant que je sache, le jstl choose est évalué durant la construction de la vue, hors, ton bean identite prend sa valeur durant la phase de rendu, quand le choose a déjà choisi depuis longtemps quel tag serait présent dans ta vue. JSF en quelque sorte parse la vue en un arbre en mémoire. Ensuiter, il parcoure cet arbre, avec certains noeud comme datatable qui processent leur contenu N fois en fonction de leur value. Mais la JSTL interviens lors de la construction de l'arbre. Une sorte de preprocessing.
    Pour afficher conditionellement certains éléments, en JSF, on utilise normalement l'attribut rendered:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:outputText value="#{identite.adressePrincipale.localite}" rendered="#{not empty identite.adressePrincipale.localite.nom}"/>

    Pour dire les chose autrement, la jstl sert à faire du templating, elle coupe ou change des bout du document jsp en fonction de paramètre. JSF est un système basé sur la création de composant. Ces composants sont créé une et une seule fois par utilisateur, peu importe le nombre d'affichages de la page.

  12. #12
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    J'ai utilisé rendered et ça fonctionne très bien

    Merci

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

Discussions similaires

  1. Trigger When-Button-Pressed ne fonctionne pas
    Par saviola_lafayette dans le forum Forms
    Réponses: 1
    Dernier message: 18/01/2014, 20h31
  2. Trigger When-Button-Pressed ne fonctionne pas
    Par Finol dans le forum Forms
    Réponses: 5
    Dernier message: 20/12/2012, 15h18
  3. [XSL] Choose when otherwise
    Par sacha69 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 18/03/2009, 14h25
  4. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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