Communication dans JSF
1. Passage et saisie des paramètres dans JSF
1.1. Le langage EL
EL (Expression Language) est un langage d'expression qui permet d'échanger (resp. récupérer) des informations (resp. paramètres) entre les Facelets et les Beans gérés (Managed Beans) dans une application JSF. Le langage EL permet une communication bidirectionnelle entre l'interface utilisateur et la logique métier de l'application incarnée par le Backing beans.
Les requêtes portées par le protocole HTTP utilise le langage EL pour porter des données de l'interface utilisateur vers la logique métier (donc vers le serveur). EL permet aussi d'extraire et exposer à l'utilisateur des données à partir des réponses HTTP. JSF possède d'autres façons pour passer des paramètres entre vues réalisées avec Facelets, ou obtenir des paramètres des Beans gérés et les transmettre aux Facelets.
2. Utilisation des paramètres du contexte
On peut placer des paramètres du contexte d'une application JSF dans le fichier "web.xml" en utilisant la balise <context-param>; cette balise possède deux balises internes <param-nam> et <parame-value> qui précisent respectivement le nom du paramètre et sa valeur. Le fichier "web.xml" ci-dessous montre comment faire:
<context-param>
...
<param-name>com.omara.devoirs</param-name> <param-value>Anglais </param-value>
... </context-param>
...
Ainsi dans une Facelet, on accède à ces paramètres comme suit:
<h:outputText value="#{initParam['com.omara.devoirs']}"/> <h:outputText value="#{facesContext.externalContext. initParameterMap['com.omara.devoirs']}"/>
et dans une Managed Bean on y accède comme c'est indiqué dans les lignes de code suivantes avec la méthode getInitParameter:
facesContext.getExternalContext().getInitParameter ("com.omara.devoirs")
Le fichier "web.xml" est optionnel dans un serveur d'application comme Glassfish 3.0 et Plus où est défini l' API Servlet 3.0; dans ce cas on se sert du fichier de configuration "faces-config.xml" qui permet de configurer presque tous les éléments d'une application JSF; ce fichier se trouve dans le répertoire WEB-IN/ de l'application.
3. Transmettre les paramètres d'une requête avec le tag <f:param>
3.1. <f:param> au sein de la balise <h:commandButon>
Les balises spécifiques des facelets sont de la forme "<f: nomBalise>" avec " nomBalise" le nom de la balise concernée; si on veut transmettre des paramètres d'une requête d'une facelet à une autre facelet ou à un Managed Bean, on peut se servir de la balise <f:param>; généralement cette balise s' utilise à l'intérieur des balises <h:commandButton> ou <h:commandLink> pour envoyer des requêtes à un managed Bean.
Supposons une facelet, et qu'on ait à soumettre un formulaire qui envoie le nom et le prénom d'un joueur (on suppose avoir une application qui traite de cette information) au serveur en utlisant la balise <h:commandButton>; on va donc procéder comme suit:
<h:form> <h:commandButton value="Envoyer Joueur" action="#{playersBean.parametersAction()}"> <f:param id="playerName" name="playerNameParam" value="Camil"/> <f:param id="playerSurname" name="playerSurnameParam" value="OMARA"/>
</h:commandButton> </h:form>
Si on clique sur le bouton, les paramètres de la requête sont envoyés et la méthode parametersAction est appelée (via action ou actionListener). Lorsque l'application s’exécute les deux paramètres de la requête (playerNamePram et playerSurnameParam) sont déjà disponibles au sein de la managed Bean (voir la méthode playersBean.parametersAction) et on peut alors facilement les extraire et les utiliser via une Map<String, String> comme défini ci-dessous:
private String playerName; private String playerSurname; ... //getter et setter ... public String parametersAction() { FacesContext fc = FacesContext.getCurrentInstance(); Map<String, String> params = fc.getExternalContext().getRequestParameterMap(); playerName = params.get("playerNameParam"); playerSurname = params.get("playerSurnameParam"); return "some_page"; }
Les valeurs des deux paramètres sont sauvegardées par "playerName" et "playerSurname" au sein des propriétés de la managed Bean (on peut les modifier plustard sans affecter leur valeur originel) mais on peut aux afficher leur valeur par "EL" comme suit:
Name: #{param.playerNameParam}
Surname: #{param.playerSurnameParam}
......
3.2. La balise <f:param> au sein de la balise <h:commandLink>
La balise <f:param> peut-être utilisé pour transmettre directement entre les facelets des paramètres de requêtes en ne passant pas par les Managed Beans. Cela est faisable généralement à travers la la balise <h:link> comme on le montre ci-dessous:
<h:link value="Send Camil Omara" outcome="result">
<f:param id="playerName" name="playerNameParam" value="Camil"/>
<f:param id="playerSurname" name="playerSurnameParam" value="OMARA"/>
</h:link>
Ici la page de départ (la facelet de départ) contient les lignes de codes ci-dessus; et la page destination est "result.xml".
Quand on clique sur le lien "Send Camil Omara" , JSF utilise l'URL préparé contenant la facelet "result.xhtml" et les paramères de requêtes playerNameParam et playerSurnameParam. Les deux paramètres seront executées au sein de la Facelet "result.xhtml";
Remarque
La balise ne peut pas être enrichie avec des validations et / ou des conversions déclaratives / impératives. Vous devez accomplir cette tâche par vous-même. N'essayez pas de placer la balise à l'intérieur de la balise ou de tout autre composant d'entrée. Cela ne fonctionnera pas tout simplement
...
4. Autres techniques pour passer les paramètres d'une requête
4.1. Utiliser les paramètres de la vue la balise <f:viewParam ...>
A partir de JSF 2.0 on a la fonctionnalité "View Parameters" ; cette fonctionnalité facilite un certains nombre de cas de communications que nous allons voir entre autres le marque-page des URLs. Comme ci-dessus elle permet de transmettre des paramètres de Facelet à une autre facelet. Cette fonctionalité est implémentée par la classe UIViewParameter qui dérive de la classe UIInput et de ce faite elle hérite de ses fonctionnalités (Validator, listener,..).
Dans une Facelet c'est une balise <f:viewParam> au sein d'une autre balise <f:metadata> et cela fait en sorte qu'une instance de de UIViewParameter est attaché immédiatement à la vue courante (voir l' exemple d'utilisation de " f:metadata" dans le code ci-dessous).
Considérons une facelet (index.xhtml par exemple) qui veut transmettre le paramètre "nomParam" à une autre facelet; au sein donc de la facelet "index.xhtml" on doit avoir: le bout de code ci-dessous:
<f:metadata>
<f:viewParam name="nomParam" value ="#{viewParamManagedBean.nomParam}" />
</f:metadata>
....
4.2. Passer des attributs avec le tag <f:attribute>
.....................
4.3. Modifier des valeurs d'une propriété via des "action Listeners"
...
(à suivre) ...