En développant une application utilisant JSF (Java Server Faces) j’ai été confronté à différentes situations qui m’ont permis d’apprendre énormément sur cette technologie.
La plupart des choses que j’ai appris (mis à part les limites des JSF
) sont relativement simples au final, mais il y a deux astuces dont je souhaitais garder une trace … et bien sûr partager avec vous !
Cela concerne d’une part l’utilisation dans une page JSF des paramètres passés dans l’url, et d’autre part l’utilisation de tableaux ou de Hashmap depuis la vue. Si je rédige ce message c’est qu’en combinant ces deux astuces je suis tombé sur un problème qui a été laborieux à déboguer … jetez-y un oeil et ne perdez pas votre temps !
Manipuler les paramètres passés dans l’url
Il est parfois pratique d’utiliser des paramètres GET plutôt que POST ou qu’un attribut de backing bean afin de récupérer une valeur. Par exemple pour afficher le bon article de son blog
Nous supposerons par la suite que nous souhaitons récupérer l’id passé dans l’adresse article.jsf?id=5
En effectuant une rapide recherche sur google on trouve rapidement comment récupérer une valeur passée en paramètre, et notamment sur cette page anglophone d’Apache. Voici différentes façons de récupérer l’id dans la page JSF :
#{param.id}
#{param['id']}
#{facesContext.externalContext.requestParameterMap.id}On peut également y accéder depuis le bean ou bien l’injecter directement dans une de ses propriétés. La syntaxe est disponible sur la page donnée ci-dessus. Si vous êtes non-anglophones et que vous souhaitez absolument faire ceci, faites le moi savoir en commentant cet article et je vous aiderai
Accéder à un élément de tableau ou de Hashmap
Supposons maintenant que nous ayons une variable articles de type Map<Long, String> dans un backing bean, qui contienne tous nos articles. On aimerait vraiment pouvoir faire l’équivalent de :
System.out.println(this.articles.get(id));
En cherchant encore une fois sur le web, on trouve une syntaxe qui permet d’effectuer un « get » sur le HashMap. Voici donc l’équivalent de la portion de code ci-dessus dans la vue JSF :
#{MonBean.articles[param.id]}… et bien en exécutant ce code vous aurez une bien belle erreur dans votre page !
(sadique va …)
La raison est simple (quand on la connait) : cela vient tout simplement du fait que le paramètre issu de l’url est une String et non un Long, or la méthode getArticles() du backing bean renvoie un Map indexé par un Long ! Vous l’aurez compris, si l’on souhaite utiliser cette syntaxe il faudra donc faire une opération toute simple soit au niveau de getArticles(), soit ailleurs afin de retourner un Map<String, String>. Celui-ci sera alors directement utilisable !
Je ne sais pas si c’est la meilleure solution au problème, mais c’est celle que j’ai utilisé. Etant donné que cela n’était absolument pas dérangeant de parser le Map « articles » afin de caster ses clés en String j’ai choisi la solution de facilité !
Cependant, si vous avez une autre solution ou bien une suggestion pour éviter de se heurter à ce problème, je serai très heureux de la connaître …