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>