JSF

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

Pour définir une variable avec <c:set> dans une page JSF, deux éléments sont à considérer :

  • Le scope page n’existe pas avec JSF

  • Si la variable est définie à partir d’un backing bean, il convient de s’assurer que le backing bean existe effectivement

1. Définir le scope dans <c:set>

Par défaut, <c:set> créé une variable en portée page. Il faut donc définir explicitement le scope (request, session ou application) si vous souhaitez exploiter cette variable dans une EL JSF.

<c:set var="d" value="${detailProduitBean}" scope="request"/>

2. Gestion du backing bean

Les backing beans sont instanciés par le framework JSF (Managed Bean Creation Facility), lorsqu’ils sont accédés pour la première fois (pour un scope donné) dans une EL JSF. Par conséquent, si la balise <c:set> est exécutée avant qu’une EL JSF ne sollicite le backing bean, la variable du <c:set> ne sera pas correctement initialisée. Pour résoudre ce problème, on peut utiliser le VariableResolver de l’application pour s’assurer que le bean en question existe effectivement.

FacesContext ctx = FacesContext.getCurrentInstance()
VariableResolver resolver = ctx.getApplication().getVariableResolver();

// création du backing bean par JSF
DetailProduitBean d = (DetailProduitBean)resolver.resolveVariable(ctx, "detailProduitBean");

// initialisation du bean à partir des infos récupérées depuis la couche métier
d.setInfoProduit(service.findInfoProduit());

Ce code doit être placé dans un backing bean qui est invoqué avant l’affichage de la page JSF.