Bonjour à tous

Je rencontre des difficultés dans l’utilisation du composant RichFaces HtmlPanelMenu et plus généralement sur le cycle de vie de JSF.

Je possède une page d’authentification classique avec des champs login et password. Je lie les valeurs entrées dans ces champs à des attributs d’un backing bean UserBean dont le scope est session. En effet, cet objet portera les infos de l’utilisateur tout au long de sa navigation sur le site ; sa portée est donc session.

Voici le code (en résumé) de ma page login.jsp

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<table align="center">
<tr>
<td><h:outputLabel id="loginLabel" for="loginInput" value="Login" /></td>
<td><h:inputText id="loginInput" value="#{userBean.user.login}" /></td>
</tr>
<tr>
<td><h:outputLabel id="passwordLabel" for="passwordInput" value="Password" /></td>
<td><h:inputSecret id="passwordInput" value="#{userBean.user.password}" /></td>
</tr>
<tr align="center">
<td colspan="2"><h:commandButton action="#{userBean.processConnexion}" value=" OK " /></td>
</tr>
</table>

Lorsque l’utilisateur appuie sur le bouton « OK », la méthode UserBean.processConnexion est lancée. Cette méthode appelle une classe UserService qui va voir si l’utilisateur existe. La classe UserService est un bean Spring et est injectée dans le backing bean UserBean grâce aux facilités fournies par Spring. Ci-dessous la partie du code de faces-config.xml correspondant à UserBean où on peut voir l’injection du bean Spring.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
</application>
 
<managed-bean>
<managed-bean-name>userBean</managed-bean-name>
<managed-bean-class>com.company.appli.web.backingbean.user.UserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>userService</property-name>
	<value>#{userService}</value>
</managed-property>
</managed-bean>
Si l’utilisateur existe, la méthode processConnexion renvoie « SUCCESS ». Une navigation-rule spécifie alors de charger la page welcome.jsp qui est la page d’accueil de mon application.

Dans cette page je souhaite construire, sur la gauche, un HtmlPanelMenu de RichFaces. Or ce menu doit être construit dynamiquement en fonction des droits de l’utilisateur. Je le construis donc dans le code Java de ma classe UserBean et je le « binde » (excusez-moi pour ce terme…) à son correspondant dans le code de la jsp.

Code de la jsp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
< !--Panel menu « nu » qui sera construit dans le code Java -->
<rich:panelMenu binding="#{userBean.panelMenu}" />
Code java de UserBean :
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
 
 
private HtmlPanelMenu panelMenu;
 
private void buildMenu() {
 
		final Application application = FacesContext.getCurrentInstance().getApplication();
		this.panelMenu = (HtmlPanelMenu) application.createComponent(HtmlPanelMenu.COMPONENT_TYPE);
 
		this.panelMenu.getChildren().clear();
		this.panelMenu.setStyle("width:200px");
		this.panelMenu.setIconExpandedGroup("disc");
		this.panelMenu.setIconCollapsedGroup("disc");
		this.panelMenu.setIconExpandedTopGroup("chevronUp");
		this.panelMenu.setIconGroupTopPosition("right");
		this.panelMenu.setIconCollapsedTopGroup("chevronDown");
 
		… Ajout de divers MenuGroup et MenuItem
	}
 
	public HtmlPanelMenu getPanelMenu() {
		if (LOGGER.isDebugEnabled()) {
			LOGGER.debug("UserBean.getPanelMenu");
		}
 
		if(this.panelMenu == null){
			if (LOGGER.isDebugEnabled()) {
				LOGGER.debug("Building the menu");
			}
			this.buildMenu();
		}
 
		return this.panelMenu;
	}
 
	public void setPanelMenu(final HtmlPanelMenu panelMenu) {
		if (LOGGER.isDebugEnabled()) {
			LOGGER.debug("UserBean.setPanelMenu");
		}
		this.panelMenu = panelMenu;
	}

Voilà ! Dans ma page welcome.jsp le PanelMenu n’apparaît pas. Dans les logs, je constate que la méthode getPanelMenu() a été appelée. Mon menu a donc été construit car dans cette méthode j’appelle buildMenu(). Et ensuite, je constate que la méthode setPanelMenu() est appelée ! Je pense que c’est là le problème : mon menu est alors réaffecté avec ce qui est passé en paramètre de la méthode setPanelMenu().

Pourquoi la méthode setPanelMenu() est appelée ? Et plus généralement, comment faire pour construire mon PanelMenu au moment de la connexion du user, puis le garder (sans avoir à le reconstruire) dans le bean (en session) UserBean dans chaque page qui l’incorporera ?

Merci d’avance pour votre aide.