21.05.2014 Vues

Introduction à JSF 2.0 - MIAGE Nice Sophia Antipolis

Introduction à JSF 2.0 - MIAGE Nice Sophia Antipolis

Introduction à JSF 2.0 - MIAGE Nice Sophia Antipolis

SHOW MORE
SHOW LESS

Transformez vos PDF en papier électronique et augmentez vos revenus !

Optimisez vos papiers électroniques pour le SEO, utilisez des backlinks puissants et du contenu multimédia pour maximiser votre visibilité et vos ventes.

<strong>Introduction</strong> à <strong>JSF</strong> <strong>2.0</strong>(Java Server Faces)Université de <strong>Nice</strong> - <strong>Sophia</strong> <strong>Antipolis</strong>Richard GrinVersion 0.3.2 – 10/7/11Adaptation / tri sélectif : Michel Buffa


Plan (1) Présentation Cycle de vie Java EE 6 Une application Web Rappels sur HTTP Page <strong>JSF</strong> Fichiers de configuration Implémentations de <strong>JSF</strong> (librairies <strong>JSF</strong>) Code d’une page <strong>JSF</strong>21/10/99 Richard Grin <strong>JSF</strong> - page 2


Plan (2) Langage EL Composants standards Navigation Portées (requête, session,…) Beans Utilisation des EJB Ajax21/10/99 Richard Grin <strong>JSF</strong> - page 3


Remarque Ce support est une introduction à <strong>JSF</strong> <strong>2.0</strong> utilisédans un cadre Java EE 6, avec un serveurd’applications du type de Glassfish, et CDI(Contexts and Dependency Injection)21/10/99 Richard Grin <strong>JSF</strong> - page 4


Présentation21/10/99 Richard Grin <strong>JSF</strong> - page 5


Utilité de <strong>JSF</strong> Créer des pages Web dynamiques Par exemple, une page Web qui est construite àpartir de données enregistrées dans une base dedonnées Une grande partie de la programmation liée à lavalidation des données saisies par l’utilisateur et deleur passage au code de l’application estautomatisée ou grandement facilitée Ajax sans programmation21/10/99 Richard Grin <strong>JSF</strong> - page 6


<strong>JSF</strong> Framework MVC qui reprend le modèle desinterfaces utilisateurs locales (comme Swing) Le modèle est représenté par des classes Java,les Java beans, sur le serveur Les vues sont représentées par des composantsJava sur le serveur, transformées en pagesHTML sur le client Le contrôleur est un servlet qui intercepte lesrequêtes HTTP liées aux applications <strong>JSF</strong> et quiorganise les traitements <strong>JSF</strong> (implicite)21/10/99 Richard Grin <strong>JSF</strong> - page 7


Autres possibilités Java D’autres solutions que <strong>JSF</strong> peuvent être utiliséespour créer des pages Web dynamiques : JSPs (aujourd’hui officiellement plus conseillées) Utilisation de bibliothèques javascript / HTML5 /Servlets ou Web Services REST GWT (Google Web Tollkit) JRuby on rail Etc21/10/99 Richard Grin <strong>JSF</strong> - page 8


How you can applyThis support guide, the application form and all related materials areavailable to download from our website at www.theskillsshow.comAll organisations must submit an applicationform and supporting material. The applicationprocess opens from 6 February and closes on27 April 2012 at 4pm. All application forms andsupporting material must be received by thisdate and time.■■You can apply for multiple Showcase opportunities. Ifyou wish to enter for more than one category pleasesubmit separate application forms for each category.■■Organisations can apply individually or in partnershipwith others. The size of the organisation does notmatter and applications will be judged on creativity,innovation, demonstration of clear educationalbenefit and ability to deliver.■■Showcase organisations selected and taking partwill be published from the week commencing21 May 2012.Who can apply?Showcase applications are open across the UK(this includes, England, Northern Ireland, Scotlandand Wales).Showcase applications are encouraged from:■■School sixth forms■■Sixth form colleges■■Further Education colleges, specialist andtertiary colleges■■Private training providers■■Adult and community learning centres■■Community and youth groups■■Special needs schools and colleges■■UniversitiesWho can take part in the Showcase?We aim to make Showcases as inclusive as possible. Youcan bring a range of students to take part. This shouldinclude learners who are still in learning or who haverecently left.Everyone taking part in the Showcasing must be aged16 or over on the day of your Showcase.We encourage students who are in community-based orpart/full time adult learning. You could also draw fromprevious award winners (UK competitions or broader).We positively encourage diversity and encouragelearners from all backgrounds and of all ability levelsto participate.How to complete your Showcasingapplication formItem Additional Information DeadlineCompleteShowcaseApplicationFormSupportingvisualinformationPlease use the supportguide and criteria tocomplete and build yourapplication form.Please ensure you haveread, understood andagreed to the terms andconditions.Please include supportingvisual information ashyperlinks to an externalwebsite where they arehosted. This might includea selection of relevantimages e.g. photographs,case studies, video footageto support your applicationand help the selectionpanel understand yourShowcase application.Showcase timetableSchedule of activities and timescalesActivityApplication deadlineApplications sifted and sent to NationalSelection PanelNational Selection Panel DayYour completedapplication formshould be submittedby 4pm on 27 April2012 to showcase@theskillsshow.comAs above.DateClosing date; 27 April2012 at 4pm.30 April – 4 May 2012Mid MayShowcase list announced by The Skills Show w/c 21 May 2012The Skills Show confirm technical andoperational requirements for your ShowcaseShowcase registration (of studentstaking part)Showcase deliveredDuring June 2012During June,July, August,September 201215–17 November2012To download an application form please visitwww.theskillsshow.comOnce complete, return your application form toshowcase@theskillsshow.com by 4pm on 27 April 201<strong>2.0</strong>9


Services rendus par <strong>JSF</strong> (1/2) Architecture MVC pour séparer l’interfaceutilisateur, la couche de persistance et lesprocessus métier, utilisant la notion d’événement Conversion des données (tout est texte dansl’interface utilisateur) Validation des données (par exemple, deschamps de formulaires requis) Automatisation de l’affichage des messagesd’erreur en cas de problèmes de conversion oude validation21/10/99 Richard Grin <strong>JSF</strong> - page 10


Services rendus par <strong>JSF</strong> (2/2) Internationalisation Support d’Ajax sans programmation(communication en arrière-plan et mise à jourpartielle de l’interface utilisateur) Fournit des composants standards simples pourl’interface utilisateur Possible d’ajouter ses propres composants Adaptable à d’autres langages de balise queHTML (WML par exemple pour les téléphonesportables)21/10/99 Richard Grin <strong>JSF</strong> - page 11


Standards <strong>JSF</strong> <strong>2.0</strong> est intégré dans Java EE 6 <strong>JSF</strong> <strong>2.0</strong> s’appuie sur les standards suivants :n Servlet 2.5 -> <strong>JSF</strong> et les Servlets ça marche bien !n Java SE 5.0n Java EE 5.0n JSTL 1.1 -> ATTENTION PAS CONSEILLE !!! <strong>JSF</strong> <strong>2.0</strong> peut (c’est conseillé) utiliser CDI(Contexts and Dependency Injection)n Annotations @EJB, @Inject etc.21/10/99 Richard Grin <strong>JSF</strong> - page 12


Le cycle de vie21/10/99 Richard Grin <strong>JSF</strong> - page 13


Pour bien comprendre <strong>JSF</strong> il est indispensable debien comprendre tout le processus qui se dérouleentre le remplissage d’un formulaire parl’utilisateur et la réponse du serveur sous la formede l’affichage d’une nouvelle page21/10/99 Richard Grin <strong>JSF</strong> - page 14


21/10/99 Richard Grin <strong>JSF</strong> - page 15


21/10/99 Richard Grin <strong>JSF</strong> - page 16


Le servlet « Faces » Toutes les requêtes vers des pages « <strong>JSF</strong> » sontinterceptées par un servlet défini dans le fichierweb.xml de l’application WebFaces Servletjavax.faces.webapp.FacesServlet121/10/99 Richard Grin <strong>JSF</strong> - page 17


URL des pages <strong>JSF</strong> Les pages <strong>JSF</strong> sont traitées par le servlet parceque le fichier web.xml contient une configurationtelle que celle-ci : Faces Servlet/faces/*Le pattern est souvent aussi de la forme*.faces (les pages dont l’URL se termine par .facessont considérées comme des pages <strong>JSF</strong>)21/10/99 Richard Grin <strong>JSF</strong> - page 18


Codage - décodage Les pages HTML renvoyées par une application<strong>JSF</strong> sont représentées par un arbre decomposants Java L’encodage est la génération d’une page HTML àpartir de l’arbre des composants Le décodage est l’utilisation des valeursrenvoyées par un POST HTML pour donner desvaleurs aux variables d’instance des composantsJava, et le lancement des actions associées aux« UICommand » <strong>JSF</strong> (boutons ou liens)21/10/99 Richard Grin <strong>JSF</strong> - page 19


Cycle de vie Le codage/décodage fait partie du cycle de viedes pages <strong>JSF</strong> Le cycle de vie est composé de 6 phases Ces phases sont gérées par le servlet « Faces »qui est activé lorsque qu’une requête demandeune page <strong>JSF</strong> (correspond au pattern indiquédans le fichier web.xml ; le plus souvent /faces/*ou *.faces)21/10/99 Richard Grin <strong>JSF</strong> - page 20


21/10/99 Richard Grin <strong>JSF</strong> - page 21


Demande page HTML Etudions tout d’abord le cas simple d’une requêted’un client qui demande l’affichage d’une page <strong>JSF</strong>21/10/99 Richard Grin <strong>JSF</strong> - page 22


La vue Cette requête HTTP correspond à une page <strong>JSF</strong>(par exemple *.faces) et est donc interceptée parle servlet Faces La page HTML correspondant à la page <strong>JSF</strong> doitêtre affichée à la suite de cette requête HTTP La page HTML qui sera affichée est représentéesur le serveur par une « vue » Cette vue va être construite sur le serveur ettransformée sur le serveur en une page HTML quisera envoyée au client21/10/99 Richard Grin <strong>JSF</strong> - page 23


Contenu de la vue Cette vue est un arbre dont les éléments sont descomposants <strong>JSF</strong> (composants Java) qui sont surle serveur (des instances de classes qui héritentde UIComponent) Sa racine est de la classe UIViewRoot21/10/99 Richard Grin <strong>JSF</strong> - page 24


Construction vue et page HTML Une vue formée des composants <strong>JSF</strong> est doncconstruite sur le serveur (ou restaurée si elle avaitdéjà été affichée) : phase « Restore View » Puisqu’il n’y a pas de données ou d’événements àtraiter, la vue est immédiatement rendue : le codeHTML est construit à partir des composants de lavue et envoyé au client : phase « RenderResponse »21/10/99 Richard Grin <strong>JSF</strong> - page 25


Traitement d’un formulaire Nous allons cette fois-ci partir d’une requête HTTPgénérée à partir d’une page HTML qui contient unformulaire (page construite à partir d’une page<strong>JSF</strong>) L’utilisateur a saisi des valeurs dans ce formulaire Ces valeurs sont passées comme des paramètresde la requête HTTP ; par exemple,http://machine/page.xhtml?nom=bibi&prenom=bobsi la requête est une requête GET, ou dans l’entitéd’un POST21/10/99 Richard Grin <strong>JSF</strong> - page 26


21/10/99 Richard Grin <strong>JSF</strong> - page 27


Phase de restauration de la vue La vue qui correspond à la page qui contient leformulaire est restaurée (phase « Restore View ») Tous les composants reçoivent la valeur qu’ilsavaient avant les nouvelles saisies de l’utilisateur21/10/99 Richard Grin <strong>JSF</strong> - page 28


21/10/99 Richard Grin <strong>JSF</strong> - page 29


Phase d’application des paramètres Tous les composants Java de l’arbre descomposants reçoivent les valeurs qui lesconcernent dans les paramètres de la requêteHTTP : phase « Apply Request Values » Par exemple, si le composant texte d’unformulaire contient un nom, le composant Javaassocié conserve ce nom dans une variable En fait, chaque composant de la vue récupèreses propres paramètres dans la requête HTTP21/10/99 Richard Grin <strong>JSF</strong> - page 30


21/10/99 Richard Grin <strong>JSF</strong> - page 31


Phase de validation Toutes les validations des données traitées àl’étape précédentes sont exécutées Les données sont converties dans le bon typeJava Si une validation échoue, la main est donnée à laphase de rendu de la réponse21/10/99 Richard Grin <strong>JSF</strong> - page 32


Phase de validation Comment c’est fait : chaque composant valide etconvertit les données qu’il contient Si un composant détecte une valeur non valable,il met sa propriété « valid » à false et il met unmessage d’erreur dans la file d’attente desmessages (ils seront affichés lors de la phase derendu « render response ») et les phasessuivantes sont sautées21/10/99 Richard Grin <strong>JSF</strong> - page 33


21/10/99 Richard Grin <strong>JSF</strong> - page 34


Phase de mise à jour du modèle Si les données ont été validées, elles sont misesdans les variables d’instance des Java beansassociés aux composants de l’arbre descomposants21/10/99 Richard Grin <strong>JSF</strong> - page 35


21/10/99 Richard Grin <strong>JSF</strong> - page 36


Phase d’invocation de l’application Les actions associées aux boutons ou aux lienssont exécutées Le plus souvent le lancement des processusmétier se fait par ces actions La valeur de retour de ces actions va déterminerla prochaine page à afficher (navigation)21/10/99 Richard Grin <strong>JSF</strong> - page 37


21/10/99 Richard Grin <strong>JSF</strong> - page 38


Phase de rendu de la réponse La page déterminée par la navigation estencodée en HTML et envoyée vers le client HTTP21/10/99 Richard Grin <strong>JSF</strong> - page 39


Sauter des phases Il est quelquefois indispensable de sauter desphases du cycle de vie Par exemple, si l’utilisateur clique sur un boutond’annulation, on ne veut pas que la validation deschamps de saisie soit effectuée, ni que lesvaleurs actuelles soient mises dans le modèle Autre exemple : si on génère un fichier PDF àrenvoyer à l’utilisateur et qu’on l’envoie àl’utilisateur directement sur le flot de sortie de laréponse HTTP, on ne veut pas que la phase derendu habituelle soit exécutée21/10/99 Richard Grin <strong>JSF</strong> - page 40


immediate=true sur un UICommand Cet attribut peut être ajouté à un bouton ou à unlien (, , et ) pour faire passerdirectement (immédiatement) de la phase « Applyrequest values » à la phase « InvokeApplication » (en sautant donc les phases devalidation et de mise à jour du modèle) Exemple : un bouton d’annulation d’un formulaire21/10/99 Richard Grin <strong>JSF</strong> - page 41


immediate=true sur unEditableValueHolder Cet attribut peut être ajouté à un champ de saisie,une liste déroulante ou des boîte à cocher pourdéclencher immédiatement la validation et laconversion de la valeur qu’il contient, avant lavalidation et la conversion des autres composantsde la page Utile pour effectuer des modifications surl’interface utilisateur sans valider toutes lesvaleurs du formulaire21/10/99 Richard Grin <strong>JSF</strong> - page 42


Exemple Formulaire qui contient champ de saisie du codepostal et un champ de saisie de la ville Lorsque le code postal est saisi, unValueChangeListener met automatiquement àjour la ville : La soumission du formulaire déclenchée par lamodification du code postal ne doit pas lancer lavalidation de tous les composants du formulairequi ne sont peut-être pas encore saisis21/10/99 Richard Grin <strong>JSF</strong> - page 43


Une application Web21/10/99 Richard Grin <strong>JSF</strong> - page 44


21/10/99 Richard Grin <strong>JSF</strong> - page 45


Etapes du développement Ecrire le code des pages <strong>JSF</strong> et des backingbeans (Tester en local en déployant sur un containerWeb) Déployer sur le container Web final Taper l’adresse de l’application pour tester21/10/99 Richard Grin <strong>JSF</strong> - page 46


Structures des fichiers21/10/99 Richard Grin <strong>JSF</strong> - page 47


Fichier de distribution L’application doit être distribuée sous la formed’un fichier war (fichier de format jar) Elle peut être une partie d’un projet de typeentreprise, dans ce cas l’application est encoreun .war mais contenu dans le .ear du projet global(le .ear contient la partie web dans le .war, lapartie EJB dans un ou plusieurs .jar)21/10/99 Richard Grin <strong>JSF</strong> - page 48


Rappels sur HTTP21/10/99 Richard Grin <strong>JSF</strong> - page 49


Requête HTTP Le protocole HTTP permet à un client HTTPd’envoyer plusieurs types de requêtes à unserveur Les 2 types de base principaux sont les typesGET et POST GET permet au client de demander une pageHTML POST permet au client de passer des donnéesau serveur21/10/99 Richard Grin <strong>JSF</strong> - page 50


Réponse du serveur HTTP En réponse à une requête d’un client HTTP, unserveur HTTP renvoie au client une réponse21/10/99 Richard Grin <strong>JSF</strong> - page 51


Format d’une requête La première ligne contient le type de la requête(GET par exemple), suivi de l’URI qui désigne ledestinataire de la requête, suivi du numéro de laversion HTTP utilisée Ensuite peuvent venir des lignes facultatives (entêtes)pour indiquer la configuration du client oudes formats de documents acceptés en réponse En dernier la requête peut contenir une « entité »composée de données qui pourront être utiliséespar le serveur (essentiellement réservé à larequête POST) ; ligne vide avant l’entité21/10/99 Richard Grin <strong>JSF</strong> - page 52


Format d’une réponse Une première ligne d’état qui contient la versionHTTP utilisée, le code d’état (nombre ; parexemple, 200 indique que tout s’est bien passé)et la description du code (« OK » pour 200) Viennent ensuite des lignes d’en-têtes (commepour la requête du client) Finalement, le corps de la réponse est envoyé ; ilpeut s’agir du contenu d’un fichier HTML ou d’uncontenu généré par un programme du serveur21/10/99 Richard Grin <strong>JSF</strong> - page 53


GET La fonctionnalité de base de HTTP est depermettre à un navigateur (client HTTP) derécupérer et d’afficher une page Web Pour cela le client envoie une requête GET auserveur Cette requête contient l’URL de la page Webavec, éventuellement, des paramètres (couplesclé-valeur) La réponse contient le plus souvent un corps quiest le code d’une page HTML21/10/99 Richard Grin <strong>JSF</strong> - page 54


Exemple de requête GETGET page.html?nom=Toto&Prenom=Pierre HTTP/1.1Accept: */*Host: www.unice.frUser-Agent: Generic21/10/99 Richard Grin <strong>JSF</strong> - page 55


POST Certaines pages Web contiennent desquestionnaires remplis par l’utilisateur dunavigateur Lorsque l’utilisateur clique sur le bouton« Submit », les données qu’il a tapées sontenvoyées au serveur par une requête POST Cette requête contient l’URI du code qui va traiterles données, ainsi que les données La réponse du serveur contient le code de laprochaine page à afficher par le navigateur21/10/99 Richard Grin <strong>JSF</strong> - page 56


Exemple de POSTPOST /appl/client.xhtml HTTP/1.1Accept: */*Host: www.unice.frnom=TotoPrenom=Pierre21/10/99 Richard Grin <strong>JSF</strong> - page 57


Formulaires HTML Une page HTML peut contenir un formulaire() Lorsque ce formulaire est soumis au serveur(bouton de type « submit »), les données entréesdans le formulaire sont transmises au serveur parune requête POST ou une requête GET Avec GET, les valeurs saisies sont intégrées àl’URI ; avec POST elles sont mises dans l’entité C’est l’attribut name des balises qui donne le nomdes paramètres de la requête21/10/99 Richard Grin <strong>JSF</strong> - page 58


Page <strong>JSF</strong>21/10/99 Richard Grin <strong>JSF</strong> - page 59


Les pages <strong>JSF</strong> contiennent des balises quidécrivent les composants qui représenteront lapage sur le serveur21/10/99 Richard Grin <strong>JSF</strong> - page 60


Code XHTMLUne page <strong>JSF</strong> Contient des parties en EL : #{…} Utilise souvent une (ou plusieurs) bibliothèque decomposants <strong>JSF</strong> Sera traduite en XHTML « pur » pour être envoyée auclient Web21/10/99 Richard Grin <strong>JSF</strong> - page 61


Architecture des applications <strong>JSF</strong>21/10/99 Richard Grin <strong>JSF</strong> - page 62


<strong>JSF</strong>, servlets et beans Dans l’architecture des applications qui utilisent<strong>JSF</strong>, on trouve aussi des servlets et des beans Les servlets et les beans s’occupentprincipalement des traitements métier et desaccès aux données Les pages <strong>JSF</strong> sont utilisées pour l’interface avecl’utilisateur21/10/99 Richard Grin <strong>JSF</strong> - page 63


Répartition des tâches Les pages <strong>JSF</strong> ne contiennent pas de traitements (pas decode Java ou autre code comme dans les pages JSP,« ancien langage » de <strong>JSF</strong> pour créer les pages affichéesà l’utilisateur) Les traitements liés directement à l’interface utilisateursont écrits dans les backing beans Ces backing beans font appels à des EJB ou des classesJava ordinaire pour effectuer les traitements qui ne sontpas liés directement à l’interface utilisateur Note : on peut très bien faire des pages <strong>JSF</strong>, du EL et desServlets… mais c’est considéré « bas nioveau » Attention : pas de JSTL !!!21/10/99 Richard Grin <strong>JSF</strong> - page 64


Répartition des tâches (2) Les EJB sont chargés de traitements métier etdes accès aux bases de données Les accès aux bases de données utilisent JPA etdes classes entités21/10/99 Richard Grin <strong>JSF</strong> - page 65


Beans 2 types principaux de beans :n EJB (essentiellement des beans sessions) liésaux processus métiern « Backing beans » associés aux pages <strong>JSF</strong> etdonc à l’interface utilisateur qui font la liaisonentre les composants <strong>JSF</strong> de l’interface, lesvaleurs affichées ou saisies dans les pages<strong>JSF</strong> et le code Java qui effectue les traitementsmétier21/10/99 Richard Grin <strong>JSF</strong> - page 66


Backing bean Souvent, mais pas obligatoirement, un backingbean par page <strong>JSF</strong> Voir support de cours sur les Backing Beansn Variables pour les propriétés,n Variable pour stocker des résultats de traitement,n Des méthodes get/set pour les propriétés,n Des méthodes de traitement (qu’on appelle« command handlers »,n Des écouteurs d’évènements…21/10/99 Richard Grin <strong>JSF</strong> - page 67


EJB Un backing bean fournit du code Java pourl’interface graphique Lorsqu’un processus métier doit être déclenché,le backing bean cède la main à un EJB Un EJB est totalement indépendant de l’interfacegraphique ; il exécute les processus métier ous’occupe de la persistance des données Les entités JPA 2 sont utilisées par les EJB pourla persistance des données21/10/99 Richard Grin <strong>JSF</strong> - page 68


Container pour les <strong>JSF</strong> Pour qu’il sache traiter les pages <strong>JSF</strong>, le serveur Web doitdisposer d’un container pour ces pages On peut utiliser pour cela un serveur d’applications dutype de Glassfish, JBoss, WebSphere, WebLogic, OAS.. Tomcat (projet Apache) est une solution plus légère pourtraiter les pages <strong>JSF</strong>nnnMais attention, Tomcat n’est PAS un serveur d’applications,Pas d’applications distribuées, pas de transactions distribuées, etcNe contient pas toutes les bibliothèques J2EE par défaut21/10/99 Richard Grin <strong>JSF</strong> - page 69


Paquetage et classes principales Les paquetages javax.servlet, javax.serlet.http,javax.servlet.jsp etc. ne sont pas fournis avec ladistribution standard de Java (SDK) Ils sont dans la distribution « entreprise » (qui estinstallée avec la version de netbeans qu’onutilise. On peut aussi les récupérer à part pour les utiliseravec la distribution standard ; c'est le cas si ondécide d’utiliser Tomcat.21/10/99 Richard Grin <strong>JSF</strong> - page 70


Fichiers de configuration21/10/99 Richard Grin <strong>JSF</strong> - page 71


Les différents fichiers WEB-INF/web.xml fichier global de configurationd’une application Web Java WEB-INF/faces-config.xml : configuration de lapartie <strong>JSF</strong> de l’application, par exemple pourindiquer la navigation entre les pages ou pourdéclarer les beans utilisés par les pages ; plusindispensable avec <strong>JSF</strong> <strong>2.0</strong> grâce auxannotations Java21/10/99 Richard Grin <strong>JSF</strong> - page 72


Annotations et fichier faces-config.xml <strong>JSF</strong> <strong>2.0</strong> a développé l’emploi des annotations desclasses pour configurer son fonctionnement Le fichier XML l’emporte sur les annotations, cequi permet de changer la configuration même sion n’a pas le code source (ou d’éviter derecompiler si on a le code source)21/10/99 Richard Grin <strong>JSF</strong> - page 73


Les différents fichiers (2) Fichier WEB-INF/beans.xml, indispensable si CDI estutilisé ; il semble qu’un fichier beans.xml vide suffise àdéclencher l’utilisation de CDI (attention, si ce fichiern’existe pas, CDI n’est pas utilisé, sans aucun messaged’avertissement, et donc les @Inject ne fonctionnent pas) Fichiers de description des balises (tags) personnaliséesdans le cas où des balises personnalisée sont utilisées(voir la section sur les composants personnalisés)nEx : vous faites vos composants, un lecteur vidéo par exemple.21/10/99 Richard Grin <strong>JSF</strong> - page 74


Implémentations de <strong>JSF</strong> –librairies <strong>JSF</strong>21/10/99 Richard Grin <strong>JSF</strong> - page 75


Implémentations Implémentation de référence de <strong>JSF</strong> Librairies de composants21/10/99 Richard Grin <strong>JSF</strong> - page 76


Implémentation de référence Projet Mojarra Fournit les composants de base et avec desfonctionnalités minimales De nombreuses librairies fournissent d’autrescomposants ou enrichissent les fonctionnalitésdes composants de l’implémentation de référence21/10/99 Richard Grin <strong>JSF</strong> - page 77


Librairies de composants L’idéal serait que toutes les librairies decomposants soient compatibles entre elles, ce quipermettrait de choisir ses composants dansplusieurs librairies Dans la réalité ça n’est pas toujours le cas et ilvaut mieux bien choisir la librairie et s’y tenir Principales librairies : PrimeFaces, RichFaces,OpenFaces, Icefaces, ADF Faces21/10/99 Richard Grin <strong>JSF</strong> - page 78


Code d’une page <strong>JSF</strong>21/10/99 Richard Grin <strong>JSF</strong> - page 79


Structure globale d’une page Fichier xhtml tag html qui précise les namespaces utilisés En-tête de la page (h:header) qui permetd’indiquer les css, les include javascript, etc Le corps de la page (du XHTML et des tags <strong>JSF</strong>) Voir aussi les templates dans la une autre partiede ce cours.21/10/99 Richard Grin <strong>JSF</strong> - page 80


Commentaires (1/2) Par défaut les commentaires HTML ()ne fonctionnent pas pour <strong>JSF</strong> Une solution est de configurer l’application pourque ces commentaires soient pris en compte parFacelets en ajoutant ceci dans web.xml :facelets.SKIP_COMMENTStrue21/10/99 Richard Grin <strong>JSF</strong> - page 81


Commentaires (2/2) Cependant, dans certains cas, des informationmises dans des commentaires HTML peuventêtre utilisés par l’application Le plus sûr est donc d’entourer ce que l’on veutcommenter par le tag On peut mettre ce tag dans tous lesemplacements où on pourrait mettre uncomposant <strong>JSF</strong>21/10/99 Richard Grin <strong>JSF</strong> - page 82


Langage EL(Expression Language)21/10/99 Richard Grin <strong>JSF</strong> - page 83


Utilité Sert à relier des propriétés ou des méthodes debeans avec des valeurs de pages <strong>JSF</strong> Une expression EL est entourée par #{…} Exemple :lie la valeur du champ de saisie de texte avec lapropriété « nom » du bean « utilisateur »21/10/99 Richard Grin <strong>JSF</strong> - page 84


Composants standards21/10/99 Richard Grin <strong>JSF</strong> - page 85


Librairies de balises Plusieurs librairies de balises peuvent êtreutilisées dans une page <strong>JSF</strong> (avec Facelets) :n <strong>JSF</strong> Facelets, de préfixe uin <strong>JSF</strong> HTML, de préfixe hn <strong>JSF</strong> core tag, de préfixe fn JSTL core tag (version 1.1), de préfixe cn JSTL functions tag (version 1.1), de préfixe fnn Eviter JSTL ! Ces préfixes correspondent à des espaces denoms XML (URL à voir dans la documentation)21/10/99 Richard Grin <strong>JSF</strong> - page 86


Il est impossible dans cette introduction de passeren revue toutes les balises standards offertes parFacelets De nombreux sites Web en donnent desexemples Documentation pour ces balises :http://download.oracle.com/javaee/6/javaserverfaces/<strong>2.0</strong>/docs/pdldocs/facelets/ Dans cette section nous donnerons quelquesconseils pour débuter21/10/99 Richard Grin <strong>JSF</strong> - page 87


Quelques références Le tutoriel Java EE 6 d’Oracle est un bon sitepour débuter :http://download.oracle.com/javaee/6/tutorial/doc/bnarf.html21/10/99 Richard Grin <strong>JSF</strong> - page 88


Types de composants 4 grands types :n Ceux qui contiennent une valeur (ValueHolderou EditableValueHolder) ; un label ou unchamp de saisie par exemplen Ceux qui proposent un choix à l’utilisateur (listedéroulante, boîtes à cocher, boutons radio,…)n Ceux qui lancent une action (ActionSource2) ;un bouton par exemplen Ceux qui correspondent à une structureitérative ; une datatable par exemple21/10/99 Richard Grin <strong>JSF</strong> - page 89


Nous allons étudier un exemple de chaque typepour en illustrer les particularités Reportez-vous à la documentation de <strong>JSF</strong> ou dela librairie de composants que vous utilisez pouren savoir plus21/10/99 Richard Grin <strong>JSF</strong> - page 90


Composants pour du texte Champ texte avec (1 ligne) Saisie des mots de passe avec Zone de texte de plusieurs lignes avecImage tutoriel Java EE 6 d’Oracle21/10/99 Richard Grin <strong>JSF</strong> - page 91


Les listes Il y a plusieurs composants <strong>JSF</strong> standards quipermettent de proposer un choix (ou plusieurs)parmi une liste de valeurs Tous les composants sont bâtis sur des classesJava communes mais se présentent différemmentà l’utilisateur21/10/99 Richard Grin <strong>JSF</strong> - page 92


Listes à choix unique Boutons radios avec Liste déroulante avec Liste non déroulante avec Image tutoriel Java EE 6 d’Oracle21/10/99 Richard Grin <strong>JSF</strong> - page 93


Listes à choix multiple Boîtes à cocher avec Liste déroulante avec Liste non déroulante avec Image tutoriel Java EE 6 d’Oracle21/10/99 Richard Grin <strong>JSF</strong> - page 94


Les listes - ExempleCe qui est désigné par f:selectItem et f:selectItems sera affichédans la liste. Le choix fait par l’utilisateur parmi toutes ces valeurs, estrangé dans bean.choix (attribut value de selectOneListBox)Les entrées de la liste qui correspondent à l’attribut value sontprésélectionnées dans la liste21/10/99 Richard Grin <strong>JSF</strong> - page 95


Classe SelecItem Paquetage javax.faces.model Donne un label, une valeur et d’autres propriétésd’une liste de GUI Utilisée pour la valeur (attribut value) des tags et 21/10/99 Richard Grin <strong>JSF</strong> - page 96


Son attribut value peut désigner un tableau, unecollection ou une map Le plus souvent, on part d’une liste d’éléments eton la transforme en tableau ou collection deSelectItem Le transparent suivant donne un schéma de codepour une telle transformation (souvent fourni sousla forme d’une méthode static utilitaire)21/10/99 Richard Grin <strong>JSF</strong> - page 97


Schéma de code pour public static SelectItem[]getSelectItems(List entities) {SelectItem[] items = new SelectItem[size];for (Object x : entities) {items[i++] =new SelectItem(x, x.toString());}return items;}21/10/99 Richard Grin <strong>JSF</strong> - page 98


Autre façon de faire Pour éviter la complication de la transformationen SelectItem, on peut utiliser les attributs var,itemValue et itemLabel Exemple :La variable « personne » contient unélément de la liste désignée par value21/10/99 Richard Grin <strong>JSF</strong> - page 99


Chausse-trappes avec les listes Quelques chausse-trappes que l’on peutrencontrer avec les listes déroulantes sontexposées dans les transparents suivants En particulier avec les convertisseurs et lesvalidateurs qui seront étudiés en détails dans la2 ème partie de ce cours sur <strong>JSF</strong>21/10/99 Richard Grin <strong>JSF</strong> - page 100


Conversion pour les listes déroulantes Comment se fait la conversion entre les élémentsd’une liste et ce qui est affiché ? Par exemple, une liste d’écoles et ce qui estaffiché ? Il faut bien comprendre que le composant <strong>JSF</strong> vaêtre transformé en élément(s) HTML et quetoutes les valeurs vont être transformées enString ; en retour, une valeur choisie parl’utilisateur sera une String qu’il faudraéventuellement convertir en un autre type21/10/99 Richard Grin <strong>JSF</strong> - page 101


Convertisseur Si le type T des éléments à choisir n’est pasString (ça peut, par exemple, être des pays de laclasse Pays), il faut un convertisseur pour passerdu type T à String (pour le passage en HTML) etvis-versa (pour le rangement du choix sous laforme d’une instance du type T) On aura un message d’erreur si on veut mettreune 1 ère entrée du type « Choisissez un pays »car cette première entrée n’est pas du type Tn Solution : ne pas mettre cette première ligne !21/10/99 Richard Grin <strong>JSF</strong> - page 102


Validation d’un choix dans une liste <strong>JSF</strong> vérifie que le choix qui est envoyé au serveurest bien un des choix proposés à l’utilisateur Ça implique que les choix proposés soientconnus par <strong>JSF</strong> au moment de la validation Si les choix dépendent d’une propriété d’unbacking bean (par exemple, un pays pour uneliste de villes d’un certain pays), il faut donner labonne portée au bean pour que les choixpuissent être calculés correctement au momentde la validation (View ou Session par exemple)21/10/99 Richard Grin <strong>JSF</strong> - page 103


Très utilisé pour représenter les données d’unebase de données : chaque ligne de la tablecorrespond à une ligne d’une table Sera affiché comme une table HTML21/10/99 Richard Grin <strong>JSF</strong> - page 104


Modèle de données Les données affichées sont représentées par unmodel : javax.faces.model.DataModel Souvent on n’utilise pas directement le modèle ; onfournit un tableau, une liste ou un ResultSet àl’attribut value de ; en interne uneclasse fille de DataModel enveloppera les donnéesfournies Quelquefois il faut expliciter l’utilisation deDataModel dans le backing bean de la page pouravoir plus de facilités de manipulation des données21/10/99 Richard Grin <strong>JSF</strong> - page 105


DataModel Contient des méthodes pour récupérer lesnuméros des lignes, la valeur de la ligne « encours » (un Object), gérer les écouteurs de latable21/10/99 Richard Grin <strong>JSF</strong> - page 106


ExempleNom#{client.nom}...21/10/99 Richard Grin <strong>JSF</strong> - page 107


Permet de répéter un affichage sur une listed’objets Exemple :#{item.nom}21/10/99 Richard Grin <strong>JSF</strong> - page 108


Navigation21/10/99 Richard Grin <strong>JSF</strong> - page 109


Handler de navigation La navigation entre les pages indique quelle page estaffichée quand l’utilisateur clique sur un bouton poursoumettre un formulaire ou quand il clique sur un lien Cette navigation est déléguée au « handler de navigation » La navigation peut être définie par des règles dans le fichierde configuration faces-config.xml ou par des valeurs écritesdans le code JavanEn général on s’en passe mais si on veut faire une navigation«logique » on peut utiliser les wizards de netbeans21/10/99 Richard Grin <strong>JSF</strong> - page 110


Navigation statique et dynamique La navigation peut être statique : définie « endur » au moment de l’écriture de l’application La navigation peut aussi être dynamique : définieau moment de l’exécution par l’état del’application (en fait par la valeur retournée parune méthode)21/10/99 Richard Grin <strong>JSF</strong> - page 111


Dans les pages <strong>JSF</strong> Dans les pages <strong>JSF</strong> on indique la valeur ou laméthode associée à un bouton qui déterminera lanavigation Avec une valeur : Ou avec une méthode (qui retourne une valeur) :21/10/99 Richard Grin <strong>JSF</strong> - page 112


Modèle de navigation <strong>JSF</strong>,Le modèle GET - PRG21/10/99 Richard Grin <strong>JSF</strong> - page 113


Par défaut, <strong>JSF</strong> travaille avec des requêtes POST Depuis <strong>JSF</strong> <strong>2.0</strong> il est plus simple de travailleravec des requêtes GET, ce qui facilite l’utilisationde l’historique et marque-pages (bookmarks) desnavigateurs et évite des doubles validations deformulaire non voulues par l’utilisateur21/10/99 Richard Grin <strong>JSF</strong> - page 114


Utiliser GET 2 composants de <strong>JSF</strong> <strong>2.0</strong> permettent de générerdes requêtes GET : et 21/10/99 Richard Grin <strong>JSF</strong> - page 115


Le problème avec POST Avec une requête POST envoyée pour soumettreun formulairen le refresh de la page affichée (ou un retour enarrière) après un POST soumet à nouveau leformulaire ; le navigateur prévient l’utilisateuren affichant une fenêtre popup inquiétante etdifficile à comprendre pour l’utilisateurn l’adresse de la page affichée après le POSTest la même que celle du formulaire (donc paspossible de faire réafficher cette page enutilisant l’historique du navigateur)21/10/99 Richard Grin <strong>JSF</strong> - page 116


La raison du problème C’est le servlet qui intercepte les requêtesattachées aux pages <strong>JSF</strong> qui redirige vers lapage désignée par le modèle de navigation <strong>JSF</strong> Le navigateur n’a pas connaissance de cettedirection et pense être toujours dans la page quicontient le formulaire qui a été soumis On avait déjà le problème l’année dernière avecles HTTP forwarder dans les Servlets, mais celane vous a pas troublé outre mesure ;-)21/10/99 Richard Grin <strong>JSF</strong> - page 117


Les conséquences du problème Le navigateur est en retard d’une page pourafficher l’URL de la page en cours Il ne garde donc pas la bonne adresse URL sil’utilisateur veut garder un marque-page Le navigateur pense être toujours dans la pagequi contient le formulaire après un retour enarrière ou un refresh et il essaie de le soumettre ànouveau (il demande malgré tout uneconfirmation lors de la soumission multiple d’unformulaire)21/10/99 Richard Grin <strong>JSF</strong> - page 118


La solution :POST, REDIRECT, GET (PRG) Le modèle POST– REDIRECT– GET préconise den Ne jamais montrer une page en réponse à unPOSTn Charger les pages uniquement avec des GETn Utiliser la redirection pour passer de POST àGET21/10/99 Richard Grin <strong>JSF</strong> - page 119


Sans PRGCette image et la suivante viennent de Wikipedia21/10/99 Richard Grin <strong>JSF</strong> - page 120


Avec PRG21/10/99 Richard Grin <strong>JSF</strong> - page 121


Problème de PRG PRG peut poser un problème lorsque la page verslaquelle l’utilisateur est redirigée (le GET), doitafficher des données manipulées par le formulaire C’est le cas, par exemple, lorsque cette page estune page qui confirme l’enregistrement dans unebase de données des informations saisies parl’utilisateur dans le formulaire En effet, les informations conservées dans laportée de la requête du POST ne sont plusdisponibles21/10/99 Richard Grin <strong>JSF</strong> - page 122


Solutions Une des solutions est de ranger les informationsdans la session plutôt que dans la requête Cependant cette solution peut conduire à unesession trop encombrée Une autre solution est de passer les informationsd’une requête à l’autre <strong>JSF</strong> <strong>2.0</strong> offre 2 nouvelles possibilités qui facilitentla tâche du développeur :n la mémoire flashn les paramètres de vue21/10/99 Richard Grin <strong>JSF</strong> - page 123


Paramètres de vue Les paramètres d’une vue sont définis par desbalises incluses dans une balise (à placer au début, avant les et ) :21/10/99 Richard Grin <strong>JSF</strong> - page 124


L’attribut name désigne le nom d’un paramètre derequête GET L’attribut value désigne (par une expression dulangage EL) le nom d’une propriété d’un beandans laquelle la valeur du paramètre est rangée Important : il est possible d’indiquer uneconversion ou une validation à faire sur lesparamètres, comme sur les valeurs descomposants saisis par l’utilisateur21/10/99 Richard Grin <strong>JSF</strong> - page 125


Un lien vers une page qui contient des balises contiendra tous les paramètresindiqués par les s’il contient« includeViewParams=true » Exemple :


Fonctionnement deincludeViewParams1. La page de départ a un URL qui a le paramètreincludeViewParams2. Elle va chercher les de lapage de destination. Pour chacun, elle ajoute unparamètre à la requête GET en allant chercherla valeur qui est indiquée par l’attribut value du3. A l’arrivée dans la page cible, la valeur duparamètre est mise dans la propriété du beanindiquée par l’attribut value21/10/99 Richard Grin <strong>JSF</strong> - page 127


Fonctionnement deincludeViewParams Ca revient à faire passer une valeur d’une page àl’autre Si la portée du bean est la requête et qu’il y a euredirection, ça revient plus précisément à fairepasser la valeur d’une propriété d’un bean dansun autre bean (de la même classe)21/10/99 Richard Grin <strong>JSF</strong> - page 128


Donner une valeur à un paramètre Il y a plusieurs façons de donner une valeur à unparamètre de requête GET ; les voici dans l’ordrede priorité inverse (la dernière façon l’emporte)n Dans la valeur du outcomen Avec les paramètres de vuen Avec un 21/10/99 Richard Grin <strong>JSF</strong> - page 129


Exemple ; page2.xhtml…Valeur : #{bean.prop1}21/10/99 Richard Grin <strong>JSF</strong> - page 130


Fonctionnement Si page2 est appelé par la requête GET suivantepage2.xhtml?param1=v1&param2=v2la méthode setProp1 du bean est appelée avecl’argument v1 (idem pour param2 et v2) Si un paramètre n’apparait pas dans le GET, lavaleur du paramètre de requête est null et lesetter n’est pas appelé (la propriété du bean n’estdonc pas mise à null)21/10/99 Richard Grin <strong>JSF</strong> - page 131


Conserver des adresses utiles Outre le fait qu’un refresh ne provoque plus desoumission du formulaire, le modèle PRG permetaussi de permettre de conserver un URL utiledans un marque-page ou dans l’historique En effet, l’URL contient les paramètres quipermettront de réafficher les mêmes données àun autre moment Sans PRG, les données utiles sont conservéesdans l’entité de la requête et pas dans l’URL21/10/99 Richard Grin <strong>JSF</strong> - page 132


preRenderView Listener (1) Une situation courante : il est possible de nemettre en paramètre qu’un identificateur desdonnées qui ont été traitées Par exemple, que la clé primaire des donnéesenregistrées dans la base de données Avec les procédés précédents on peut fairepasser cet identificateur dans la page qui vaafficher les données21/10/99 Richard Grin <strong>JSF</strong> - page 133


preRenderView Listener (2) Mais ça ne suffit pas ; il faut utiliser une autrenouveauté de <strong>JSF</strong> <strong>2.0</strong>, les listeners« preRenderView » qui permet d’exécuter uneaction avant l’affichage de la vue On peut ainsi aller rechercher (par exemple dansune base de données) les informations identifiéespar l’identificateur21/10/99 Richard Grin <strong>JSF</strong> - page 134


Exemple de preRenderView...Nom : #{bean.client.nom}...21/10/99 Richard Grin <strong>JSF</strong> - page 135


Portées21/10/99 Richard Grin <strong>JSF</strong> - page 136


Les différentes portées (scope) Application Session Requête Conversation Vue Personnalisée (custom)21/10/99 Richard Grin <strong>JSF</strong> - page 137


Les différentes portée peuvent conserver desobjets dans des maps21/10/99 Richard Grin <strong>JSF</strong> - page 138


Lorsqu’une valeur est référencée dans une pageWeb, la valeur est d’abord recherchée dans lescope le plus « proche » : requête, vue, session,application, etc21/10/99 Richard Grin <strong>JSF</strong> - page 139


Mettre une valeur dans une portée Cours à venir… voir support de cours sur lesbacking beans (à venir lui aussi)21/10/99 Richard Grin <strong>JSF</strong> - page 140


Mémoire flash Il est bon de limiter la taille des informationsentreposées dans la session Cependant la portée « request » peut ne pasconvenir, en particulier s’il y a redirection de larequête (par exemple pour appliquer le modèlePOST – REDIRECT – GET) La mémoire « flash » peut alors convenir : unobjet mis dans la mémoire flash est encoredisponible dans la prochaine requête issue de lamême session ; il est ensuite effacéautomatiquement de la mémoire flash21/10/99 Richard Grin <strong>JSF</strong> - page 141


Utiliser la mémoire flash (page Web) Dans une page Web, avec le langage EL (flashest un objet implicite du langage) :#{flash.objet}21/10/99 Richard Grin <strong>JSF</strong> - page 142


Utiliser la mémoire flash (en Java) Dans le backing bean par ex : il faut récupérer lecontexte externe :ExternalContext ec =FacesContext.getCurrentInstance().getExternalContext().getFlash();qui renvoie un objet de la classe Flash (dejavax.faces.context) qui se manipule commeune session (comme une map) dont la clé est uneString et la valeur est un Object Par exemple,ec.getFlash().put("nom", nom);21/10/99 Richard Grin <strong>JSF</strong> - page 143


Exemple...Page confirm.xhtml :...21/10/99 Richard Grin <strong>JSF</strong> - page 144


keep Il est possible de garder l’objet pour une requête deplus grâce à la méthode keep de la classe Flash #{flash.keep.objet} renvoie l’objet qui a la clé« objet » et garde l’objet pour encore une requêtede plus Dans le code Java, il faut le faire en 2 étapes :récupérer la valeur et remettre dans le flash pour laprochaine requête en appelant la méthode keepqui ne renvoie rien (void comme type retour).21/10/99 Richard Grin <strong>JSF</strong> - page 145


Backing beans21/10/99 Richard Grin <strong>JSF</strong> - page 146


Dans la section « Architecture des applications<strong>JSF</strong> » on a vu que les pages <strong>JSF</strong> sont épauléespar des backing beans qui apportent la puissancedu langage Java pour coder des interactionssophistiquées avec l’utilisateur Les possibilités sont infinies Dans cette section nous allons voir quelquesexemples caractéristiques de l’utilisation desbacking beans21/10/99 Richard Grin <strong>JSF</strong> - page 147


Plus de code dans les pages <strong>JSF</strong> Pour ceux qui ont travaillé avec JSP, il fautoublier la mauvaise habitude d’inclure de laprogrammation dans les pages <strong>JSF</strong> Tout le code (non « métier ») doit maintenant setrouver dans les backing beans (le code métierdoit se trouver dans les EJB ou classes Javaliées)21/10/99 Richard Grin <strong>JSF</strong> - page 148


EJB21/10/99 Richard Grin <strong>JSF</strong> - page 149


Pour plus de détails, se référer au cours sur lesEJB Nous allons voir ici quelques utilisationscaractéristiques des EJB par le code des backingbeans21/10/99 Richard Grin <strong>JSF</strong> - page 150


Ajax21/10/99 Richard Grin <strong>JSF</strong> - page 151


Ajax Asynchronous Javascript and XML Permet des échanges entre le client et le serveurWeb sans affichage d’une page entière Les requêtes envoyées par le client sont lancées« en arrière-plan » ; l’utilisateur peut continuer àtravailler avec la page en cours La réponse du serveur à la requête peut nemodifier qu’une partie de la page en cours21/10/99 Richard Grin <strong>JSF</strong> - page 152


Pemet d’ajouter des fonctionnalités « Ajax » aucomposant <strong>JSF</strong> dans lequel il est inclus Par exemple, un bouton de soumission deformulaire peut envoyer une requête et laréponse du serveur mettra à jour une partie de lapage sur laquelle l’utilisateur a continué àtravailler21/10/99 Richard Grin <strong>JSF</strong> - page 153


- les attributs event : événement déclencheur de la requête execute : composants pris en compte pour l’envoide la requête (espace séparateur) render : composants mis à jour au moment de laréponse du serveur (espace séparateur)21/10/99 Richard Grin <strong>JSF</strong> - page 154


Exemple 121/10/99 Richard Grin <strong>JSF</strong> - page 155


Exemple 2...21/10/99 Richard Grin <strong>JSF</strong> - page 156


Compléments sur les attributs Chaque type de composant a un typed’événement par défaut Par exemple, valueChange pour les ou action pour les21/10/99 Richard Grin <strong>JSF</strong> - page 157


Compléments sur les attributs execute et render doivent indiquer un ouplusieurs identificateurs de composants Quelques valeurs particulières : @all, @this (lecomposant qui englobe ; défaut pourexecute), @form (tous les composants duformulaire), @none (défaut pour render) ; on peutaussi donner une expression EL qui fournit unecollection de String (qui désignent desidentificateurs) ; expression évaluée durant lerendu de la page21/10/99 Richard Grin <strong>JSF</strong> - page 158


Composants inclus dans peut aussi encadrer plusieurscomposants <strong>JSF</strong> qui lanceront alors des appelsAjax sur les événements indiqués :21/10/99 Richard Grin <strong>JSF</strong> - page 159


Conversion21/10/99 Richard Grin <strong>JSF</strong> - page 160


Utilité des converters Quand le serveur reçoit une requête POST, lesvaleurs saisies par l’utilisateur arrivent sous laforme de chaînes de caractères Ces chaînes doivent souvent être traduites enobjets Java Par exemple, si un candidat à une formation aindiqué sa nationalité par une liste déroulante, cechoix doit être traduit en un objet Pays qui seraassocié à l’objet Candidat qui représentel’utilisateur21/10/99 Richard Grin <strong>JSF</strong> - page 161


Désigner un convertisseur Lorsqu’un composant a besoin d’unconvertisseur, on peut le désignern par une sous-balise en donnantl’identificateur du convertisseur :n par l’attribut converter du composantn Par une sous-balise spéciale pour lesconvertisseurs standards21/10/99 Richard Grin <strong>JSF</strong> - page 162


Convertisseur par défaut On verra qu’il est aussi possible d’associer unconvertisseur par défaut pour un type Ce convertisseur par défaut sera utilisé si aucunconvertisseur n’est explicitement désigné Une erreur est lancée si aucun convertisseurn’est donnée par son identificateur et qu’aucunconvertisseur par défaut n’existe pour le type21/10/99 Richard Grin <strong>JSF</strong> - page 163


Convertisseurs standards <strong>JSF</strong> fournit des convertisseurs pour les typesprimitifs, pour les dates et pour les classesBigInteger et BigDecimal Des balises spéciales sont fournies par <strong>JSF</strong> pourles convertisseurs standards mais on peut aussiutiliser la balise en donnantl’identificateur du convertisseur standard Par exemple, est équivalent à21/10/99 Richard Grin <strong>JSF</strong> - page 164


Exemples 21/10/99 Richard Grin <strong>JSF</strong> - page 165


Convertisseur personnalisé Le développeur doit écrire les convertisseursassociés aux types qui ne sont pas pris en chargepar les convertisseurs standards de <strong>JSF</strong> (customconverter) Il fautn écrire la classe Java du convertisseurn indiquer quand utiliser le convertisseur21/10/99 Richard Grin <strong>JSF</strong> - page 166


Écrire un convertisseur Classe Java qui implémente l’interface Converter(paquetage javax.faces.convert) Cette interface contient les 2 méthodesn Object getAsObject(FacesContext,UIComponent, String) qui transforme unechaîne de caractères en objetn String getAsString(FacesContext,UIComponent, Object) qui transforme un objeten chaîne de caractères21/10/99 Richard Grin <strong>JSF</strong> - page 167


Comme pour un validateur, il n’est pas possibled’utiliser @Inject dans un convertisseur Mais on peut écrire ce type de code pour utiliserun EJB ou une ressource :try {ic = new InitialContext();myejb= (MyEJB) ic.lookup("java:global/xxxx/MyEJB");} catch (NamingException e) {…}21/10/99 Richard Grin <strong>JSF</strong> - page 168


Désigner un convertisseur Lorsqu’un composant doit utiliser unconvertisseur, si aucun convertisseur particuliern’est désigné par son identificateur c’est leconvertisseur par défaut du type qui est utilisé Pour désigner un convertisseur particulier ou unconvertisseur par défaut d’un type, ledéveloppeur peut utiliser une annotation ou écrireune configuration dans le fichier faces-config.xml21/10/99 Richard Grin <strong>JSF</strong> - page 169


Annotation @FacesConverter L’attribut par défaut donne un identificateur :@FacesConverter("fr.unice.Pays") L’attribut forClass indique que le convertisseur estle convertisseur par défaut d’une classe :@FacesConverter(forClass=fr.unice.Pays.class)21/10/99 Richard Grin <strong>JSF</strong> - page 170


Fichier faces-config.xml Donne un identificateur à la classe du convertisseur :fr.unice.Paysfr.unice.PaysConverter Indique la classe du convertisseur par défaut d’untype :fr.unice.Paysfr.unice.Pays21/10/99 Richard Grin <strong>JSF</strong> - page 171


Balise personnalisée pour convertisseur Il est possible de créer de nouvelles balises pouravoir des convertisseurs qui ont des attributscomme, par exemple, l’attribut pattern de la balise Pour cela, comme pour toutes les balisespersonnalisées, il faut écrire un fichier dedescription de balises (voir section sur les baliseset composants personnalisés) ou créer un fichierjar à part21/10/99 Richard Grin <strong>JSF</strong> - page 172


Bibliographie Core <strong>JSF</strong>, 3 ème édition mise à jour pour <strong>JSF</strong> <strong>2.0</strong>.David Geary et Cay Horstmann. Prentice Hall.Le meilleur livre pour débuter. The Complete Reference <strong>JSF</strong> <strong>2.0</strong>. Ed Burns etChris Schalk. Quelques complémentsintéressants par rapport au livre Core <strong>JSF</strong>. <strong>JSF</strong> <strong>2.0</strong> Cookbook. Anghel Leonard. PacktPublishing. Descriptions détaillées de quelquesrecettes pour résoudre des points précis.21/10/99 Richard Grin <strong>JSF</strong> - page 173

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!