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 :

Gestion d'une sessionScoped et conditions dans facelet


Sujet :

JSF Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut Gestion d'une sessionScoped et conditions dans facelet
    Bonjour à tous,

    J'ai actuellement créé l'identification de l'utilisateur qui fonctionne. J'aimerais maintenant créer un bouton de déconnexion qui je présume, détruira le bean. Par contre, je ne trouve pas sur le net une manière de détruire ce bean (ou le vider) afin d'être "délogguer".

    De plus, quand l'utilisateur est loggué, j'aimerais avoir à un endroit de ma page un message du style "bienvenue X" + le bouton pour se "délogguer" (à la place du bouton pour accéder à la page de log). Puis-je créer une page qui sera un bout de page qui sera injecté en haut de ms page en cours ety qui contiendra :
    Si utilisateur pas logué => Bouton connexion
    Sinon => "Bienvenue X" + bouton de deco

    Pouvez-vous m'aider pour ces problèmes svp.
    Merci d'avance !

  2. #2
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 843
    Points
    7 843
    Par défaut
    Bonjour,

    Voici un petit exemple développé avec PrimeFaces:

    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
     
    <h:panelGrid id="login" styleClass="blockLogin" columns="1">
     
                                <p:watermark for="Email" value="#{bundle.UsernameWatermarkTitle}" rendered="#{!personneController.isConnected}">
                                    <h:inputText  style="width:150px" id="Email" value="#{personneController.selected.login}"
                                                  rendered="#{!personneController.isConnected}"/>
                                </p:watermark>
     
                                <p:watermark for="Password" value="#{bundle.PasswordWatermarkTitle}" rendered="#{!personneController.isConnected}">
                                    <h:inputSecret   style="width:150px" id="Password" rendered="#{!personneController.isConnected}"
                                                     value="#{personneController.tempPassword}"/>
                                </p:watermark>
     
                                <h:panelGrid columns="2">
                                    <p:commandButton style="width: 70px !important; font-size: 10px !important;"  value="#{bundle.LoginButtonTitle}" 
                                                     rendered="#{!personneController.isConnected}"
                                                     action="#{personneController.doAuthenticate()}" ajax="false"/>
                                    <h:commandLink  value="#{bundle.CreateAccountLinkTitle}" rendered="#{!personneController.isConnected}" 
                                                    action="#{personneController.doPrepareCreateUser()}"/>
                                </h:panelGrid >
     
                                <h:panelGrid rendered="#{personneController.isConnected}">
                                    <h:commandLink id="userAccountLink" style="font-size: 14px" 
                                                   value="#{personneController.selected.prenom} #{personneController.selected.nom}"
                                                   title="#{bundle.YourAccountTitle}" action="#{personneController.userInfo()}"/>
                                    <br/>
                                    <p:commandButton value="#{bundle.SignOutLinkTitle}" action="#{personneController.doLogoutUser()}" ajax="false" immediate="true"/>
                                </h:panelGrid>
                            </h:panelGrid>
    Il y en a certainement plus simple et peut-être faisable même en JSF "pur".

  3. #3
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Il faut être plus précis dans la description de ton besoin...

    Quel type d'authentification utilises-tu :
    - authentification du conteneur
    - "fait à la main"

    Si authentification conteneur, quel mode :
    - basic
    - form

    Ensuite, pour l'aspect purement rendu, en fonction de ce que tu vas utiliser comme bibliothèque de rendu, il y aura des possibilités plus ou moins grandes, mais on retrouvera un peu toujours le principe de "rendered" et "update" sur les composants...
    Là aussi, il faudrait savoir ce que tu vas utiliser

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Merci Mishulyna je vais essayer d'adapter ton code au mieux et surtout comprendre !

    OButterlin : J'ai une facelet fait main et un bean en sessionscoped fait main également.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Mishulyna j'ai adapté ton code comme 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
    <h:panelGrid id="login" styleClass="blockLogin" columns="1">
     
         <p:watermark for="Login" value="Login" rendered="#{!identificationIBean.isConnected}">
             <h:inputText  style="width:150px" id="Login" value="#{identificationIBean.newMember.name}"
                           rendered="#{!identificationIBean.isConnected}"/>
         </p:watermark>
     
         <p:watermark for="Password" value="Mot de passe" rendered="#{!identificationIBean.isConnected}">
             <h:inputSecret   style="width:150px" id="Password" rendered="#{!identificationIBean.isConnected}"
                              value="#{identificationIBean.newMember.motDePasse}"/>
         </p:watermark>
     
         <h:panelGrid columns="2">
             <p:commandButton style="width: 70px !important; font-size: 10px !important;"  value="Connexion" 
                              rendered="#{!identificationIBean.isConnected}"
                              action="#{identificationIBean.login()}" ajax="false"/>
             <h:commandLink  value="S'inscrire" rendered="#{!identificationIBean.isConnected}" 
                             action="#{inscriptionIBean.register()}"/>
         </h:panelGrid >
     
         <h:panelGrid rendered="#{identificationIBean.isConnected}">
             <h:commandLink id="userAccountLink" style="font-size: 14px" 
                            value="#{identificationIBean.newMember.name}"
                            title="Informations" action="#{identificationIBean.userInfo()}"/>
             <br/>
             <p:commandButton value="Déconnexion" action="#{identificationIBean.doLogoutUser()}" ajax="false" immediate="true"/>
         </h:panelGrid>
     </h:panelGrid>
    Mais j'ai un problème. Le fait de lancer ma facelet avec ce code va lancer la méthode "login()" du bean automatiquement. Cette méthode est sensée envoyer le membre avec lequel on tente de s'identifier dans ma couche service. Hors, le membre n'existe pas étant donné que je n'ai rien pu mettre dans mes champs donc j'ai une erreur.

    Le problème vient uniquement du fait que la méthode se lance en même temps que la facelet, tu as la même chose que tu as du géré dans ton bean ?

  6. #6
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 843
    Points
    7 843
    Par défaut
    Bonjour,

    Il faut initialiser l'objet "newMember" (et ses champs: name, motDePasse, etc.) dans une méthode @PostConstruct du "identificationIBean".

    Une autre possibilité c'est d'avoir une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public Member newMember() {
            Member newMember = new Member();
            newMember.setName(new String());
            newMember.setMotDePasse(new String());
            ...
            }
    et modifier la méthode getSelected() de la classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Member getSelected() {
            if (current == null) {
                current = newMember();
                selectedItemIndex = -1;
            }
            return current;
        }
    Dans ce cas-ci, sur la page de login tu devrais avoir "#{identificationIBean.selected.name}" et "#{identificationIBean.selected.motDePasse}".

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Quelle est cette méthode getSelected() et dans quelle classe l'as tu ? Je n'en ai pas.

    J'ai tenter dans le constructeur mais rien à faire. Ta méthode de log se lance également ?

    J'ai ça pour le Bean identificationIBean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @PostConstruct
    public void initNewMember() {
    newMember = new Member();
    newMember.setName(new String());
    newMember.setMotDePasse(new String());
    }
    Si tu peux me montrer ton Bean d'identification complet ça pourrai m'aider à comprendre comment communiques les 2 et j'essayerais de reproduire comme toi et passerai en mode débug pour bien comprendre.

  8. #8
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 843
    Points
    7 843
    Par défaut
    Bonjour,

    J'avais compris que ton code fonctionnait et tu voulais juste ajouter "Bienvenue X" et un bouton de déconnexion qui soient affichés par rapport au statut de l'utilisateur (authentifié / non-authentifié).

    Remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h:commandLink id="userAccountLink" style="font-size: 14px" 
                            value="#{identificationIBean.newMember.name}"
                            title="Informations" action="#{identificationIBean.userInfo()}"/>
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:outputText value="Bienvenue "#{identificationIBean.newMember.name}"/>
    ajoute le bouton "Deconnexion" qui déclenche l'action en question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public String doLogoutUser() {
            ((HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true)).invalidate();
            isConnected = false; // met à jour blockLogin pour les "rendered" - évidemment dans doLoginUser() tu dois mettre isConnected = true
            return "/index.xhtml";
        }

    et c'est tout!

    Je n'ai pas de "bean d'identification", j'ai ajouté des méthodes à ma classe PersonneController.java générée par NetBeans, méthodes adaptées aux besoins de mon application. Si tu utilises d'autres outils et méthodes de développement: ce n'est pas la peine de basculer ta logique pour ajouter des trucs (comme le "userAccountLink" qui redirige vers la page perso de l'utilisateur) si tu n'en as pas besoin.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Merci je comprends que nos méthodes diverges et donc que je ne peux pas prendre exemple.

    Mon HttpSession n'est pas reconnu pour la déco. C'est une variable ?

    Il me faut aussi un bouton pour les infos utilisateurs mais ce n'est que secondaire pour le moment. Je le mettrais avec le bouton de déconnexion dans la condition du facelet quand j'arriverai à la faire fonctionner ^^

  10. #10
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 843
    Points
    7 843
    Par défaut
    Citation Envoyé par chido Voir le message
    Mon HttpSession n'est pas reconnu pour la déco. C'est une variable ?
    Interface HttpSession

    Si tu en as besoin, ajoute ça dans les import du bean
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import javax.servlet.http.HttpSession;
    Si ça marche sans, tant mieux.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Même en mettant l'importe le javax.servlet n'était pas reconnu, j'ai cherché sur le net et j'ai rajouté la dépendence suivance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <dependency> 
    <groupId> javax.servlet </groupId> 
    <artifactId> javax.servlet-api </artifactId> 
    <version> 3.0.1 </version> 
    <scope> provided </scope> 
    </dependency>
    Maintennat j'ai réussi à le mettre, je vais essayer tout ça car j'ai pas mal de modif à faire également. Je reviens aux nouvelles bientôt ;-) Merci !

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Tous fonctionne merci !!!!

  13. #13
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 843
    Points
    7 843
    Par défaut ravie de l'apprendre!
    Un petit conseil, indice, une explication pour les autres utilisateurs qui cherchent une réponse à la même question? Rien?

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Points : 46
    Points
    46
    Par défaut
    Et bien j'ai appliqué ce que tu m'a dis en plus de ce que j'ai dis à la suite. Mais tu as raison, pour que tout soit regroupé voici ce que j'ai fais :

    Dans ma facelet :
    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
    <div class="divLog">
    		<h:form id="visuconnect">
     
    			<h1>Espace membre</h1>
     
    			<h:outputLabel value="Bonjour #{userIBean.newUser.name}" rendered="#{userIBean.isConnected}" />
     
    			<h:panelGrid id="identification" columns="1" class="PanelCenter"rendered="#{!userIBean.isConnected}">
     
    				<h:outputLabel value="Login" />
     
    				<p:watermark for="Login" value="Login">
    				<h:inputText style="width:150px" id="Login" value="#{userIBean.name}" />
    				</p:watermark>
     
    				<h:outputLabel value="Mot de passe" />
     
    				<p:watermark for="Password" value="Mot de passe">
    				<h:inputSecret style="width:150px" id="Password" value="#{userIBean.motDePasse}" />
    				</p:watermark>
     
    			</h:panelGrid>
     
    			<h:panelGrid columns="2" class="PanelCenter" rendered="#{!userIBean.isConnected}">
     
    				<h:commandLink value="Connexion"action="#{userIBean.login}" />
     
    				<h:commandLink value="S'inscrire" action="#{userIBean.inscription}" />
     
    			</h:panelGrid>
     
    			<h:messages errorClass="invalid" infoClass="valid" warnClass="warning" globalOnly="true" />
     
    			<h:panelGrid class="PanelCenter" columns="2" rendered="#{userIBean.isConnected}">
     
    				<h:commandLink id="detailsUser" value="Mon compte" title="detailsUser" action="detailsUser" />
     
    				<h:commandLink value="Déconnexion" action="#{userIBean.doLogoutUser}" immediate="true" />
     
    			</h:panelGrid>
     
    		</h:form>
    </div>
    Avec dans mon bean ma méthode log:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public String login() throws Exception {
    .........
    	newUser.setName(name);
    	newUser.setMotDePasse(motDePasse);
    	userLog = userService.login(newUser);
    	isConnected = true;
    .........
    	return null;
    }
    Et ma méthode pour délogguer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public String doLogoutUser() throws Exception {
     
    	((HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true)).invalidate();
    	isConnected = false;
    	return "successLog";
    }
    J'ai du également rajouter dans mon pom.xml la dépendance afin d'utiliser le HttpSession ci-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <dependency> 
    <groupId> javax.servlet </groupId> 
    <artifactId> javax.servlet-api </artifactId> 
    <version> 3.0.1 </version> 
    <scope> provided </scope> 
    </dependency>
    et, après un maven update, fais un importe dans mon bean pour utiliser l'HttpSession :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import javax.servlet.http.HttpSession;
    Sans oublié ma méthode init de mon bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @PostConstruct
    	public void initNewUser() throws Exception {
    		newUser = new User();
    		newUser.setName(new String());
    		newUser.setMotDePasse(new String());
    	}
    Voila j'espère que ça en aidera d'autres à l'avenir

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/04/2014, 10h36
  2. Réponses: 1
    Dernier message: 20/01/2014, 23h55
  3. Afficher une image sous condition dans Word
    Par SUKINET dans le forum VBA Word
    Réponses: 3
    Dernier message: 29/09/2009, 02h12
  4. Réponses: 4
    Dernier message: 07/03/2008, 16h21
  5. afficher une image sous condition dans un etat
    Par gui-llaume dans le forum IHM
    Réponses: 1
    Dernier message: 31/10/2007, 21h53

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