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 :

SessionScoped ManagedBean et composition


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 104
    Par défaut SessionScoped ManagedBean et composition
    Bonjour à tous,

    Je m'arrache les cheveux depuis un petit moment à cause d'un simple ManagedBean qui gère le login.
    Ce ManagedBean (nommé UserController) a donc un scope Session.

    Le voici :
    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
    @ManagedBean
    @SessionScoped
    public class UserController implements Serializable {
     
        @EJB
        private LoginService loginService;
        private String email;
        private String password;
        private BankUser user;
     
        public String login() {
            String outcome = "";
            user = loginService.findBankUserByEmail(email);
     
            if (user != null) {
                if (password.equals(user.getPassword())) {
                    if (user instanceof Customer) {
                        outcome = "views/customer/customer_home?faces-redirect=true";
                    } else if (user instanceof Advisor) {
                        outcome = "views/advisor/advisor_home?faces-redirect=true";
                    }
                } else {
                    outcome = "index";
                }
            } else {
                outcome = "index";
            }
     
            return outcome;
        }
     
        public String logout() {
            ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
     
            HttpServletRequest request = (HttpServletRequest) ec.getRequest();
            request.getSession(false).invalidate();
     
            return "/Appli/faces/index.xhtml?faces-redirect=true";
        }
     
    [... Getters&Setters pour email, password et user ...]
    }
    Tout cela fonctionne très bien, l'identification me renvoie sur la bonne page, entre autre advisor_home. Mais sur celle ci, j'ai un problème.
    J'ai un template (cf un peu plus bas) qui défini un header, un titre, un footer et un content. Dans ce template, je déclare un menu (nav) qui fait appelle à userController pour afficher le prénom de l'utilisateur connecté. CA MARCHE, j'ai bien le prénom qui apparait. (Ce menu est inclus dans le template, il apparait pour toute les pages utilisant ce template.)

    Seul le content est redéfini dans la page JSF advisor_home pour simplement affiché "Welcome 'Prénom' " en appelant là encore userController. Et là, CA MARCHE PAS.
    Bien que le code soit le suivant et que userController.user ne soit pas null, seul "Welcome" apparait!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <c:if test="#{userController.user != null}">
                        <div id="welcome">
                                Welcome to #{userController.user.firstname}
                        </div>
    </c:if>
    Comment pouvez-vous expliquer que le template "voit" userController.user.firstname et que la page jsf qui compose le template ne le voit pas (tout en évaluant userController.user NOT NULL) ??
    Pensez-vous qu'il s'agisse d'un bug?

    Ce qui est étonnant également, c'est que une fois que je quitte la page, la session n'existe plus. Avec le même test que ci-dessus, la page de login doit affiché soit le form de connexion si l'utilisateur n'est pas en session, soit un message "Vous êtes connecté en tant que 'Prénom' " s'il l'est. Apparement il ne l'est pas, mon form s'affiche...

    Je ne m'en sors pas. Avez-vous une idée ?
    Merci beaucoup.

    Voici donc la page advisor_home qui "compose" advisor_template:
    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
    <?xml version='1.0' encoding='UTF-8' ?>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:c="http://java.sun.com/jsp/jstl/core">
     
        <ui:composition template="${pageContext.servletContext.contextPath}/WEB-INF/templates/advisor_template.xhtml">
     
            <ui:define name="title">
                Welcome on Appli
            </ui:define>
     
            <ui:define name="content">
                <div class="content_left">
                    <h2>Welcome on Appli</h2>
                    <br/>
     
                    <c:if test="#{userController.user != null}">
                        <div id="welcome">
                            <p class="center">   
                                Welcome to #{userController.user.firstname}
                            </p>
                        </div>
                    </c:if>
                </div>
            </ui:define>
        </ui:composition>
    </html>
    Voici le template utilisé pour cette advisor_home:
    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
    <?xml version='1.0' encoding='UTF-8' ?> 
    <!DOCTYPE html>
    <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:c="http://java.sun.com/jsp/jstl/core">
     
        <h:head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <link href="./../../resources/css/main.css" rel="stylesheet" type="text/css" />
            <title><ui:insert name="title">Appli - List Customers</ui:insert></title>
        </h:head>
        <h:body>
            <ui:insert name="header">            
                <header>
                    <p class="center">
                        <img id="banner" alt="Logo Appli" src="./../../resources/img/banner.jpg"/>
                    </p>
                </header>
            </ui:insert>
     
            <div id="content">
                <div id="nav" class="nav">
     
                    <c:if test="#{userController.user != null}">
     
                        Hello #{userController.user.firstname}
                        <br/>
                        <a class="link_nodeco" href="#{userController.logout()}">( Logout )</a>
     
                        <div class="operations">
                            Advisor Menu
                            <hr/>
                            <ul>
                                <li> <a class="link_nodeco" href="listCustomers.xhtml">List all customers</a> </li>
                            </ul>
                        </div>
                    </c:if>
                </div>
     
                <ui:insert name="content">Advisor Content</ui:insert>
            </div>
     
            <ui:insert name="footer">
                <footer>
                    Appli 2012 - Powered by JavaEE 6 and Glassfish v3
                </footer>
            </ui:insert>
        </h:body>
    </html>

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 104
    Par défaut
    Je viens de trouver l'origine du problème. (bien sûr 5 minutes après mon premier post, alors que je suis dessus depuis hier soir...).

    Dans mon nav (à l'intérieur du template), un lien permet de déconnecter le user:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a class="link_nodeco" href="#{userController.logout()}">( Logout )</a>
    J'ai donc supprimé ce lien, et commenté la méthode correspondante dans mon bean. Et tout fonctionne, tout va bien.
    Le problème n'avait donc rien à voir avec les compositions...

    Le problème et la question maintenant :
    1) Pourquoi la méthode est-elle appelée même si je ne clique pas sur le lien?
    2) Quelle est la marche à suivre pour créer un tel lien?

    J'ai essayé avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h:form>
          <h:commandLink styleClass="link_nodeco" value="( logout )"  action="#{userController.logout}"/>
    </h:form>
    Le user est bien déconnecté, mais le lien pointe vers la page courante et pas vers la page de login (comme le précise la sortie de la méthode logout). Pourquoi?

    Y'a t'il une meilleure solution en JSF pour créer un lien sans utiliser un formulaire?

    Merci.

  3. #3
    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
    salut, dans ton premier cas ça déclenche ta méthode, car l'EL est évaluée pendant la génération de ton lien. c'est donc normal.

    Pour générer des liens, or formulaire, je te suggère d'utiliser h:link ou h:outputLink ...

    Tiens, les différences entre chacun :
    http://www.mkyong.com/jsf2/jsf-2-lin...tlink-example/

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 104
    Par défaut
    Merci fxrobin pour le lien.
    (D'un côté, c'est le genre de truc que je pourrais trouver tout seul. Il était tard c'est pour ça! )

    Seulement, je ne parviens pas à appeler la métode logout() de mon ManagedBean depuis un <h:link> ou un <h:OutputLink> sans que ça ne m'appelle ma méthode logout au chargement de ma page.
    J'ai l'impression que seul CommandLink dans un form permet d'appeller logout() lorsqu'on clique dessus. C'est le cas ?

    Je passe en résolu tout de même.

  5. #5
    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 Doudoupe Voir le message
    J'ai l'impression que seul CommandLink dans un form permet d'appeller logout() lorsqu'on clique dessus. C'est le cas ?
    tout à fait.

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 14/12/2004, 18h01
  2. [FLASH MX2004][AS2] Composition
    Par bolo dans le forum Flash
    Réponses: 9
    Dernier message: 10/12/2004, 16h53
  3. Aide sur la création d'un type simple (nom composite)
    Par testeur dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 06/11/2004, 20h30
  4. clés composites
    Par Yuna dans le forum Administration
    Réponses: 12
    Dernier message: 08/01/2004, 09h14
  5. [WSAD] Composition visuelle d'une applet
    Par schum11 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 09/04/2003, 16h19

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