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 :

Propriétés d'un bean mis à null lors de la validation


Sujet :

JSF Java

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut Propriétés d'un bean mis à null lors de la validation
    Bonjour à tous,

    Alors voila, je vais m'efforcer d'expliquer clairement mon problème.

    J'ai 2 pages JSF. Une qui affiche une liste de catégories et 1 qui permet d'en modifier 1.

    Une catégorie est définie par un id, un name et une description.

    Ma page de liste fonctionne très bien et redirige vers ma page de modification correctement par le biais de ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <p:commandButton ajax="false" action="#{NavigationBean.goDetailCategory}" icon="ui-icon-search" title="Voir la fiche">  
    					<f:setPropertyActionListener value="#{category}" target="#{CategoryDetailBean.category}" />  
    				</p:commandButton>
    Comme vous pouvez le voir, j'ai un bean CategoryDetailBean que j'ai défini dans le fichier faces-config comme suit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <managed-bean>
    		<managed-bean-name>CategoryDetailBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.CategoryDetailBean</managed-bean-class>
    		<managed-bean-scope>request</managed-bean-scope>
    	</managed-bean>
    La page s'affiche correctement avec uniquement le nom et la description (l'id est utilisé pour la base de données.

    Le problème viens de la modification. J'ai une exception comme quoi l'id est null. En effet il l'est malgré qu'il soit bien défini. Cf les logs de mon projet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CategoryDetailBean - Appel du setter : 5
    CategoryDetailBean - Appel du getter : 5
    CategoryDetailBean - Appel du getter : 5
    CategoryDetailBean - Appel du getter : 5
    CategoryDetailBean - Appel du getter : null
    CategoryDetailBean - Appel du getter : null
    CategoryDetailBean - Appel du getter : null
    CategoryDetailBean - Appel du getter : null
    CategoryDetailBean - Appel du getter : null
    CategoryDetailBean - Appel du getter : null
    CategoryDetailBean - bla bla
    CategoryDetailBean - 
    CategoryDetailBean - COMMERCIALE
    Le premier setter interviens lors de la navigation (grâce au f:setPropertyActionListener. Les 3 getters sont appelés au chargement de ma page ==> Ils ont l'air corrects la valeur de l'id est bien récupérée...

    Par contre, dès que je clique pour valider, la boum, mon id repasse à null. Les autres valeurs sont ok.


    Voici ma page de détail :
    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:p="http://primefaces.org/ui">
    <ui:composition>
    	<h:form>
    		<h3><h:outputText value="Modification d'une catégorie"/></h3>
     
    		<p:messages/>
     
    		<h:panelGrid columns="2" cellpadding="5px">	
    			<h:outputLabel value="Nom de la catégorie :" for="name"></h:outputLabel>  
                <p:inputText id="name" value="#{CategoryDetailBean.category.name}" required="true" requiredMessage="Vous devez entrer un nom pour la catégorie"/>  
     
                <h:outputLabel value="Description :" for="description"></h:outputLabel>  
                <p:editor id="description" value="#{CategoryDetailBean.category.description}" width="600"/> 
    		</h:panelGrid>
    		<br/>
    		<p:commandButton value="Valider" action="#{CategoryDetailBean.update}" ajax="false"/>
     
    	</h:form>
    </ui:composition>
    </html>
    et voici mon 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
    package com.harsze.timetracer.bean;
     
    import java.io.Serializable;
     
    import javax.faces.context.ExternalContext;
    import javax.faces.context.FacesContext;
    import javax.servlet.http.HttpSession;
     
    import org.apache.log4j.Logger;
     
    import com.harsze.timetracer.entity.Category;
    import com.harsze.timetracer.model.functional.CategoriesModel;
    import com.harsze.timetracer.util.HarszeToolkit;
     
    public class CategoryDetailBean extends BaseBean implements Serializable{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = -8684894588850123951L;
     
    	private Category	category;
     
    	public CategoryDetailBean()
    	{ 
    		logger = Logger.getLogger(CategoryDetailBean.class);
    	}
     
    	public void setCategory(Category category){
    		logger.debug("Appel du setter : "+category.getId());
    		this.category = category;
    	}
     
    	public Category getCategory(){
    		if (this.category == null)
    			this.category = new Category();
    		logger.debug("Appel du getter : "+this.category.getId());
    		return this.category;
    	}
     
    	public String update() throws Exception{	
     
    		logger.debug(this.category.getDescription());
    		logger.debug(this.category.getId());
    		logger.debug(this.category.getName());
    		CategoriesModel.UpdateCategory(this.category);
     
    		HarszeToolkit.FacesMessage("Catégorie modifiée avec succès.");
     
    		NavigationBean nb = (NavigationBean) HarszeToolkit.getBean("NavigationBean");
    		return nb.setRedirect("com_categories","list_categories");
    	}	
    }
    Donc pour solutionner le problème, je suis obligé de mettre mon id dans le page par exemple par ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    			<h:inputHidden value="#{CategoryDetailBean.category.id}"/>
    Mais je trouve ca illogique. La valeur de l'id est récupérer depuis le précédent bean et non modifiable alors je n'ai pas besoin de la mettre sur ma page.

    Qu'en pensez-vous ?

    Et merci pour les réponses :-)

    Lucas

  2. #2
    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
    en fait ta seconde page ne doit pas être en redirect (je le suppose car tu ne montres pas le fichier de navigation faces-config.xml)

    donc ton bean existe bien entre ta page 1 et ta page 2 parce qu'il font partie de la même "request" (puisque ton bean est aussi en request) et voilà pourquoi l'affichage se passe bien.

    en revanche, au second click, le request n'est plus du tout le même et donc un nouveau bean est instancié ... et du coup c'est null.

    Essaye avec ton bean en @ViewScoped, voire en @SessionScoped.

    enfin si tu es en JSF 2, tu peux utiliser les f:viewParam et f:metadata pour faire proprement ce genre de choses :
    http://mkblog.exadel.com/2010/07/lea...-page-actions/

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut
    Citation Envoyé par fxrobin Voir le message
    en fait ta seconde page ne doit pas être en redirect (je le suppose car tu ne montres pas le fichier de navigation faces-config.xml)

    donc ton bean existe bien entre ta page 1 et ta page 2 parce qu'il font partie de la même "request" (puisque ton bean est aussi en request) et voilà pourquoi l'affichage se passe bien.

    en revanche, au second click, le request n'est plus du tout le même et donc un nouveau bean est instancié ... et du coup c'est null.

    Essaye avec ton bean en @ViewScoped, voire en @SessionScoped.

    enfin si tu es en JSF 2, tu peux utiliser les f:viewParam et f:metadata pour faire proprement ce genre de choses :
    http://mkblog.exadel.com/2010/07/lea...-page-actions/
    Merci pour ces précisions.
    Je vous tiens au courant si ca marche.

  4. #4
    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
    ou encore, autre idée

    comme tu es en primefaces, utilise un p:dialog pour ouvrir une fenetre d'édition sur un lien de ton tableau, par exemple (ou un bouton) dans ton p:dialog il y a le form de mise à jour, une fois fermé, tu "update" le tableau avec AJAX et le tour est joué :-)

    si tu n'y arrives je posterai plus tard une petite démo de cela.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut
    euh alors effectivement je veux bien un exemple. Je suis assez novice en JSf de manière générale

    Juste pour compléter, mon bean de recherche est effectivement en request et l'autre aussi. Le passage entre les deux se fait par le biais d'un outcome (J'ai un NavigationBean. C'est assez compliqué mon truc finalement car j'ai un template a la joomla. Mon navigation bean stocke un composant et une view et grace a ca je passe tout sur une page unique (comme sur joomla) et je charge dynamiquement le contenu avec un ui-include de la sorte :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div id="contentpanel">
    		<p:panel id="contentPanelTab" style="min-height:500px">
    			<ui:include src="/faces/components/#{NavigationBean.component}/#{NavigationBean.view}.xhtml"/>  
    		</p:panel>
    	</div>
    Bon je vais coucher la fille et je reviens :-)

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut
    Alors juste pour confirmer, j'ai passé mes beans en session (car bizarrement view ca ne marchait pas) et la c'est ok. Par contre, du coup c'est pas très bon....

    Aussi j'ai une question. J'ai déclaré mes beans dans le fichier faces-config.xml, j'ai vu des gens mettre les annotations @managedBean et @viewscooped, etc. au niveau de leur java. Alors quelle différence entre les 2 ? Dois je le faire dans les 2 fichiers ?? Je ne comprends pas tout là :-)

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut
    Voici mon faces config :
    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
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
     
    <?xml version="1.0"?>
    <!DOCTYPE faces-config PUBLIC
      "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
      "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
     
    <faces-config>
    <!--  locale de lapplication -->	
    	<application>
    		<message-bundle>resources.ApplicationMessage</message-bundle>
    		<locale-config>
    			<default-locale>fr</default-locale>
    			<supported-locale>fr</supported-locale>
    			<supported-locale>en</supported-locale>
    		</locale-config>
    		<resource-bundle>
    			<base-name>messages</base-name>
    			<var>msg</var>
    		</resource-bundle>
    	</application>
     
    	<!-- NAVIGATION RULES -->
    	<!--  Page de connexion -->
    	<navigation-rule>
    		<from-view-id>/faces/connect.xhtml</from-view-id>
    		<navigation-case>
    			<from-outcome>Accepted</from-outcome>
    			<to-view-id>/faces/mainpage.xhtml</to-view-id>
    		</navigation-case>
    	</navigation-rule>
     
    	<!--  règles de navigation -->	
    	<navigation-rule>
    		<from-view-id>/faces/mainpage.xhtml</from-view-id>
    		<navigation-case>
    			<from-outcome>REDIRECT</from-outcome>
    			<to-view-id>/faces/mainpage.xhtml</to-view-id>
    		</navigation-case>
    		<navigation-case>
    			<from-outcome>KO</from-outcome>
    			<to-view-id>/faces/error.xhtml</to-view-id>
    		</navigation-case>
    		<navigation-case>
    			<from-outcome>LOGOUT</from-outcome>
    			<to-view-id>/faces/connect.xhtml</to-view-id>
    		</navigation-case>
    	</navigation-rule>	
     
    	<!--  BEANS -->
    	<!--  Page de connexion -->
    	<managed-bean>
    		<managed-bean-name>SecurityBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.SecurityBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    	</managed-bean>	
    	<managed-bean>
    		<managed-bean-name>WidgetsBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.WidgetsBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    		<managed-property>
    			<property-name>company</property-name>
    			<value>#{SecurityBean.company}</value>
    		</managed-property>
    	</managed-bean>	
    	<!-- Bean de menu -->
    	<managed-bean>
    		<managed-bean-name>MenuBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.MenuBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    		<managed-property>
    			<property-name>user</property-name>
    			<value>#{SecurityBean.user}</value>
    		</managed-property>
    	</managed-bean>
    	<managed-bean>
    		<managed-bean-name>CalendarBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.CalendarBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    	</managed-bean>
    	<managed-bean>
    		<managed-bean-name>NavigationBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.NavigationBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    	</managed-bean>
     
    	<!--  gestion des catégories -->
    	<managed-bean>
    		<managed-bean-name>CategoriesListBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.CategoriesListBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    		<managed-property>
    			<property-name>company</property-name>
    			<value>#{SecurityBean.company}</value>
    		</managed-property>
    	</managed-bean>	
    	<managed-bean>
    		<managed-bean-name>CreateCategoryBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.CreateCategoryBean</managed-bean-class>
    		<managed-bean-scope>request</managed-bean-scope>
    		<managed-property>
    			<property-name>company</property-name>
    			<value>#{SecurityBean.company}</value>
    		</managed-property>
    	</managed-bean>	
    	<managed-bean>
    		<managed-bean-name>CategoryDetailBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.CategoryDetailBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    	</managed-bean>	
     
    	<!-- Bean des projects utilisateurs-->
    	<managed-bean>
    		<managed-bean-name>ProjectsListBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.ProjectsListBean</managed-bean-class>
    		<managed-bean-scope>request</managed-bean-scope>
    		<managed-property>
    			<property-name>company</property-name>
    			<value>#{SecurityBean.company}</value>
    		</managed-property>
    		<managed-property>
    			<property-name>user</property-name>
    			<value>#{SecurityBean.user}</value>
    		</managed-property>
    	</managed-bean>
    	<managed-bean>
    		<managed-bean-name>CreateProjectBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.CreateProjectBean</managed-bean-class>
    		<managed-bean-scope>request</managed-bean-scope>
    		<managed-property>
    			<property-name>company</property-name>
    			<value>#{SecurityBean.company}</value>
    		</managed-property>
    		<managed-property>
    			<property-name>user</property-name>
    			<value>#{SecurityBean.user}</value>
    		</managed-property>
    	</managed-bean>
    	<managed-bean>
    		<managed-bean-name>ProjectDetailBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.ProjectDetailBean</managed-bean-class>
    		<managed-bean-scope>request</managed-bean-scope>
    	</managed-bean>	
     
     
    	<!--  Fiche de création / mise à jour des catégories -->
    	<managed-bean>
    		<managed-bean-name>CategorieFicheBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.CategorieFicheBean</managed-bean-class>
    		<managed-bean-scope>request</managed-bean-scope>
    		<managed-property>
    			<property-name>company</property-name>
    			<value>#{SecurityBean.company}</value>
    		</managed-property>
    	</managed-bean>
    	<!--  Bean des utilisateurs -->
    	<managed-bean>
    		<managed-bean-name>UsersListeBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.UsersListeBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    		<managed-property>
    			<property-name>company</property-name>
    			<value>#{SecurityBean.company}</value>
    		</managed-property>
    	</managed-bean>
    	<!--  Bean des entités -->
    	<managed-bean>
    		<managed-bean-name>EntitiesListeBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.EntitiesListeBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    	</managed-bean>
    	<!-- Fiche d'une entité -->
    	<managed-bean>
    		<managed-bean-name>EntityFicheBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.EntityFicheBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    	</managed-bean>	
    	<!-- Bean des taches d'utilisateur -->
    	<managed-bean>
    		<managed-bean-name>UserTasksBean</managed-bean-name>
    		<managed-bean-class>com.harsze.timetracer.bean.UserTasksBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    		<managed-property>
    			<property-name>company</property-name>
    			<value>#{SecurityBean.company}</value>
    		</managed-property>
    		<managed-property>
    			<property-name>user</property-name>
    			<value>#{SecurityBean.user}</value>
    		</managed-property>
    	</managed-bean>
     
    	<!-- Converters personalisés -->
    	<converter>
    	    <converter-id>CategoryConverter</converter-id>
    	    <converter-class>com.harsze.timetracer.converter.CategoryConverter</converter-class>
    	</converter>
    	<converter>
    	    <converter-id>GSConverter</converter-id>
    	    <converter-class>com.harsze.timetracer.converter.GenericSecuredConverter</converter-class>
    	</converter>
     
     
    </faces-config>

  8. #8
    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
    Tu n'utilises pas JSF 2 ?

    Le ViewScoped n'est apparu qu'à partir de JSF 2, pareil pour les annotations au niveau des classes.

    Tiens, regarde ce post.
    http://stackoverflow.com/questions/4...de-a-datatable

    Dès que j'ai un moment (et j'ai bien peur, pas aujourd'hui) je te mets une petite démo avec PrimeFaces (mais en JSF 2 ...)

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut
    Alors oui j'utilises ben JSF 2 avec l'implémentation MyFaces d'Apache.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut
    Re bonjour,

    Alors j'ai repris des cours pour apprendre cette notion de scope de bean et je vois un autre problème propre à mon projet.

    J'ai voulu utiliser des bean request car je trouvait cela logique dans la mesure ou je ne souhaite pas conserver les données sauf pour les passer en paramètres à d'autres pages.

    Du coup, la solution est d'utiliser soi session soit view. Session ca m'embête car je dois épurer le code régulièrement. D'un autre côté View équivaut chez moi à session car la seule vue que j'utilise est la vue /faces/mainpage.jsf (avec mon schmilblik de NavigationBean). Du coup j'ai a nouveau un doute sur mon archi MVC...

    J'ai posté un autre message à ce sujet sur le forum. Si tu as une idée, peux tu me dire ce que tu en penses ?

    http://www.developpez.net/forums/d12...ment-page-web/

    Merci d'avance

    Lucas

  11. #11
    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
    Citation Envoyé par fxrobin Voir le message
    ou encore, autre idée

    comme tu es en primefaces, utilise un p:dialog pour ouvrir une fenetre d'édition sur un lien de ton tableau, par exemple (ou un bouton) dans ton p:dialog il y a le form de mise à jour, une fois fermé, tu "update" le tableau avec AJAX et le tour est joué :-)

    si tu n'y arrives je posterai plus tard une petite démo de cela.

    comme prévu, voici donc un petit exemple.

    d'abord mon "modèle" : une classe Personne :

    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
     
    package model;
     
    public class Personne
    {
     
        private String nom;
        private String prenom;
     
        /**
         * @return the nom
         */
        public String getNom()
        {
            return nom;
        }
     
        /**
         * @param nom the nom to set
         */
        public void setNom(String nom)
        {
            this.nom = nom;
        }
     
        /**
         * @return the prenom
         */
        public String getPrenom()
        {
            return prenom;
        }
     
        /**
         * @param prenom the prenom to set
         */
        public void setPrenom(String prenom)
        {
            this.prenom = prenom;
        }
    }
    ensuite ma page index.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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    <?xml version='1.0' encoding='UTF-8' ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:p="http://primefaces.org/ui">
        <h:head>
            <title>Démonstration Dialog de modification en AJAX sur un tableau PrimeFaces</title>
        </h:head>
        <h:body>
            <h:form id="mainForm">
                <h:panelGrid columns="2">
                    Nom <h:inputText value="#{pageIndexBean.personne.nom}" />
                    Prénom <h:inputText value="#{pageIndexBean.personne.prenom}" />
                </h:panelGrid>
     
                <p:commandButton value="Ajouter" actionListener="#{pageIndexBean.ajouter()}"
                                 update="mainForm"/>
     
                <p:dataTable id="dataTableOutput" value="#{pageIndexBean.listePersonnes}" var="personne">
                    <p:column headerText="Nom">#{personne.nom}</p:column>
                    <p:column headerText="Prénom">#{personne.prenom}</p:column>
                    <p:column headerText="Action">
                        <p:commandButton value="Modifier" 
                                         process="@this"
                                         update=":dialogForm"
                                         oncomplete="dialogModification.show()"
                                         actionListener="#{pageIndexBean.selectionne(personne)}" />                                 
                    </p:column>
                </p:dataTable>
            </h:form>
     
            <h:form id="dialogForm">
                <p:dialog id="dialogModification" modal="true" widgetVar="dialogModification" height="500">
                    <h:panelGrid columns="2">
                        Nom <h:inputText value="#{pageIndexBean.selectionPersonne.nom}" />
                        Prénom <h:inputText value="#{pageIndexBean.selectionPersonne.prenom}" />
                    </h:panelGrid>
                    <p:commandButton value="Enregistrer" 
                                     process="dialogForm" 
                                     onclick="dialogModification.hide()" 
                                     update=":mainForm" />
                </p:dialog>
            </h:form>    
        </h:body>
    </html>
    et enfin le ManagedBean en scope view :

    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
     
    package beans;
     
    import java.util.ArrayList;
    import java.util.List;
    import javax.annotation.PostConstruct;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;
    import model.Personne;
     
    @ManagedBean
    @ViewScoped
    public class PageIndexBean
    {
     
        private Personne nouvellePersonne;
        private List<Personne> listePersonnes;
        private Personne selectionPersonne;
     
        @PostConstruct
        public void init()
        {
            nouvellePersonne = new Personne();
            selectionPersonne = new Personne();
            listePersonnes = new ArrayList<Personne>();
        }
     
        public void ajouter()
        {
            listePersonnes.add(nouvellePersonne);
            nouvellePersonne = new Personne();
        }
     
        /**
         * @return the personne
         */
        public Personne getPersonne()
        {
            return nouvellePersonne;
        }
     
        /**
         * @param personne the personne to set
         */
        public void setPersonne(Personne personne)
        {
            this.nouvellePersonne = personne;
        }
     
        /**
         * @return the listePersonnes
         */
        public List<Personne> getListePersonnes()
        {
            return listePersonnes;
        }
     
        /**
         * @param listePersonnes the listePersonnes to set
         */
        public void setListePersonnes(List<Personne> listePersonnes)
        {
            this.listePersonnes = listePersonnes;
        }
     
        /**
         * @return the selectedPersonne
         */
        public Personne getSelectionPersonne()
        {
            return selectionPersonne;
        }
     
        /**
         * @param selectedPersonne the selectedPersonne to set
         */
        public void setSelectionPersonne(Personne selectedPersonne)
        {
            this.selectionPersonne = selectedPersonne;
        }
     
        public void selectionne(Personne p)
        {
            this.selectionPersonne = p;
        }
    }

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut
    Bonjour et merci pour ce exemple.

    Il y a un truc que je n'ai pas encore l'habitude d'utiliser c'est le update. Il fait mon truc a l'ancienne. Quand je clique pour modifier, je change de page (fiche modif etc...) Il faut que je me ré habitue aux principes du JSF.

    Sinon si tu as un avis sur mon archi MVC, je suis preneur :-)

  13. #13
    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
    Le update, c'est parce que les boutons de PrimeFaces sont par défaut en AJAX. Il faut donc indiquer à l'issu du click bouton, quelle zone de la page rafraichir.

    L'AJAX n'a jamais été aussi facile, et ça évite de basculer de page en page .

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/02/2007, 10h06
  2. Count sur une propriété d'un bean entité
    Par dmetzler dans le forum JSF
    Réponses: 11
    Dernier message: 14/02/2007, 21h35
  3. Valeur null lors de la lecture apres un insert
    Par omlip dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/07/2006, 13h56
  4. Réponses: 2
    Dernier message: 30/05/2006, 09h02
  5. Réponses: 6
    Dernier message: 17/06/2005, 14h40

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