Vous êtes sur la page 1sur 164

JavaServerFaces(JSF)avecEclipse

Conception d'applications web

FranoisXavierSENNESAL

Rsum
Ce livre sur JSF traite de la mise en uvre de la technologie Java Server Faces avec lenvironnement de dveloppement Eclipse. Les aspects thoriques, tays par de nombreux exemples, montrent comment lusage de composants JSF permet de faciliter la conception et la maintenance des applications web, tout en offrant aux utilisateurs des services plus adapts leurs attentes. Le livre sadresse tout particulirement des lecteurs matrisant le langage de programmation Java et familiariss par ailleurs avec le dveloppement dapplications web bases sur la technologie JSP. Les principaux points dvelopps dans ce livre couvrent la validation et la conversion des donnes, la gestion vnementielle, la conception de composants JSF personnaliss, ainsi que linternationalisation des applications. Aprs un rappel des notions essentielles lies la conception dapplications web en environnement J2EE, louvrage prsente dans le dtail le langage dvaluation dexpressions propre la technologie JSF, ainsi que les bibliothques de composants utilises. Les chapitres suivants montrent comment exploiter efficacement les composants en question, tout en sattardant sur les mthodes utilisables pour dfinir les rgles de navigation des applications web.

L'auteur
Franois-Xavier Sennesal est responsable informatique au sein d'un organisme de recherche publique. Il assure par ailleurs des enseignements dans le domaine des nouvelles technologies l'cole Suprieure d'Ingnieurs Lonard de Vinci Paris, ainsi qu' l'universit de Versailles St Quentin. travers ce livre, le lecteur profite d'une riche exprience professionnelle axe sur le dveloppement d'applications web avec JSF et Eclipse.

Ce livre numrique a t conu et est diffus dans le respect des droits dauteur. Toutes les marques cites ont t dposes par leur diteur respectif. La loi du 11 Mars 1957 nautorisant aux termes des alinas 2 et 3 de larticle 41, dune part, que les copies ou reproductions strictement rserves lusage priv du copiste et non destines une utilisation collective, et, dautre part, que les analyses et les courtes citations dans un but dexemple et dillustration, toute reprsentation ou reproduction intgrale, ou partielle, faite sans le consentement de lauteur ou de ses ayants droit ou ayant cause, est illicite (alina 1er de larticle 40). Cette reprsentation ou reproduction, par quelque procd que ce soit, constituerait donc une contrefaon sanctionne par les articles 425 et suivants du Code Pnal. Copyright Editions ENI

ENI Editions - All rigths reserved

- 1-

Introduction
Ce chapitre tient lieu de rappel concernant les notions essentielles mises en uvre dans le cadre de la conception dapplications web base sur la technologie Java. Il prsente de faon sommaire les notions dapplication web, de servlets et de pages JSP. Il traite galement de linstallation de lenvironnement de dveloppement Eclipse pour permettrelacrationdapplicationswebJ2EE.

ENI Editions - All rigths reserved

- 1-

Rappelssurlanotiondapplicationweb
1.lmentsconstitutifsduneapplication
Uneapplicationwebestcomposedundescripteurdedploiement,etdunensemblederessources.Cesressources peuventtredetypesvaris:lespluscaractristiquessontlespagesweb(statiquesoudynamiques),lesclasses correspondantdesservlets,etlesclassespersonnalises. Ledescripteurdedploiementestunfichierconventionnellementnommweb.xml.Ilregroupediversesinformations concernantlapplication,commeladclarationdesservlets,ladfinitiondesparamtresinitiauxouladclarationde listeners.

2.Vieduneapplication
LefonctionnementduneapplicationwebbasesurlatechnologieJ2EErequiertlutilisationdunmoteurdeservlets tenudelaprendreencharge.LemoteurdeservletslepluspopulaireestApacheTomcat. Lorsquune page JSP de lapplication web est appele pour la premire fois par un internaute, celleci est dans un premiertempstraduiteenservletparlemoteurdeservlets.Unetentativedecompilationdecetteservletestensuite assure.Silacompilationrussit,laservletestexcute:celaaleplussouventpoureffetderestitueruncontenu danslenavigateurdelinternaute.Silacompilationdelaservletaboutitunchec,unmessagederreurestgnr parlemoteurdeservlets,puisrestitulinternaute.Ceprocessusdetraduction/compilationestparailleursralis chaquefoisquunemodificationestapportedanslecodesourcedelapageJSP.

ENI Editions - All rigths reserved

- 1-

Lesservlets
1.Prsentation
Une servlet est une classe implmentant linterface javax.servlet.Servlet. Elle fonctionne par lintermdiaire du moteurdeservlets,enrceptionnantlesrequtesmisesparlesclientsweb,etenyrpondant. Il existe actuellement deux classes standards implmentant Servlet : il sagit de classes abstraites nommes GenericServlet et HttpServlet. La premire caractrise une servlet indpendante de tout protocole, alors que la secondeestspcifiqueauprotocoleHTTP.Enfin,linterfaceServletestgalementimplmenteenstandardparune classe non abstraite nomme FacesServlet : celleci gre le cycle de vie des applications web exploitant des composantsJavaServerFaces.

2.Cycledevie
Une servlet assure le traitement des requtes mises par les clients par lintermdiaire de deux objets, issus des classesServletRequestetServletResponse.Cesobjetssontfournisenparamtredunemthodeabstraitenomme service,quilconvientdimplmenterpourpermettrelapriseenchargedesrequtesclientes. Outre cette mthode service, dont linvocation est assure chaque fois quune requte cliente est mise, une servletimplmentedeuxmthodesentrantspcifiquementenjeudanssoncycledevie.Ilsagitdesmthodesinit etdestroy.Lapremireestappeleparlemoteurdeservletsjusteaprslacrationdelaservlet,etuniquement cemoment.Lasecondedecesdeuxmthodesestinvoquejusteavantladestructiondelaservlet,etuniquement danscecas. Lexemple suivant illustre la conception dune servlet base sur la classe GenericServlet. Sa mthode service exploitelobjetdetypeServletResponsepourretournerunechanedecaractresverslefluxdesortie. package perso; import java.io.IOException; import import import import javax.servlet.GenericServlet; javax.servlet.ServletException; javax.servlet.ServletRequest; javax.servlet.ServletResponse;

public class MaGenericServlet extends GenericServlet { @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { arg1.getWriter().println("Bienvenue"); } }

3.CasparticulierdesservletsrpondantspcifiquementauprotocoleHTTP
Le meilleur moyen de concevoir une servlet capable de prendre en charge les requtes HTTP consiste crer une classedrivedeHttpServlet. Cette classe ralise, au travers de sa mthodeinit, un traitement rpartissant les requtes compte tenu de leur nature. Ainsi, une requte GET pourra tre prise en charge au travers de la mthode doGet, alors quune requte POSTleseragrcelamthodedoPost. Ilconvientalorsdesurchargerlunedecesdeuxmthodes,comptetenudelanaturedelarequteralise,pour tirerconvenablementprofitdesinformationsfourniesparleclient.Cesmthodesacceptentenargumentunobjetde type HttpServletRequest contenant toutes les caractristiques de la requte initiale, ainsi quun objet de type HttpServletResponse utilisable pour renvoyer une rponse au client. Lobjet de type HttpServletRequest peut en particuliertreexploitpourprendreconnaissancedesinformationspassesdanslachanerequteaumomentde la soumission dunformulairedesaisie,grcelune ou lautredesmthodes getParameter,getParameterNames,et getParameterValues.

ENI Editions - All rigths reserved

- 1-

LatechnologieJavaServerPages(JSP)
1.Unebrvedescriptiondumodedefonctionnement
La technologie JSP est conue pour faciliter la gnration de pages web dynamiques sappuyant sur Java. Elle est directementassocielanotiondeservlets,etpermetdobtenirunesparationentrelalogiquemtieretlacouche deprsentation,principalementparlusagedesJavaBeans. LorsquunepageJSPsituedansuneapplicationwebparticulireestdemandeparunclientweb,leconteneurquila gre(moteurdeservlets)captureetanalyselarequte.Silapageenquestionnajamaistappele,ousisoncode sourceatmodifi,leconteneurlatraduitsouslaformeduneservlet.Cetteservletestalorscompilepuisexcute pourfournirunerponselarequteduclientweb.Parcontre,silapageadjtutiliseetsisoncodesourcena pas t modifi, la servlet qui lui correspond existe dj : il suffit alors au conteneur dexcuter cette servlet pour rpondreauclient.

2.LescomposantsdunepageJSP
LecodesourceleplussimpledunepageJSPpeutcorrespondreceluici: <html> ... <body> <% out.println("Ceci est un cours de dveloppement web avec les JSP"); %> ... </body> </html> Dune manire gnrale, une page JSP se compose dlments statiques, caractriss par des balises HTML, et dlmentsdynamiques.Cesdernierspeuventtreclasssenquatrecatgories:lesdirectives,lesactions,lesobjets implicites,etleszonesdescripting.

a.Lesdirectives
CeslmentsfournissentdesinformationsglobalesconcernantlapageJSP.Laformegnraledelasyntaxeutilise pourdfinirunedirectiveestlasuivante: <%@ nom_directive {nom_attribut1="valeur_attribut1"} {nom_attributN="valeur_attributN"}%>

ENI Editions - All rigths reserved

- 1-

Unedirectiveestdonccaractriseparunouplusieursattributs.Lillustrationlapluscourammentrpandueconsiste mentionnerlelangageutiliserpourlacompilationdelapageJSP. <%@ page language="java" %> IlconvientdeprciserquunepageJSPparticulirepeutcomporterplusieursdirectives. Les spcifications JSP proposent trois types de directives, nommes page, include et taglib. Chaque type de directivedisposedunjeudattributsspcifiques,dontvoiciunbrefrcapitulatif: Principauxattributsdeladirectivepage
q

language:langageutilispourlacompilationdelaJSP.Actuellement,uniquementJava. import:ensembledespaquetagesJavamettredispositiondelapageJSP. session:indiquesilesdonnesdesessionsontdisponiblespourlapage(valeurpardfaut:true). error_page:URLdelaJSPprenantenchargelesexceptionsrencontres. extends:classeparentedontdriveralaservletgnre. isErrorPage:indiquesilapagecouranteestuneerrorPage.Default=false.

LinstructionsuivanteillustrelimportationdepaquetagesauseindunepageJSP: <%@page import="java.sql.*, java.io.*" session="false" %>

Attributdeladirectiveinclude Ladirectiveincludenepossdequununiqueattributdnommfile.CeluiciindiquelenomdundocumentHTMLou dunepageJSPinclureautomatiquementdanslapagecourante. <%@ include file="../../piedDePage.html" %> <%@ include file="formulaireInscription.jsp" %>

Principauxattributsdeladirectivetaglib
q

uri:identifiedemanireuniqueledescripteurdunebibliothquedebalisespersonnalisesutiliserdans lapageJSP. prefix:chaneutilisepourdistinguerdesinstancesdebalisespersonnalises.

<%@ taglib uri="../hello.tld" prefix="exemple" %> <%@ taglib uri="http://www.monserveur.fr/hello.tld" prefix="test" %> <exemple:balise1 name="jacques"></exemple:balise1> <test:balise2 /> La directivetaglib permet donc dtendre le jeu de balises JSP standard par lemploi de bibliothques de balises personnalises.

b.Lesactions
Les actions standards constituent un moyen technique destin encapsuler les tches ralises les plus couramment.EllesseprsententsouslaformedebalisesincorporesdanslespagesJSP.Aucoursdelacompilation delaservlet,leconteneurrencontrecesbalisesetlesremplaceparlecodeJavacorrespondant. Voicilesdiffrentstypesdactionsstandards: Laction<jsp:useBean>

- 2-

ENI Editions - All rigths reserved

ElleestutilisepourinstancierunJavaBean,ouenlocaliseruneinstanceexistante.Cettemthodeesttrsefficace poursparerlaprsentationwebdelalogiquemtier,dontlecodeJavaestencapsuldansunJavaBean. LesattributsdecetteactionpermettentdefairecorrespondreunnomdevariableauJavaBean,etdeluiaffecterune duredeviegrcelanotiondeporte(page,session,application).Suivantlaportechoisie,leJavaBeanpeutou nontreaccessiblepartirdautrespagesJSP. <jsp:useBean id="nomBean" scope="session" class="classeBean"/>

Laction<jsp:setProperty> Cette action est utilise conjointement <jsp:useBean>. Elle permet de dfinir les valeurs des proprits dun JavaBean. Ladfinitiondespropritsdunbeanpeuttreassuredeplusieursmanires:
q

laidedesparamtresderequtes.Touteslespropritsdubeansontspcifiesgrceauxinformations fournies:

http://www.monserveur.fr/maPage.jsp?nom=dupond&prenom=paul <jsp:setProperty name="nomBean" property="*" />


q

Grcelutilisationexplicitedunnomdeproprit:

<jsp:setProperty name="nomBean" property="nom" value="dupond" />

Laction<jsp:getProperty> Cetteactionestgalementutiliseconjointement<jsp:useBean>.Ellepermetdaccderauxvaleursdesproprits dunJavaBean. <jsp:getProperty name="nomBean" property="nom" /> Lexemplesuivantillustrelutilisationconjointedesactions<jsp:useBean>,<jsp:getProperty>et<jsp:setProperty> dansunepageJSP: <jsp:useBean id="nomBean" scope="session" class="classeBean"/> <jsp:setProperty name="nomBean" property="nom" value="dupond" /> <html><head><title> Exemple dutilisation dun JavaBean dans une JSP </title></head><body> La valeur du nom est : <jsp:getProperty name="nomBean" property="nom" /> </body></html> Laction<jsp:forward> Ellepermetlaredirectiondelarequte,aumomentdelexcution,versuneressourcestatique,uneservlet,ouune autreJSP.Sonusageinterromptlexcutiondelapagecourante.Cetteactionpeutellemmecontenirdesactions <jsp:param>. <jsp:forward page="pageSuivante.jsp"> {<jsp:param .../>} </jsp:forward> Laction<jsp:include> Cetteactionfournitunmcanismepourincluredanslapagedesressourcesstatiquesoudynamiquesexternes(par exemple, autres pages JSP ou HTML). Elle peut ellemme contenir des actions <jsp:param>, constituant les paramtrespasserlaressourceinclure. <jsp:include page="hautPage.jsp"> {<jsp:param ... />} </jsp:include> Laction<jsp:plugin>

ENI Editions - All rigths reserved

- 3-

EllepermetlagnrationdedocumentsHTMLcontenantdespluginsquiserontexcutsparexemplesouslaforme dappletsJava,ousouslaformeduncomposantJavaBean.Aumomentdelexcutiondelapage,cetteactionest remplacesoitparunebalise<embed>,soitparunebalise<object>,suivantlanaturedunavigateurclient.Laction <jsp:plugin>peutellemmecontenirdesactions<jsp:param>. <jsp:plugin type="type de plugin (ex:applet)" code="nom de la classe excute par le plugin" codebase="chemin daccs la classe" > {<jsp:param ... />} </jsp:plugin> Laction<jsp:param> Cetteactionestutiliseuniquementconjointement<jsp:include>,<jsp:forward>ou<jsp:plugin>:ellepermetde crerdespairesnom/valeur,quitiennentlieudeparamtrespasssauxactionsdanslesquellesellessontplaces. <jsp:params> <jsp:param name="nom" value="DUPONT" /> </jsp:params>

c.Lesobjetsimplicites
LesobjetsimplicitessontdesobjetsaccessiblesdanstoutepageJSP,sansquilsoitncessairedelesinstancierau pralable. Les spcifications JSP prcisent que tous les langages de scripts pouvant servir crer des pages JSP doiventpermettredutilisercesobjets. Ces objets implicites sont bien sr instancis partir de classes ou interfaces disponibles dans le JDK (Java DevelopmentKit)oudansleJSDK(JavaServletDevelopmentKit)Packagejavax.servlet. Voiciunrcapitulatifdesprincipauxobjetsimplicites: application Reprsente le contexte dexcution des servlets. Il sagit dun objet de type javax.servlet.ServletContext disposantdelaportesession. out CorrespondauJspWriterrattachaufluxdesortie.Ildisposedelaportepage. page Correspondlobjet"this"reprsentantlapageencours.Ildisposedelaportepage. pageContext Reprsentelecontextedelapageencours.Saporteestpage. request Reprsente la requte soumise au moteur de servlet par le client (navigateur). Cet objet est issu de javax.servlet.ServletRequest.Saporteestrequest. response Reprsente la rponse retourne par le moteur de servlet au client. Il sagit dun objet implmentant linterface javax.servlet.http.HttpServletResponse,dontlaporteestpage. session Reprsente la session propre au client. De type javax.servlet.http.HttpSession, cet objet dispose de la porte session.

d.LesscriptingJSP

- 4-

ENI Editions - All rigths reserved

Les scripting JSP constituent un mcanisme permettant dinclure du code Java dans des pages JSP. Ils sont compossdetroistypesdlments:lesdclarations,lesexpressions,etlesscriptlets. Lesdclarations Les dclarations sont utilises pour dclarer des variables et des mthodes au sein dune page JSP. Elles sont initialises lors de linitialisation de la page JSP. Ds que cette opration est ralise, elles sont disponibles pour touteslesautresdclarationsetexpressions,ainsiquepourlesscriptlets. <%! String nom=new String("DUPONT"); %> <%! Public String getNom() { return nom;} %> Lesexpressions Lesexpressionspermettentdvaluerlersultatduneinstructionsouslaformedunechanedecaractres,etde linscrireimmdiatementsurlefluxdesortie.Lorsquelersultatdelinstructionnepeutpastreconvertienchane decaractres,uneexceptionestleve. <HTML><BODY> ... Bonjour Monsieur <%= getNom()%> </BODY></HTML> Lesscriptlets Lesscriptletsserventregroupertousleslmentsdescriptsentrelesbalises<%et%>.Ilspeuventcontenirtoute instructiondecodecompatibleaveclelangagementionndanslattributlanguagedeladirectivepage.

ENI Editions - All rigths reserved

- 5-

Installation de lenvironnement Eclipse et configuration dune applicationweb


CettesectionprsentelestapesncessaireslinstallationdelenvironnementdedveloppementEclipseenvuede concevoir des applications web bases sur J2EE et exploitant des composants JSF. Les informations suivantes supposentquunmoteurdeservletsestdjinstalletcorrectementconfigur. Linstallationdelenvironnementsefaitendeuxtapes:

1.ChoixduneimplmentationJSF
IlexistediffrentesimplmentationspermettantdexploiterlatechnologieJavaServerFaces,notammentMyFaceset SunJSF1.2RI.Lesexemplesetillustrationsprsentsdanscetouvrageonttralisspartirdecettedernire implmentation, laquelle ont t joints quelques autres composants destins faciliter la conception des applications web. Au final, les fichiers suivants ont t utiliss pour implmenter JSF dans le cadre des exemples prsentsdanscetouvrage: common-annotations.jar commons-beanutils.jar commons-collections.jar commons-digester.jar commons-logging.jar jsf-api.jar jsf-impl.jar jstl.jar standard.jar CesfichierspeuventtreobtenussurlesitedesditionsENI:www.editionseni.fr

2.InstallationetconfigurationdeEclipseetdelaWebToolPlatform
PourinstallerlIDEEclipse,ilsuffitdetlchargerlunedesversionsdeceproduitprenantenchargeJ2EE.Laversion utilise dans le cadre de cet ouvrage est Eclipse Europa (Eclipse v3.3.2) disponible ladresse http://www.eclipse.org/downloads/packages/release/europa/winter Unefoisleproduitinstalletactiv,ilestpossibledecrerunpremierprojetexploitantlatechnologieJSFensuivant lestapessuivantes:
s

DclarerlimplmentationJSF,voqueprcdemment,partirdumenuWindowPreferences.Endployantle n ud Web and Xml de larborescence, on accde successivement aux n uds Java Server Faces Tools, puis Libraries.IlestalorspossiblededfinirlabibliothquedarchivesJarmettanten uvrelescomposantsJSF.Le nomdecettebibliothquepeuttrechoisilibrement.Parcontre,ilestindispensabledecocherlacaseintituleIs JSFImplementation.

ENI Editions - All rigths reserved

- 1-

LacrationdunprojetwebdynamiquesefaitensuiteparutilisationdumenuFileNewProject.Lafentrequi apparatpermetdeslectionnerlechoixDynamicWebProjectproposdanslarborescencedun udWeb.Ilfaut alorsmentionnerunnomdeprojet,prciserlenometlalocalisationdumoteurdeservletsdanslazoneTarget Runtime,etslectionnerlaconfigurationJavaServerFacesv1.2ProjectdepuislazoneConfigurations.

- 2-

ENI Editions - All rigths reserved

Ilestensuitepossibledacceptertouteslesoptionsproposesdanslesdeuxcranssuivants(visiblesencliquant successivement deux fois sur le bouton Next). Lorsque la rubrique doptions dnomme JSF Capabilities est affiche,ilestindispensabledeprciserlimplmentationJSFutiliserdanslecadredecenouveauprojet:celase faitgrceauxboutonsradioJSFLibraries.Attention,ilestimpratifdecocherlacaseDeployavantdecliquersur leboutonFinish.

ENI Editions - All rigths reserved

- 3-

Une fois ces oprations ralises, le nouveau projet web dynamique est convenablement configur. Il est donc possibledeluiadjoindrediffrentesressources,tellesquedesclasses,despagesJSPouHTML.

- 4-

ENI Editions - All rigths reserved

LatechnologieJavaServerFaces
Aveclmergenceduweb2.0etlaccroissementdelapuissancedesordinateurs,denouveauxbesoinssontapparus visvis des applications web : les utilisateurs souhaitent dsormais une interaction plus forte entre le client quils exploitent (navigateur, le plus souvent) et le serveur web. limage de la ractivit dont ils bnficient lors de lutilisationdelogicielsnonorientsweb,lesinternautesattendentmaintenantdunsitewebquilragissequasiment instantanment aux actions ralises dans linterface. Quant aux dveloppeurs dapplications web, ils veulent aujourdhuipouvoirconcevoirrapidementdenouveauxoutils,enexploitantleconceptdecomposants. DetellesexigencesnepeuventpastrouverderponseadapteautraversdelaseuletechnologieJavaServerPages, ni mme de lusage des servlets : sans connaissances techniques particulirement pousses, ces deux moyens ne permettentpasundveloppementrapidedapplicationswebrichesenfonctionnalits.Ilssontgalementdpourvus de dispositifs simples utiliser en vue de la cration de composants graphiques labors, ventuellement personnalisables.Lacrationdetelscomposantsrequiert,lencore,beaucoupdetempsetdexpertise. Conscientdecesmanques,SunMicrosystemsproposelatechnologieJSF(JavaServerFaces)dontlebutprincipalestde fournir aux concepteurs dapplications web Java un framework de composants spcifiques. JSF permet la cration dapplicationssexcutantctserveur.Lesinterfacesgraphiquesrestituesauxclientssappuientsurunmodlede composantsparticulirementlabor,permettantlagestiondesvnementsetunerestitutionvariabledelapparence descomposantsgraphiquessuivantlecontexte. Lec urdelatechnologieJSFreposeprincipalementsurleslmentssuivants:
q

Unlangagedexpressionsunififacilitantletravaildudesignerweb.Celuici permet daccderrapidementen lecture comme en criture aux proprits des composants. Les mthodes de ces composants peuvent galementtreinvoqueslaidedulangagedexpressions. Deux bibliothques de balises spcifiques, tendant le jeu de balises standards JSP. Cellesci sont conues pourfaciliterlintgrationdescomposantsgraphiquesdanslespagesJSP,ainsiquepourpermettreleurliaison aveclescomposantsctserveur. Une API spcifique permettant de disposer dune reprsentation des composants graphiques ct serveur, dassurer la gestion des vnements et la validation des donnes saisies. Cette API offre galement un supportpourlinternationalisationdesapplicationsweb.

ENI Editions - All rigths reserved

- 1-

Principedulangagedvaluationdexpressions
Les spcifications JSP2.0 de la technologie Java Server Pages proposent un langage dvaluation dexpressions.Son principalintrtestdefaciliterletravaildesdesignerswebenleurpermettantdaccdersimplementetrapidement, maisenlectureseulement,auxpropritsdecomposantsJavaBeansdepuisunepageJSP.Cetartificetechnologiquea longtemps suffi pour rpondre au fonctionnement des applications web, dans la mesure o cellesci ne faisaient intervenirquedeschangessimplesentreclientetserveur. Grce une volution des spcifications JSP et lintroduction dun langage dexpressions spcifique JSF, il est aujourdhui possible de dvelopper une application web Java dont linterface prend instantanment en charge les vnementsgnrsparlesactionsdelinternaute. Alors quuneapplicationJSPstandardnesupportequununique cycledeviedetyperequte/rponse,uneapplicationJSFsappuiesuruncycledeviephasesmultiplespermettantla gestionvnementielle,laliaisondecomposantsvisuelsavecdesJavaBeans,ainsiquelamiseenplacedeprocessus automatiquesdeconversionetdevalidationdesdonnessaisies. Lexploitation de ces fonctionnalits est particulirement facilite par lusagedulangagedexpressions propre JSF, unifiaulangagedexpressionsinitialementconupourJSP.Lolelangagenepermettaitauparavantquelaccsen lecture seule des proprits de JavaBeans, il est maintenant possible daccder en lecture comme en criture ces proprits.Enoutre,celangageunifipermetdinvoquerlesmthodesdeJavaBeansetdvaluerlesexpressionsen instantancommeendiffr.

ENI Editions - All rigths reserved

- 1-

LecycledeviephasesmultiplesdunepageJSF
Aprs une prsentation rapide de la notion de cycle de vie phases multiples dune page JSF, cette partie dcrit chacunedesphasesenquestion.Elleapportedesinformationspurementthoriques,quiintresserontnaturellementle lecteursouhaitantcomprendreavecprcisioncommentuneapplicationJSFassurelapriseenchargedelagestiondes vnements ainsi que la conversion et la validation des donnes. Mais lacquisition de ces apports thoriques nest cependantpasindispensablelaralisationdeprojetsbasssurJSF.

1.Principe
Globalement,ilestpossibledeconsidrerlecycledeviedunepageJSFcommesemblableceluidunepageJSP:un clientwebmetunerequteHTTPverslapageenquestion,puisleserveurquilhbergerpondenrenvoyantune pagetraduiteenHTML.Maisenralit,lecycledeviedunepageJSFestpartitionnenplusieursphases,danslebut de pouvoir rpondre efficacement aux attentes lies cette technologie : capture dvnements au niveau des composants graphiques, validation ou conversion de composants, liaison entre composants dinterface et objets sexcutantctserveur. Deuxtypesderequtesdoiventtredistingus:
q

larequteinitialeaucoursdelaquellelinternauteaccdepourlapremirefoislapageJSF, larequteditepostbackcorrespondantleplussouventlavalidationdunformulaireprcdemmentcharg danslenavigateurduclient.

Lorsquelapplicationwebtraiteunerequteinitiale,seuleslesphasesderestitutiondelavueetdetraductiondela rponse sont excutes. Le traitement dune requte postback requiert quant lui le passage par chacune des phases du cycle de vie de la page JSF, sauf en cas derreur, dans le but de raliser toutes les conversions et validationsncessaires.Lapageestensuiterestitueauclient.

2.Prsentationdesdiffrentesphases
a.PhaseRestitutiondelavue(Restoreview)
Ds quun internaute tente datteindre une page JSF, la phase de restitution de vue est excute. Son but est dassocierunevuelapagevisite.Lapplicationwebcreunevueviergedanslecasdunerequteinitialeelle restitue la vue prcdemment associe la page dans le cas dune requte postback. Tous les gestionnaires dvnementsainsiquelesvalidateursrequisparlescomposantsgraphiquesdelapagesontlislavue.Unarbre decomposantsestconstitu.LavueestensuitesauvegardedanslobjetprdfiniFacesContext. Dans le cas dune requte initiale, le droulement du cycle de vie se poursuit par la phase de traduction de la rponse:unappeldelamthoderenderResponsesurlobjetFacesContextprovoquelatraductiondelavue,puissa restitutionauclient. SilaccslapageJSFsefaitparlintermdiairedunerequtepostback,larestitutiondelavuesefaitcomptetenu desinformationsfourniesdanslarequte.Celleciprendgalementenchargelesdonnesventuellementstockes sur le serveur loccasion dune prcdente consultation de la page. JSF assure en effet la conservation des informationsderequtessurleserveur:cemcanismepermet,parexemple,derestituerfacilementuninternaute lesdonnesqueceluiciadjsaisiesdansunformulaire.

b.PhaseApplicationdesparamtresderequte(Applyrequestvalues)
lissuedelaphaseprcdente,unevueestassocielapageJSFvisite.Cettevuedisposeobligatoirementdun arbredecomposants.Cescomposantssontalorsparcourussuccessivementpourinvoquerleurmthodedecode(). Celleciestchargedanalyserlarequtepourattribueraucomposantlavaleurquidoitluitreaffecte. Ilestcourantquecetteaffectationdevaleurncessiteuneconversionpralable:cestlecasnotammentlorsquune zone de texte de formulaire est associe une proprit de composant dont le type est numrique. Si cette conversion choue, un message derreur est automatiquement attribu au composant en question, puis plac en attentedetraitementdanslobjetprdfiniFacesContext.Cemessageestensuiteprisenchargedurantlaphasede traduction de la rponse pour tre prsent linternaute, en mme temps que les ventuels messages de validationproduitslorsdelaphaseProcessusdevalidation(voircidessous).Uncomportementsimilaireseproduitsi laffectationdunevaleuraucomposantestsoumiseunevalidationpralable,parexemplepoursassurerquune valeurnumriquesaisiedansunezonedetexteestbiencompriseentredeuxvaleursV1etV2.

ENI Editions - All rigths reserved

- 1-

Sicertainscomposantsdisposentdunattributimmediatepositionnsurlavaleurtrue,lavalidationetlaconversion ventuellementrequisessontdirectementprisesenchargedanscettephaseducycledevie. En plus de permettre lanalyse de la requte et lattribution de valeurs aux composants, la phase Application des paramtresderequtetransmetlesvnementsgnrsauniveaudescomposantsgraphiquesprsentsdansla pageJSFaucontexteJSF. lafindecettephase,touslescomposantsassocislavuedisposentdunenouvellevaleur.Lesmessagesetles vnementsventuelssontenattentedetraitementparlobjetFacesContext.

c.PhaseProcessusdevalidation(ProcessValidations)
Danscettetape,lapplicationJSFeffectuetouteslesvalidationsattenduespourchacundescomposantsdelarbre associlavue. Pourcela,lesattributsdecomposantdfinissantlesrglesdevalidationsontexamins,puiscomparslavaleur du composant. Lorsque cette valeur est effectivement incorrecte, un message derreur est ajout lobjet FacesContextetlecycledeviesepoursuitdirectementparlaphasedetraductiondelarponse:lapagewebest alorsrestituelinternaute,accompagnedumessagederreurissuduprocessusdevalidation.

d.PhaseMisejourdumodle(UpdateModelValues)
ChaquecomposantdinterfaceJSFpeuttreassociunJavaBeanctserveur.Aprsstreassuredelavalidit des donnes saisies lors de la phase Processus de validation, lapplication JSF parcourt nouveau larbre de composantspouraffecterlavaleurdechaquecomposantgraphiqueauJavaBeanquiluiestassoci.Lencore,siun problmedeconversionsurvientaumomentdelamisejourdelapropritduJavaBean,lecycledeviedelapage se poursuit directement par la phase de traduction de la rponse et un message derreur adapt est prsent linternaute.

e.PhaseAppeldelapplication(Invokeapplication)
Lorsquelinternautevalideunformulaire,oucliquesurunlienhypertexte,lapplicationJSFgnrerespectivementun objetdetype"vnementdeformulaire"ouunobjetdetype"vnementdecommande".Cesobjetssontqualifis dvnements de niveau application : ils sont pris en charge par des gestionnaires spcifiques au cours de cette phasedontlerleestdementionneruneURLverslaquellelanavigationestdirige.

f.PhaseRestitutiondelarponse(Renderresponse)
CettephasecorrespondaumomentolimplmentationJavaServerFacesrendlamainauconteneurenchargedes pagesJSPdelapplicationweb.Touslescomposantssontalorsprsentsdanslinterfaceutilisateur,dansltatqui estleleuraumomentosurvientlaphaseRenderresponse.

- 2-

ENI Editions - All rigths reserved

Deuxtypesdvaluationdexpressions
Lelangagedexpressionsunifiestconupourpermettrelvaluationdesexpressionsdedeuxmaniresdistinctes. Cette valuation peut se produire de manire immdiate, instantane : dans ce cas, son rsultat est renvoy linternautedslaphasederestitutiondelapageJSP. Lvaluationpeutgalementavoirlieudemanirediffre,cestdirequellepeutsurvenirnimportequelmoment du cycle de vie de la page. Ce mode dvaluation savre indispensable dans le cadre de la mise en uvre de la technologieJSF,danslamesureolecycledeviephasesmultiplesdespageswebdoitrendrepossiblelvaluation des expressions au moment le plus opportun (notamment lors de la capture dun vnement, dune demande de validation ou de conversion de la valeur dun composant). La dtermination du meilleur moment pour valuer une expressionrestelachargedelatechnologieimplmentantlelangagedexpressionsunifi.

1.valuationinstantaneduneexpression
Une demande dvaluation instantane dexpressionauseindune page JSP se fait laidedelasyntaxe ${}.Elle peuttreutilisedirectementdansletextebrutdelapage,outrereprsenteentantvaleurdelattributvalue dunebalise.Ilfautalors,danscedeuximecas,quelaTLD(TagLibraryDescription)delabaliseenquestionautorise effectivementlutilisationduneexpressionentantquevaleurdelattributvalue. Le code source cidessous est un exemple dans lequel sont prsents ces deux modes de prise en charge de lvaluationinstantane: <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@taglib uri="http://java.sun.com/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c1"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Test de lvaluation instantane</title> </head> <jsp:useBean id="laPersonne" class="premierProjetJSF.Personne" scope="session"> </jsp:useBean> <body> <c:set var="leNom" value="SENNESAL" scope="session"></c:set> Le nom dclar dans la session est ${sessionScope.leNom}. <br> Contenu de la proprit "nom" du JavaBean "laPersonne": <c1:out value="${laPersonne.nom}"></c1:out> <br> Le mme rsultat sobtient en crivant simplement ${laPersonne.nom}. </body> </html> Dans cet exemple, une premire utilisation de lvaluation instantane dans un texte brut est effectue par linstruction${sessionScope.leNom} : lexpressionvaluerconcernelavariabledesessionleNom,instancieparle biais de une balise<c:set>, dont laccs est rendu possible par lexploitation de lobjetimplicite sessionScope.Une secondeutilisationdelvaluationinstantanedansuntextebrutestprsentelafinducodesourceautraversde linstruction${laPersonne.nom}:cettefois,lexpressionvaluerconcernelapropritnomdunJavaBeaninstancie danslapageparlintermdiairedunebalise<jsp:useBean>. Cetteexpressionestparailleursgalementutiliseentantquevaleurdelattributvaluedunebalise<c1.out>. Quunedemandedvaluationinstantanedexpressionsoitdirectementfaitedansuntextebrut,ouquellelesoitau travers de lattribut value dune balise particulire, elle ne peut concerner que des tentatives daccs en lecture uniquement. Il nest notamment pas possible dutiliser une valuation instantane dexpression pour mettre jour unepropritspcifiquedunJavaBean.

ENI Editions - All rigths reserved

- 1-

2.valuationdiffreduneexpression
Cemodedvaluation,introduitaveclatechnologieJavaServerFaces,peuttreexploitnimportequelmomentdu cycledeviedunepageweb.Uneexpressionvaluationdiffreestsymbolisedanslecodesourcedunepage par la syntaxe #{}. Elle ne peut pas tre utilise directement dans le texte brut dune page web, contrairement lexpressionvaluationimmdiate.Danslexempleciaprs,lattributvaluedunebalise<h:inputText>reprsentant un champ de saisie de type HtmlInputText possde la valeur #{laPersonne.nom} : il sagit dune expression valuation diffre permettant daccder, en lecture comme en criture, la proprit nom dun JavaBean nomm laPersonne. Lutilisationduneexpressionvaluationdiffrepermettoujoursdaccderenlectureetencritureune donneparticulire.

<html><head><title>Test de<html> <head> <title>Test de lvaluation diffre</title> </head> <jsp:useBean id="laPersonne" class="premierProjetJSF.Personne" scope="session"></jsp:useBean> <body> <f:view> <h:form> <h:panelGrid border="0" columns="1"> <h:panelGroup> <h:panelGrid border="0" columns="2"> <h:outputText value="Votre nom:" id="idotxt1"> </h:outputText> <h:inputText id="itxtNom" value="#{laPersonne.nom}"> </h:inputText> </h:panelGrid> </h:panelGroup> <h:commandButton id="btnValider" value="Valider"> </h:commandButton> </h:panelGrid> </h:form> </f:view></body> </html>" Lorsque la page correspondant au code source prcdent est invoque pour la premire fois, lvaluation de lexpression#{laPersonne.nom}sefaitaumomentlaphasederestitutiondelarponse.Unaccsenmodelecture la proprit nom du JavaBean est alors assur : si cette proprit possde effectivement une valeur, celleci est prsentelinternautedanslechampdesaisie. Endehorsdelaccsinitiallapageweb,enparticulierlorsdelasoumissionduformulaire,lexpressionestvalue diffrentsstadesducycledevie,afindepermettrelamisejourdelapropritnomduJavaBeanenfonctiondela saisie ralise par linternaute. Cette opration est en particulier assure lors des processus de validation et de conversiondelinformation. Dans lexemple propos, lvaluation diffre dexpression est utilise pour accder aux proprits dun objet particulier. Mais lvaluation diffre peut galement sappliquer une expression permettant dinvoquer une mthodeparticuliredunobjet.Cesdeuxnotionssontabordesplusprcismentdanslesparagraphesquisuivent.

- 2-

ENI Editions - All rigths reserved

Utilisationdexpressionspouraccderauxpropritsdunobjet
Avantdevoircommentaccderauxpropritsdunobjet,ilpeuttreintressantdesattardersurlesdiffrentstypes dobjetsexploitablesetdecomprendrelemcanismepermettantuneapplicationwebdetrouvercesobjets. Les objets utilisables dans les expressions (que leurs valuations soient immdiates ou diffres) sont de quatre types:ilspeuventtredesJavaBeans,descollections,desnumrations,oulundesobjetsimplicitesdfinisparla spcification.Dfiniruneexpressionfaisantappelunobjetparticulierrevientmentionnerlidentifiantdelobjeten question, tel quil a t dclar dune manire ou dune autre auprs de lapplication web. Ainsi, les expressions ${laPersonne} et #{laPersonne} sont deux expressions valables pour accder un objet dont lidentifiant est laPersonne. Cet objet a par exemple pu tre pralablement instanci en tant que JavaBean grce une balise <jsp:useBean>situedansunepageJSP,oudclarentantquebeanmanagdelapplicationweb,parlintermdiaire deslignessuivantesdfiniesdanslefichierdeconfigurationdelapplication(engnralnommfacesconfig.xml). <managed-bean> <managed-bean-name> laPersonne</managed-bean-name> <managed-bean-class> premierProjetJSF.Personne </managed-bean-class> <managed-bean-scope> Session </managed-bean-scope> </managed-bean> Concrtement, lvaluation dune expression comportant uniquement lidentifiant dun objet est assure par lapplication web au travers de linvocation de la mthode findAttribute sur lobjet reprsentant le contexte dapplication luimme.Lidentifiant de lobjet est pass en paramtre de cette mthode. Celleci se charge alors de rechercher successivement lobjet en question dans les diffrentes portes : page, request, session et enfin application.Silobjetesttrouv,savaleurestconvertieenchanedecaractres,puisrenvoyelinternaute.Dansle casolobjetnexistepas,lavaleurnullestrenvoye. Commecelaadjtvoqudanslesexemplespropossprcdemment,laccsauxpropritsdunJavaBeanse fait par lintermdiaire de loprateur point ("."). Il est galement possible de faire appel la notation par crochets ("[]") pour obtenir le mme rsultat. Bien sr, pour faire cho la remarque faite plus haut propos des types dobjets exploitables, ces notations peuvent galement servir obtenir une instance particulire dunenumration, ouunlmentspcifiquedunecollection.Ainsi,lesdeuxexpressionsquisuiventsontquivalentes:ellespermettent toutesdeuxdatteindrelapropritnomdunJavaBeandontlidentifiantestlaPersonne: ${laPersonne.nom} ${laPersonne["nom"]} Lorsquunepropritparticulirecorrespondellemmeuneinstancedeclasse,ilestgalementpossibledatteindre les proprits de cette instance. Lexemple suivant illustre deux moyens dafficher le nom de la ville du lieu de rsidence dune personne : lobjet laPersonne dispose dune proprit adresse, issue dune classe personnalise possdantunepropritville. ${laPersonne.adresse["ville"]} ${laPersonne.adresse.ville} DanslecasdelutilisationdexpressionsentantquevaleurdelattributvalueduncomposantJSF,ilestpossiblede combiner de multiples expressions, en les associant ventuellement avec du texte brut, comme le montre lexemple suivant: <h:outputText value="#{laPersonne.nom} (#{laPersonne.age} ans)" id="idotxt2"> </h:outputText>

ENI Editions - All rigths reserved

- 1-

Utilisationdexpressionspouraccderauxmthodesdunobjet
Linvocation de mthodes grce au langage dexpressions est rendu possible avec la technologie Java Server Faces. CesexpressionsdoiventtreutilisesquentantquevaleursdattributsdebalisesreprsentantdescomposantsJSF spcifiques. Lexcution des mthodes concernes engendre un traitement particulier agissant sur le composant lui mme : il sagit gnralement dassurer la gestion vnementielle (slection dun lment dans une zone de liste droulante,clicsurunbouton,etc.)oudengagerunprocessusdevalidationdelinformationsaisiedanslecomposant. <f:view> <h:form> <h:inputText id="txtCommentaire" validator="#{beanAttributValidator.checkName}" label="Commentaire" required="true" requiredMessage="Saisie obligatoire!"> </h:inputText> <h:commandButton id="btnValidation" value="Valider" actionListener="#{beanAction.traitementClic}"> </h:commandButton> </h:form> </f:view> Lecodesourcecidessusmontrequunebalise<h:inputText>,reprsentantunchampdesaisiedetypezonedetexte, possde un attribut validator. La valeur de celuici correspond une expression de mthode, dont linterprtation provoquelappeldelamthodecheckNamedunbeanmanagnommbeanAttributValidator.Cettemthodepeutpar exempletrechargedevrifierquelinformationsaisiedanslazonedetextecontientaumoinsuneoccurrencedela lettreF. Demme,lecodesourceprsenteunebalise<h:commandButton>.Celleciestrestituegraphiquementsouslaforme dunboutondesoumissiondeformulaire.ElledisposedunattributactionListener,dontlavaleurcorrespondune expression de mthode. La mthode en question se nomme traitementClic et est dfinie dans une classe dont le bean manag beanAction est une instance. Le rle de la mthode est dassurer la gestion des clics raliss par lutilisateursurleboutondesoumission. Lvaluationdesexpressionsdemthodesindiquesalieudemanirediffre:celadoitsystmatiquement trelecas,danslamesureolestraitementsdemandspeuventtreassursdiffrentestapesducycle deviedelapageJSP.Parexemple,lamthodementionnedanslattributvalidatordelabalise<h:inputText>est appele durant la phase Process Validation, alors que la mthodetraitementClicestinvoquependantlaphase InvokeApplication. Dans lexemple propos, les beans manags voqus peuvent tre dun type quelconque. Par contre, les mthodes mentionnesdanslesexpressionsdoiventseconformerauxcontraintesindiquesdanslaTLD(TagLibraryDescription). En loccurrence, la signature de la mthode utilise comme valeur de lattribut actionListener dune balise <h:commandButton> doit obligatoirement possder un argument de typeActionEvents. De mme, une expression de mthodeutilisecommevaleurdelattributvalidatordunebalise<h:inputText>doitimprativementfairerfrence une mthode possdant trois arguments : le premier de type FacesContext, le second de type UIComponent et le troisimedetypeObject. Dune manire gnrale, la signature dune mthode utilise dans une expression de mthode dpend donc de lattributdebalisedanslequelelleestplace.Lensembledescontraintesrespecterpeuttreretrouvsurleweb, dans les pages de documentation concernant les TLD (par exemple, ladresse http://java.sun.com/javaee/javaserverfaces/1.2/docs/tlddocs/index.html).

ENI Editions - All rigths reserved

- 1-

Expressionsavecoprateurs
LesexpressionsdontlvaluationestdemandeauseindespagesJSPduneapplicationwebpeuventfaireusagede diffrentsoprateurs,afindefaciliterlobtentiondersultatsadaptsauxattentesdesinternautes.Parmilestypes doprateursutilisables,onretrouveleshabituelsoprateursarithmtiques,logiquesetrelationnels.Cesoprateurs peuventtreindiffremmentutilissdansdesexpressionsfaisantappeldesconstantes,desvaleursdeproprits dobjets,oudesrsultatsissusdelexcutiondemthodesdeclasses.Lalistesuivantereprsentelesoprateursles pluscourammentutiliss,rpartisparcatgorie: Oprateursarithmtiques:+,-,*,/,%,modetdiv. Oprateurslogiques:and,&&,or,||,not,! Oprateursrelationnels:==,eq,!=,ne,<,lt,>,gt,<=,ge,>=,le. Ilexisteenoutreunoprateurparticuliernotempty,permettantdesavoirsilavaleurdunepropritoulersultat dunemthodeestnull. VoiciunexempledepageJSP,illustrantlexploitationdecesdiffrentsoprateursdansdesexpressions: <html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Test des oprateurs dans les expressions</title> </head> <jsp:useBean id="laPersonne1" class="premierProjetJSF.Personne" scope="session"></jsp:useBean> <jsp:useBean id="laPersonne2" class="premierProjetJSF.Personne" scope="session"></jsp:useBean> <body> La personne n1 est-elle un client de la boutique ayant command dans le mois en cours? ${laPersonne1.clientBoutique and laPersonne1.achatMoisCourant} <br> La personne n2 a-t-elle le mme ge que la personne n1? ${laPersonne1.age == laPersonne2.age} <br> La personne n2 habite-t-elle dans la mme ville que la personne n1? ${laPersonne1.adresse.ville ne laPersonne2.adresse.ville} <br> La personne n2 dispose-t-elle dune adresse email ? ${!empty laPersonne2.email} </body> </html>

ENI Editions - All rigths reserved

- 1-

PrincipauxlmentsdelabibliothqueHTML
Aprs une prsentation des principaux attributs communs lensemble des balises de la bibliothque HTML, ce paragraphe passe en revue les principales balises reprsentant les composants graphiques Java Server Faces, et mentionnelenometlerledeleursattributsspcifiqueslesplusimportants.

1.PrincipauxattributscommunsauxbalisesdelabibliothqueHTML
Attributbinding Sert indiquer une expression permettant de lier le composant reprsent par la balise avec une proprit de JavaBean. Attributid Permetdindiquerlidentifiantassociaucomposantreprsentparlabalise.

2.Prsentationdesbalisesetdeleursprincipauxattributsspcifiques
a.Balisecolumn
CettebaliserestitueunecolonneparticulireduncomposantdetypeUIData.Sesprincipauxattributssont: footerClass Contientunelistedeclassesdestylesappliquesaupieddecolonne.Lesnomsdeclassesdestylessontspars lesunsdesautresparlecaractreespace. headerClass Contient une liste de classes de styles appliques lentte de colonne. Les noms de classes de styles sont sparslesunsdesautresparlecaractreespace.

b.BalisecommandButton
Cettebalisesertreprsenterunboutondesoumissiondeformulaireouunboutonderinitialisationdeschamps dunformulaire.Voicisesprincipauxattributsspcifiques: action Permet de dfinir le cas de navigation utilis lorsque linternaute clique sur le composant. Sil est ncessaire dobtenirunegnrationdynamiqueducasdenavigation,lavaleurdelattributactiondoitrfrencerunemthode capablederenvoyerunobjet:linvocationdelamthodetoString()decetobjetdoitalorscorrespondrelundes casdenavigationprvusdanslapplicationweb. actionListener Permetdementionnerunemthodedexpressionidentifiantungestionnairedvnementscapabledeprendreen charge le clic sur le composant. Ce gestionnaire dvnements est obligatoirement une mthode de type void acceptantenargumentunobjetdetypeActionEvent. value Sert indiquer le texte affich sur le composant. La valeur utilise pour cet attribut peut correspondre une expressionpointantsurunepropritdebeanmanag. disabled Lavaleurdecetattributestunboolenindiquantsilecomposantpeut,ounon,treutilisparlinternaute.Dansle casolecomposantnestpasutilisable,ilestgraphiquementreprsentparunboutongris.
ENI Editions - All rigths reserved - 1-

type Sertprciserletypeducomposant.Lesvaleurspossiblessontsubmit,pourreprsenterunboutondesoumission de formulaire, et reset,pourobtenirunboutondeffacement des champs de formulaire. La valeur par dfaut est submit.

c.Baliseform
CettebaliserestitueunebaliseHTMLcorrespondantunformulairedesaisie.Elleacceptelesprincipauxarguments suivants: styleClass Listedesclassesdestylesappliqueslorsquececomposantestrestitugraphiquementdanslinterfaceweb.Les nomsdesclassesdestylessontsparslesunsdesautresparlecaractreespace. target Indiquelaframedanslaquellelersultatdelasoumissionduformulaireseraaffich.

d.BaliseinputHidden
Cettebalisepermetdereprsenterunchampdeformulairecach.Parmicesattributs,lesplusremarquablessont lessuivants: converter Cetattributsertassocierunconvertisseurspcifiqueaucomposant.Leconvertisseurenquestiondoittredfini dans le fichier de configuration des ressources de lapplication web, ou correspondre lun des convertisseurs standards. converterMessage Lavaleurdecetattributcorrespondunmessageprsenterlutilisateurencasdchecdelaconversion.Ce messagevientsurchargerceluiquiestventuellementdfiniparleconvertisseurassociaucomposant. required Cetattributestunflagpermettantdeprcisersilecomposantdoit,ounon,possderunevaleuraumomentdela soumissionduformulaire. requiredMessage Cetattributpermetdindiquerlemessageprsenterlinternautelorsquelecomposant,dontlattributrequired estpositionnsurtrue,nepossdepasdevaleuraumomentdelasoumissionduformulaire. validator Cetattributsertassocierunvalidateurspcifiqueaucomposant.Levalidateurenquestiondoittredfinidansle fichierdeconfigurationdesressourcesdelapplicationweb,oucorrespondrelundesvalidateursstandards. validatorMessage La valeur de cet attribut correspond un message prsenter lutilisateur en cas dchec de la validation. Ce messagevientsurchargerceluiquiestventuellementdfiniparlevalidateurassociaucomposant. value Cetattributpermetdespcifierlavaleurducomposant. valueChangeListener Lavaleurdecetattributdoitcontenirunemthodedexpressionrfrenantungestionnairedvnementcapable

- 2-

ENI Editions - All rigths reserved

de prendre en charge les changements de valeurs raliss dans le composant. Le gestionnaire dvnementdoit obligatoirementtreunemthodedetypevoidetaccepterunargumentdetypeValueChangeEvent.

e.BaliseinputSecret
Cette balise est utilise pour restituer une zone de texte de type mot de passe. Outre ses attributs converter, converterMessage, required, requiredMessage, validator, validatorMessage, value, valueChangeListener, dont le rleestidentiqueceluiquilsjouentdanslecadredelabalise inputHidden,labaliseinputSecretpeutexploiter lesattributssuivants: disabled Cetattributaccepteunevaleurboolennechargedindiquersilecomposantestutilisableounonparlinternaute. maxlength Lavaleurdecetattributcorrespondaunombremaximumdecaractrespouvanttresaisisdanscecomposant. redisplay Cetattributestutilispourindiquerquelemotdepasseventuellementprcdemmentsaisidanslecomposant doittreraffichchaquenouvelleprsentationduformulaire.Pourdesraisonsvidentesdescurit,lavaleur pardfautdecetattributestfalse.

f.BaliseinputText
Cette balise reprsente un champ de saisie de type texte. Ses attributs sont identiques ceux de la balise inputSecret.

g.BaliseinputTextArea
Cettebalisereprsenteunezonedetextemultilignes,etdisposedesattributscitsprcdemmentconcernantla baliseinputHidden.Elleprsenteenoutrelesdeuxattributssuivants: cols Cetattributaccepteunevaleurnumriquecorrespondantaunombredecolonnescaractrisantlecomposant. rows Cetattributaccepteunevaleurnumriquecorrespondantaunombredelignescaractrisantlecomposant.

h.Balisemessage
Cette balise reprsente un message individuel, obligatoirement associ un composant graphique situ dans la page web. Elle permet notamment de prsenter les raisons qui ont provoqu une erreur de conversion ou de validationdelavaleursaisiedanslecomposantassoci.Lesattributsdecettebaliselespluscourammentutiliss sont: for CetattributsertprciserlidentifiantducomposantJSFconcernparlesmessages. errorClass,fatalClass,infoClass,warnclass CesquatreattributssontutilisspourdsignerlesclassesdestyleCSSappliquerpourdesmessagesdeniveau desvrit"ERROR","FATAL","INFO"et"WARN".

i.Balisemessages
Labalise messagesestutilisepourlaffichagedesmessagesderreurdeconversionoudevalidationdelavaleur saisie dans lun des composants JSF prsent sur la page web. La plupart des attributs de cette balise sont les

ENI Editions - All rigths reserved

- 3-

mmesqueceuxdelabalisemessage,lexceptiondelattributfor,nondisponiblepourlabalisemessagesdansla mesureocellecineconcernepasuncomposantJSFparticulier.

j.BaliseoutputLink
CettebalisesertrestitueruneancreHTML.Sonattributleplusimportantestvalue:ilpermetdedfinirlavaleur delattributhrefdelancre.Lesprincipauxautresattributssont: converter CetattributestutilispouraffecteruneinstancedelaclasseConverteraucomposant. disabled Lutilisationdecetattributestncessairepourindiquerquelecomposantnedoitjamaistreenmesurederecevoir lefocus,outreprisencompteaumomentdelasoumissionduformulaire. target CommecestlecaspourlabaliseHTMLreprsentantuneancre,cetattributtargetpermetdespcifierlenomdela framedanslaquelleledocumentciblparlecomposantdevrasafficher.

k.BaliseoutputText
Cettebalisesertreprsenteruntextebrutauseindunepageweb.DanslecasolundesattributsstyleClass, style,diroulangestutilis,letextebrutenquestionestrestitudanslapageentantencadrpardesbalises <span>et</span>. converter Cetattributestutilispourassocierunconvertisseuraucomposant. value Permetdespcifierlachanecorrespondantautextebrutprsenterdanslapage.

l.BalisepanelGrid
Cette balise est charge de restituer un tableau HTML compos dun certain nombre de colonnes. Le nombre de lignesestdtermindynamiquementcomptetenudunombredecomposantspositionnerdansletableau.Dans lexemplesuivant,labalisepanelGridrassemblequatrecomposants,reprsentspardesbalisesoutputText. <h:panelGrid border="1" columns="2" bgcolor="red" width="30%"> <h:outputText value="item1"></h:outputText> <h:outputText value="item2"></h:outputText> <h:outputText value="item3"></h:outputText> <h:outputText value="item4"></h:outputText> </h:panelGrid> LarestitutioncorrespondanteestuntableauHTMLdedeuxlignesetdeuxcolonnes. <table bgcolor="red" border="1" width="30%"><tbody> <tr><td>item1</td><td>item2</td></tr> <tr><td>item3</td><td>item4</td></tr> </tbody></table> Voicilesprincipauxattributsdisponiblespourcettebalise: bgcolor Cetattributsertindiquerlacouleurdefonddutableau. border

- 4-

ENI Editions - All rigths reserved

Lavaleurdecetattributindiquelpaisseurdesborduresdutableau. width Cetattributpermetdespcifier,commeenHTML,lalargeurdutableau. footerClass,headerClass Cesattributsserventmentionnerlalistedesclassesdestylesapplicablesauxenttesetpiedsdecolonnes.

m.BaliseselectBooleanCheckbox
Cette balise permet de restituer un champ de saisie de type case cocher. Elle dispose des attributsconverter, converterMessage, required, requiredMessage, validator, validatorMessage, value, valueChangeListener, dj voquspourlabaliseinputHidden.

n.BaliseselectManyCheckbox
Ce composant permet de restituer un tableau HTML contenant un ensemble de cases cocher. Chaque case cocherindividuellepeuttrereprsenteparlebiaisdunebalise<f:selectItem>,issuedelabibliothqueCore. Sidenombreusescasescocherdoiventtreprsentes,ilestalorsprfrabledutiliseruneuniquebalise <f:selectItems>, plutt quun ensemble de balises <f:selectItem>. La prsentation de la balise selectManyListBox,situeplusloindansceparagraphe,montreunusagepossibledelabalise<f:selectItems>.

<h:selectManyCheckbox border="1" id="mesChoix"> <f:selectItem itemLabel="choix n1" itemValue="1"/> <f:selectItem itemLabel="choix n2" itemValue="2"/> <f:selectItem itemLabel="choix n3" itemValue="3"/> </h:selectManyCheckbox> LarestitutiondansunepageHTMLpeutcorrespondreaucodesourcesuivant: <table border="1" id="j_id_jsp_1719144863_7:mesChoix"> <tr> <td> <input name="j_id_jsp_1719144863_7:mesChoix" id="j_id_jsp_1719144863_7:mesChoix:0" value="1" type="checkbox" /> <label for="j_id_jsp_1719144863_7:mesChoix:0">choix n&deg;1</label> </td> <td> <input name="j_id_jsp_1719144863_7:mesChoix" id="j_id_jsp_1719144863_7:mesChoix:1" value="2" type="checkbox" /> <label for="j_id_jsp_1719144863_7:mesChoix:1"> choix n&deg;2</label> </td> <td> <input name="j_id_jsp_1719144863_7:mesChoix" id="j_id_jsp_1719144863_7:mesChoix:2" value="3" type="checkbox" /> <label for="j_id_jsp_1719144863_7:mesChoix:2">choix n&deg;3</label> </td> </tr> </table> Les attributs de la balise selectManyCheckbox sont identiques ceux de la balise selectBooleanCheckbox. Il est nanmoinspossibledindiquer,grceunattributlayout,lesensdaffichagedescasescocher:silavaleurde cetattributestgalepageDirection,alorslescasesserontprsentesencolonne.Silattributenquestionnest

ENI Editions - All rigths reserved

- 5-

pasmentionn,ousisavaleurestlineDirection,alorslescasescochersontaffichessuruneligneunique.

o.BaliseselectOneListbox
Cettebalisesertreprsenterunezonedelistenondroulantechoixunique,correspondantlabaliseHTML <select>. Chacun des lments slectionnables est identifi par une balise <f:selectItem>, dont les attributs permettent de spcifier la valeur et le label de llment en question. Il est aussi possible de restituer tous les lmentsautraversduneuniquebalise<f:selectItems>. LesprincipauxattributsdelabaliseselectOneListboxsontlesmmesqueceuxdelabaliseselectBooleanCheckbox. Unattributsizepermettoutefoisdedfinirlenombredlmentsvisiblesdanslazonedeliste. <h:selectOneListbox id="mesChoix" > <f:selectItem itemValue="1" itemLabel="choix n1"/> <f:selectItem itemValue="2" itemLabel="choix n2"/> <f:selectItem itemValue="3" itemLabel="choix n3"/> </h:selectOneListbox>

p.BaliseselectManyListbox
Cettebalisepermetdegnrerunezonedelistenondroulantechoixmultiples.Elleestdoncrestitueparune balise HTML <select> disposant dun attribut multiple. Comme cest le cas pour la balise selectOneListbox, les lmentsslectionnablespeuventtrereprsentssoitparplusieursbalises<f:selectItem>,soitparuneunique <f:selectItems>. <h:selectManyListbox size="12"> <f:selectItems value="#{mesPrix}"/> </h:selectManyListbox> Dans lexemple cidessus, les lments de la zone de liste sont dfinis par une balise <f:selectItems>, dont lattribut value rfrence un bean manag nomm mesPrix. Ce bean peut, par exemple, tre issu dune classe drivede ArrayList et contenir la totalit des lments slectionnables, qui sont en ralit des instances de la classejavax.faces.model.SelectItem. package premierProjetJSF; import java.util.ArrayList; import javax.faces.model.SelectItem; public class Prix extends ArrayList { public Prix() { SelectItem element; for (int i=1;i<=100;i++) { element=new SelectItem( new Integer(i), i+".00 euros", "Produit "+i+".00 euros"); add(element); } } } Endehors,notamment,delattributsizequipermetdindiquerlenombredlmentsvisiblesdanslazonedeliste, les principaux attributs de la balise selectManyListbox sont les mmes que ceux de la balise selectBooleanCheckbox.

q.BaliseselectOneMenu
Cette balise sutilise pour restituer une zone de liste droulante choix unique. Elle ne dispose daucun attribut permettant de prciser le nombre dlments visibles : celuici est automatiquement fix 1 au moment de la restitution.DemanireidentiquecequiatprcispourlesbalisesselectOneListBoxetselectManyListBox,les lments de la zone de liste droulante choix unique peuvent tre reprsents par un groupe de balises

- 6-

ENI Editions - All rigths reserved

<f:selectItem>ouparuneuniquebalise<f:selectItems>. LesprincipauxattributsdelabaliseselectOneMenusontlesmmesqueceuxdelabaliseselectBooleanCheckbox.

r.BaliseselectManyMenu
Tout comme la balise selectManyListBox, la balise selectManyMenu permet de restituer une zone de liste non droulante choix multiples. Elle dispose cependant de la particularit de ne permettre la visualisation que dun seullmentlafois.LabaliseHTMLrestitueestdonc <select>,avecunattribut multiple, ainsi quunattribut sizedevaleurgale1.

s.BaliseselectOneRadio
Cettebalisepermetdereprsenterungroupedeboutonsradio.Leschoixpossiblespeuventtredfinislaide dunensembledebalises<f:selectItem>ouparlintermdiaireduneuniquebalise<f:selectIems>. LesprincipauxattributsdelabaliseselectOneRadiosontlesmmesqueceuxdelabaliseselectBooleanCheckbox.Il existetoutefoisunattribut layout permettant dindiquer le sens de laffichage des boutons radio (en ligne ou en colonne). <h:selectOneRadio id="choix5"> <f:selectItem itemValue="1" itemLabel="choix n1"/> <f:selectItem itemValue="2" itemLabel="choix n2"/> <f:selectItem itemValue="3" itemLabel="choix n3"/> </h:selectOneRadio>

ENI Editions - All rigths reserved

- 7-

PrincipauxlmentsdelabibliothqueCore
CeparagrapheprsentelesprincipalesbalisescontenuesdanslabibliothqueCore,ainsiqueleursattributslesplus caractristiques.

1.BaliseactionListener
Cettebalisesertaffecteruneinstancedune classe implmentantActionListeneruncomposantJSFparticulier, dans le but de grer les vnements de type ActionEvent survenant sur le composant en question. Lexemple suivantillustrelutilisationdunebaliseactionListenerassocieunebalisecommandButton. <h:commandButton id="btnEnregistrer" value="Enregistrer" > <f:actionListenertype="premierProjetJSF.listeners.BeanActionListener"/> </h:commandButton> LattributtypepermetdementionnerlenomcompletdelaclassechargedegrerlActionEvent.Cetteclassedoit obligatoirementimplmenterlinterfacejavax.faces.event.ActionListener.

2.BaliseconvertDateTime
La balise convertDateTime est utilise pour affecter un convertisseur de type DateTimeConverter un composant particulier.Celapeutpermettre,parexemple,desassurerquelavaleursaisiedansunchampcorrespondbienune datespcifiedansunformatdonn.LexemplesuivantmontrelassociationdunebaliseconvertDateTimeavecune baliseinputText. <h:inputText id="itxtDateDuJour" > <f:convertDateTime pattern="dd/MM/yyyy" /> </h:inputText>

a.AttributdateStyle
Cet attribut permet de spcifier comment la date doit tre formate. Les valeurs autorises sontdefault, short, medium,long,etfull.Cetattributnestprisencomptequesilattributtypeestpositionnsurdateouboth.

b.Attributpattern
Lattributpatternestemploypourmentionnerunformatdedatepersonnalis.Ceformatdoitrespecterlasyntaxe mentionnedanslaclassejava.text.SimpleDateFormat.

c.AttributtimeStyle
Cet attribut sert prciser comment lheure doit tre formate. Cet attribut nest pris en compte que si lattribut typevauttimeouboth.LesvaleursautorisespourlattributtimeStylesontdefault,short,medium,long,etfull.

d.Attributtype
Permetdeprciserletypedeconversion:dateuniquement,heureuniquement,oulesdeux.Lesvaleursquepeut prendrecetattributsontdate,timeouboth.

3.BaliseconvertNumber
Cette balise permet dassocier un convertisseur de type NumberConverter un composant JSF particulier, pour assurer un formatage correct des nombres, pourcentages et devises. Le code source suivant montre lassociation dunebaliseconvertNumberavecunebaliseinputText.

ENI Editions - All rigths reserved

- 1-

<h:inputText id="itxtValeurNumerique" converterMessage="Format non respect"> <f:convertNumber pattern="0.00%"/> </h:inputText> Lesprincipauxattributsdecettebalisesontlessuivants:

a.Attributpattern
CetattributpermetdepersonnaliserleformatutiliserpourconvertirlavaleurducomposantJSF.

b.Attributtype
Cet attribut sert indiquer le type de la valeur du composant. Les valeurs autorises sont number, currency et percentage.

4.Baliseconverter
LabaliseconverterestutilisepourassocierunconvertisseuruncomposantJSFparticulier. <h:inputText id="txtSaisie"> <f:converter converterId="monConvertisseurNombrePairPositif"/> </h:inputText> LeprincipalattributdecettebaliseestconverterId.Celuicirfrenceunconvertisseurpersonnalisdclardansle fichier de configuration des ressources de lapplication web. Ce convertisseur est obligatoirement issu duneclasse implmentantlinterfacejavax.faces.conver.Converter.

5.BaliseloadBundle
CettebalisepermetdinstancierunResourceBundleparticulierauseindunepagewebdonne. <f:view> <f:loadBundle basename="premierProjetJSF.messages" var="mesMessagesPerso"/> ... </f:view> Cettebalisenepossdequelesdeuxattributssuivants:

a.AttributbaseName
CetattributsertprciserlenomdelafamilleduResourceBundleinstancier.

b.Attributvar
IlestutilispourattribuerunidentifiantspcifiqueauResourceBundlecr,demanirelerendreutilisabledansla pageJSP.

6.BaliseselectItem
CettebalisepermetdassocieruneinstancedelaclasseUISelectItemuncomposantJSFparticulier. Comme cela a t expliqu prcdemment dans la section Principaux lments de la bibliothque HTML de ce chapitre, cette balise peut notamment tre associe aux balises selectManyCheckbox, selectManyListbox,

- 2-

ENI Editions - All rigths reserved

selectManyMenu, selectOneListbox et selectOneRadio. De telles utilisations servent dfinir les lments slectionnablesdezonesdeliste(droulantesounon),decasescocher,deboutonsradios.

a.AttributitemDisabled
Cet attribut permet dindiquer si llment slectionnable, reprsent par la balise selectItem, peut ou non tre utilisableparlinternaute.

b.AttributitemLabel
Lavaleurdecetattributcorrespondaulabelprsentlutilisateurdanslinterfaceweb.

c.AttributitemValue
La valeur de cet attribut correspond la valeur renvoye au serveur si llment en question est slectionn au momentdelasoumissionduformulaire.

7.BaliseselectItems
CettebalisepermetdassocieruneinstancedelaclasseUISelectItemsuncomposantJSFparticulier.Ellepeutdonc notammentservirdfinirlensembledeslmentsslectionnablesdunezonedeliste(droulanteounon),cases cocherouboutonsradio.UnexempledutilisationdecettebaliseestprsentlasectionPrincipauxlmentsdela bibliothqueHTMLdecechapitre,danslarubriquerelativelabaliseselectManyListbox. Lattribut le plus important de cette balise est value : il est utilis pour identifier une List ou uneArrayList dans laquelleestregroupelatotalitdeslmentsslectionnablesducomposantJSFassoci.

8.BalisevalidateDoubleRange
CettebalisepermetdassocieruneinstancedelaclasseDoubleRangeValidatoruncomposantJSFparticulier.Cette actionestdestinecontrlerlavaleurdececomposant,quipeutnotammenttreunnombredcimal.Lexemple suivantcorrespondlassociationdelabalisevalidateDoubleRangeavecunebaliseinputText. <h:inputText id="txtDuree"> <f:validateDoubleRange minimum="10" maximum="100"> </f:validateDoubleRange> </h:inputText> Les deux principaux attributs de cette balise sont minimum etmaximum. Ils permettent de dfinir respectivement les valeursminimalesetmaximalesautorisespourlecomposantJSFassoci.

9.BalisevalidateLength
CettebalisepermetdassocieruneinstancedelaclasseLengthValidatoruncomposantJSFparticulier,danslebut decontrlerlalongueurdelachanedecaractressaisiedanslecomposantenquestion. <h:inputText id="txtCommentaire" label="Commentaire impratif" required="true"> <f:validateLengthminimum="5" maximum="10"> </f:validateLength> </h:inputText> Les deux principaux attributs de cette balise sont minimum etmaximum. Ils permettent de dfinir respectivement les longueursdechaneminimaleetmaximaleautorisespourlecomposantJSFassoci.

ENI Editions - All rigths reserved

- 3-

10.BalisevalidateLongRange
CettebalisejoueunrlesimilaireceluidelabalisevalidateDoubleRange:associeuncomposantJSFparticulier, elle sert dfinir un validateur charg de contrler la valeur du composant. Ce validateur est de type LongRangeValidator:siceluiciestcapabledassurerlecontrledesvaleursnumriquesentires,ilnepeutenaucun casprendreenchargeletraitementdevaleursnumriquesdcimales,contrairementauDoubleRangeValidator. Les deux principaux attributs de la balise validateLongRange sont minimum et maximum. Ils permettent de dfinir respectivementlesvaleursminimalesetmaximalesautorisespourlecomposantJSFassoci.

11.Balisevalidator
CettebalisepermetdassocierunvalidateurpersonnalisuncomposantJSFspcifique.Danslexemplesuivant,la balisevalidatorestassocieunebaliseinputSecret:levalidateurpersonnalispeutparexempletrechargde vrifierlaconformitdunmotdepassecomptetenuduncertainnombredecontraintes. <h:inputSecret value="#{loginBean.password}" id="champMotPasse"> <f:validator validatorId="monValidateurDeMotDePasse" /> </h:inputSecret> LeprincipalattributdecettebaliseestvalidatorId.Celuiciidentifielevalidateurpersonnalis,telquilatdfini danslefichierdeconfigurationdesressourcesdelapplicationweb.Cevalidateurdoitobligatoirementtreissudune classeimplmentantlinterfacejavax.faces.validator.Validator.

12.BalisevalueChangeListener
CettebalisesertassocieruneinstancedeclasseimplmentantlinterfaceValueChangeListeneruncomposantJSF particulier, dans le but de capturer les vnements de typeValueChangeEvent gnrs par ce composant. Le code suivantmontrecommentunebalisevalueChangeListenerpeuttreassocieunebaliseinputTextarea. <h:inputTextarea id="itaCommentaires"> <f:valueChangeListener type="premierProjetJSF.listeners.BeanValueChange Listener"/> </h:inputTextarea> Le principal attribut de cette balise est type : il sert indiquer le nom complet de la classe reprsentant le ValueChangeListener.

13.Baliseview
CettebalisetientlieudeconteneurpourlensembledesbalisesissuesdesbibliothquesHTMLetCore. Elleprsentedeuxattributsprincipaux:beforePhaseetafterPhase. LattributbeforePhasepermetdespcifierunemthodedontlinvocationseproduitsystmatiquementavantchaque changementdephase(hormislaphasederestaurationdelavue).Lamthodeenquestiondoitobligatoirementtre detypevoidetaccepterunargumentdetypejavax.faces.event.PhaseEvent. LattributafterPhasepermetquantluidementionnerunemthodedestinetreexcutelissue de chaque changementdephase(hormislaphasederestaurationdelavue).Cettemthodedoitncessairementprsenterles mmescaractristiquesquecellevoquedanslecasdelattributbeforePhase.

- 4-

ENI Editions - All rigths reserved

DiagrammedeclassesrelatifauxcomposantsstandardsJSF
VoicilesprincipalesclassesissuesdeUIComponentBase.

IlexistegalementdenombreuxcomposantsJSFinstancispartirdeclassesdrivesdeUIOutput.Lesclassesen questionsontreprsentesdanslediagrammesuivant:

ENI Editions - All rigths reserved

- 1-

Introduction
Ce chapitre prsente les aspects thoriques mis en uvre dans la technologie Java Server Faces. partir dun exemplesimple,servantdillustration pour lensembleduchapitre,lestapesdecrationdunepagewebexploitant des composants JSF seront abordes. Aprs une prsentation des multiples composants graphiques mis la disposition du dveloppeur, les processus de validation et de conversion des donnes saisies sont expliqus. Les principesgnrauxmisen uvredanslaliaisondecomposantsdesJavaBeanssontgalementvus,ainsiqueltude dumodledenavigationexploitparJSF.Enfin,cechapitresetermineparuneprsentationdesdiffrentesphases constituantlecycledeviedunepage.

ENI Editions - All rigths reserved

- 1-

DescriptiondelapplicationJSFdvelopper
Lebutdeceparagrapheestdeprsenterlapplicationwebquiserviradillustrationauxdiffrentspointsabordsdans cechapitre.Autraversdunexemplesimplesurleplanconceptuel,ilserapossibledetraiterlesaspectsessentielsde la technologie Java Server Faces, afin den avoir rapidement une vue assez claire. Pour le moment, le travail dans lenvironnementdedveloppementEclipsenestpasabord:celaferalobjetdeschapitressuivantsdecetouvrage. Laccent est plutt mis ici sur les concepts JSF, qui peuvent naturellement tre appliqus dautres outils, tels que NetBeansetJavaSunStudioCreator. LapplicationwebdvelopperdanscechapitreestconstituedetroispagesJSP.Lapremiredentreelles,laplus importante, propose un formulaire destin permettre la saisie dinformations lies lidentit dune personne. La figureprsentecidessousenestuneillustration.Lesdeuxautrespagesdelapplicationweb,dontlescodessource ne seront pas prsents compte tenu de leur simplicit, sont les pages vers lesquelles la navigation pourra tre orienteaumomentdelavalidationduformulaire.Lapremiredecesdeuxpagesdevratreprsentelinternaute encasderussitedelinscription,lasecondedevraltredanslecascontraire.

Outreleshabituelslmentsdeformulaire(zonesdetexte,casescocher,zonedeliste,etc.),lapageprincipalede lapplicationcomportedescontraintesdestinesgarantirlafiabilitdesdonnessaisies.Enloccurrence:
q

LeschampsNom,DatedenaissanceetSexedoiventobligatoirementtrerenseigns. LechampNomdoitconteniruntextedelongueurcompriseentre5et100caractres.Unetellecontrainteest, par exemple, tout fait envisageable dans le cas o le nom doit tre par la suite stock dans un champ de basededonnesdontlalongueurnepeutpasexcder100caractres. LechampDatedenaissancedoitobligatoirementtreauformatJJ/MM/AAAA.Parexemple,17/07/2008.

En cas de nonrespect des contraintes, des messages derreurs explicites devront tre prsents linternaute, en regarddeschampsdesaisieconcerns,dslavalidationduformulaire.

ENI Editions - All rigths reserved

- 1-

- 2-

ENI Editions - All rigths reserved

Architectureetfichiersdeconfiguration
1.ArchitectureduneapplicationJSF
UneapplicationJavaServerFacesdoitobligatoirementrespecterlaspcificationrelativeauxservlets(version2.3ou plus rcente), ainsi que la spcification Java Server Pages (version 1.2 ou plus rcente). En consquence, larchitecture dune application JSF est similaire celle dune application web classique mise en uvre par un conteneurdeservlets:larborescenceestconstituedetroisdossiers:
q

Le premier, par dfaut nomm src, est destin au stockage du code source des classes Java utilises par lapplication(JavaBean,couteurs,validateurspersonnaliss,convertisseurspersonnaliss,etc.).Ilsertaussi larchivage des fichiers dextension .properties, exploits notamment par lapplication pour faciliter son internationalisation. LesecondregroupelecodecompildesclassesJavavoquesprcdemment.Cedossiersenommebuild. Ledernierdossier,appelpardfautWebContent,contientlesressourcesdestinestrepubliesparle moteurdeservlets,principalementlespagesJSP/JSF.Cerpertoireagalementpourrlederegrouperles fichiersdeconfigurationdelapplicationweb,savoirledescripteurdedploiement,ainsiquele(s)fichier(s) deconfigurationdesressourcesdelapplication(voircidessous).

LafiguresuivantemontrelarchitectureduneapplicationJSF,tellequelleseprsentedanslexplorateurdeprojets delenvironnementdedveloppementEclipse.

LenomdesrpertoiressrcetWebContentpeuttrechoisilibrementaumomentdelacrationdelapplication.Dans le cas o les valeurs par dfaut ne sont pas utilises, les choix raliss sont mmoriss dans le fichier de configurationduprojet. De mme, lorsque le nom du fichier de configuration des ressources de lapplicationJSFestpersonnalis(sonnom par dfaut est facesconfig.xml), ou sil existe plusieurs fichiers de configuration de ressources, les changements sont rpertoris au sein du descripteur de dploiement par lintermdiaire dunebalise <context-param>, comme le montrelecodesourcesuivant: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

ENI Editions - All rigths reserved

- 1-

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>deuxiemeJSF</display-name> ... <context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/maConfig/faces2-config2.xml</param-value> </context-param> </web-app>

2.FichiersdeconfigurationdesressourcesduneapplicationJSF
La technologie Java Server Faces est conue pour permettre la configuration des ressources exploitables par une application web au moyen dun ou de plusieurs fichiers de configuration. Ces fichiers sont appels fichiers de configuration des ressources : ils servent rpertorier et initialiser les ressources telles que les JavaBeans et les rglesdenavigation.

a.Localisationdu/desfichier(s)deconfigurationdesressources
Commecelaatprcisdansleparagrapheprcdent,uneapplicationJSFdebaseutiliseununiquefichierde configuration des ressources dnommfacesconfig.xml, mais il est possible den dfinir davantage. Ces fichiers XML contiennent tous une balise racine <faces-config> encadrant dautres balises enfants reprsentant les ressourcesgres.Unexempledecontenudefichierdeconfigurationderessourcesestprsentplusloindansce chapitre. Aumomentdudmarragedelapplicationweb,leoulesfichiersdeconfigurationdesressourcessontrecherchs danslarborescenceselonlundesprocdssuivants:
q

Recherche dun fichier /METAINF/facesconfig.xml dans lun des fichiers JAR ventuellement prsents dans le rpertoire /WEBINF/lib de lapplication web. Si ce fichier est trouv, il est exploit en tant que fichierdeconfigurationdesressources. Recherche dun paramtre initial nomm javax.faces.application.CONFIG_FILES dans le descripteur de dploiementdelapplicationweb.Lorsqueceparamtreesttrouv,savaleurcontientlalistedesnomsde fichiers de configuration des ressources, spars par des virgules. Ce mode de dclaration est pratique lorsquelapplicationJSFestdetailleimportanteetquesonarchitectureestconfieplusieurspersonnes. Recherchedunfichierfacesconfig.xmldanslerpertoire/WEBINFdelapplication.Cestlemoyenleplus simpledeconfigureruneapplicationJSFcestaussilechoixretenuparlenvironnementEclipselorsqueles paramtresproposspardfautaumomentdelacrationdunprojetJSFsontretenus.

b.Modedexploitation
Toutes les applications JSF sont reprsentes en mmoire sous la forme dune instance de la classe javax.faces.application.Application. Cet objet est utilis notamment pour regrouper toutes les ressources utilisables. Au dmarrage de lapplication, le(s) fichier(s) de configuration des ressources sont parcourus pour dterminer la listedesobjetscrerpuisajouterlobjetApplication.PlusieursmthodesdistinctesdelaclasseApplication sontutilisespourralisercesoprations.Voicileurssignatures: public abstract Converter createConverter(String converterId) public abstract Converter createConverter(Class targetClass) public abstract Validator createValidator(String validatorId) throws FacesException

public abstract UIComponent createComponent(String componentType) throws FacesException public abstract UIComponent createComponent( ValueBinding componentBinding,

- 2-

ENI Editions - All rigths reserved

FacesContext context, String componentType) throws FacesException public UIComponent createComponent( ValueExpression componentExpression, FacesContext context, String componentType) throws FacesException Les mthodes nommescreateConverter() sont utilises pour instancier les convertisseurs personnaliss, alors que la mthode createValidator() sert mettre la disposition de lapplication les validateurs personnaliss. Quant aux mthodes createComponent(), elles sont destines assurer la cration des autres types de composantsJSFpersonnaliss. Le code source cidessous est un extrait de fichier de configuration de ressources, dans lequel sont dclars un convertisseur personnalis, un validateur personnalis, un bean manag et une rgle de navigation. Ces notions seronttudiesplusendtaildanslasuitedecechapitre,sectionNavigationentrelespages,ainsiquauchapitre Convertisseursetvalidateurs. <?xml version="1.0" encoding="UTF-8"?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"> <converter> <display-name> convertisseurNombrePairPositif</display-name> <converter-id> monConvertisseurNombrePairPositif</converter-id> <converter-class> premierProjetJSF.NombrePairPositifConverter</converter-class> </converter> <validator> <display-name> Validation du mot de passe</display-name> <validator-id> monValidateurDeMotDePasse</validator-id> <validator-class> premierProjetJSF.ValidatorPassword</validator-class> </validator> <managed-bean> <managed-bean-name> tirage</managed-bean-name> <managed-bean-class> premierProjetJSF.Tirage</managed-bean-class> <managed-bean-scope> session</managed-bean-scope> <managed-property> <property-name> maximum</property-name> <property-class> int</property-class> <value> 10</value> </managed-property> <managed-property> <property-name> minimum</property-name> <property-class> int</property-class> <value> 0</value> </managed-property> </managed-bean>

ENI Editions - All rigths reserved

- 3-

<navigation-rule> <display-name> inscription</display-name> <from-view-id> /inscription.jsp</from-view-id> <navigation-case> <from-outcome>succesInscription</from-outcome> <to-view-id> /confirmationInscription.jsp</to-view-id> </navigation-case> </navigation-rule> </faces-config>

c.Typesderessourcesconfigurables

Dans un souci de clart du texte dans le reste de louvrage, nous considrerons que les ressources des applicationswebvoquessontconfiguresgrceununiquefichierdeconfigurationdesressources.

Javabeans LadclarationdunJavaBeanoudunbeanmanagdanslefichierdeconfigurationdesressourcessefaitlaidede labalise<managed-bean>.Celleciregroupeunensembledebalisesenfantsdontlenometlerlesontprcissci dessous: <managed-bean-name> DfinitlaclattribueauJavaBean.Cettecl,valablesurlaporteprvuepourleJavaBean,pourratreutilise danstouteslespageswebdelapplicationJSFpourrfrencerceJavaBeanenparticulier. <managed-bean-class> Indique le nom de la classe partir de laquelle doit tre instanci le JavaBean. Cette classe doit bien sr tre rendueaccessibleparlapplication. <managed-bean-scope> Prcise la porte dans laquelle le JavaBean est instanci. Les valeurs possibles pour ce paramtre sont none, request,sessionetapplication.Lutilisationdelaportenonepermetdinstanciersystmatiquementunnouveau JavaBeanchaquefoisqueceluiciestrfrencdanslapage.Danscecasbiensr,leJavaBeannestrattach aucuneporteparticulire. <managed-property> SertdfinirlavaleurdinitialisationdunepropritparticulireduJavaBean. LadfinitiondunJavaBeanpeutcontenirplusieursdfinitionsdeproprits. Lavaleurdelapropritestdclaregrceunebaliseenfantnomme<value>.Sontypeestindiquparlabalise enfant <property-class>, alors que le nom mme de la proprit est mentionn par la balise enfant <propertyname>. LefaitdedclarerlesJavaBeansauseindufichierdeconfigurationdesressourcesprsenteplusieursavantages. Notammentlapossibilitdefairelesdclarationsdansununiquefichierutilisableparlensembledelapplication,et lapossibilitdeprciserfacilementlavaleurdespropritssanscriredelignesdecodeJavasupplmentaires. De plus amples dtails concernant lusage de llment<managed-bean> sont donns dans le chapitre Exploitation descomposantsstandardsJSF. Messagesetlabelspersonnaliss Commeprsentplusloindanscechapitre,lesapplicationsJSFsontconuespourfaciliterlaffichagedesmessages derreurs survenant au cours des processus de validation ou de conversion des donnes. Les contenus de ces messages, qui peuvent tre exposs linternaute par lintermdiaire des balises <h:message> ou <h:messages>, peuventtredfinisdemaniredynamiquecomptetenudelalogiquemtierdelapplication.Ilspeuventaussitre dfinisdemanirestatiqueauseindunouplusieursfichiersdeproprits,dontlesrfrencessontmentionnes danslefichierdeconfigurationdesressources.

- 4-

ENI Editions - All rigths reserved

Ce mme type de fichier de proprits peut galement tre utilis pour spcifier un ensemble dtiquettes, utilisablesparexempleentantquelabelsdechampsdesaisiedeformulairesweb. Unfichierdepropritsestunsimplefichiertextedontlenompossdelextension.properties.Gnralementplac danslesousrpertoiresrcdelapplicationweb,ilregroupeunensembledeligneschacunedellesreprsentant unmessageparticulier.Unmessagespcifiqueestindiqugrcesonidentifiantetsavaleur.Voiciunexemple de fichier de proprits dont le contenu peut tre utilis pour fournir des tiquettes aux champs de saisie de formulaires: name=Nom password=Mot de passe clientcode=Code client welcome=Bienvenue! submit=Validez login=Se connecter Pour que ce fichier de proprits soit utilisable par lapplication JSF, celleci doit en connatre la rfrence par lintermdiairedufichierdeconfigurationdesressources.Parexemple,lefichierdepropritsdontlecontenuest prsentcidessuspeuttredclardelafaonsuivante: <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"> ... <application> <message-bundle> premierProjetJSF.messages </message-bundle> ... </application> ... </faces-config> La dclaration se fait donc laide dune balise <message-bundle>, ellemme contenue dans un lment <application>,directementplacsous<faces-config>.Lefichierdepropritssenommemessages.propertieset setrouveplacdanslesousrpertoiresrc/premierProjetJSFdelapplicationweb. Pourinformation(cepointestabordplusendtailauchapitreInternationalisationduneapplicationweb),lusage decesmessagesdansunepagewebdelapplicationpeutsefaireenchargeantlaressourcegrceunebalise <f:loadBundle>,puisenutilisantlarfrencedecetteressourcepourafficherunetiquettedechampdesaisie.Le codesourcesuivantillustrecettesituation: %@taglib uri="http://java.sun.com/jsf/html" prefix="h"% <%@taglib uri=http://java.sun.com/jsf/core prefix="f"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Usage dune ressource regroupant des messages personnaliss</title> </head> <body> <f:view> <f:loadBundle basename="premierProjetJSF.messages" var="mesMessagesPerso"/> <h:form> <h:outputText value="#{mesMessagesPerso.clientcode}"> </h:outputText> </h:form> </f:view> </body> </html> Malgr lintrt que peut prsenter cette forme dutilisation des messages personnaliss, lemploi de la balise <f:loadBundle> dans chaque page susceptible dexploiter le fichier de proprits contenant les messages peut paratre fort contraignant, en particulier lorsque le nombre des pages concernes est important. Pour lever cette contrainte,larfrenceauxfichiersdepropritspeutsefaireduneautremaniredanslefichierdeconfiguration
ENI Editions - All rigths reserved - 5-

desressources,commelemontrelecodesuivant: <application> ... <ressource-bundle> <base-name> premierProjetJSF.messages </base-name> <var> mesMessagesPerso </var> </ressource-bundle> ... </application> Lusageinitialdellment <message-bundle> a t remplac par celui de la balise<ressource-bundle>, laquelle sontassociesleslmentsenfants<base-name>et<var>.Lecontenudecedernierlmentprciselidentifiantdu fichierdeproprits,telquilpourratreemploydanslesdiffrentespageswebdelapplicationsansquilsoitfait usagedelabalise<f:loadBundle>. Validateurspersonnaliss LimplmentationJSFfournitunjeudevalidateurspardfaut,quipeuventtreutilisspourrpondreauxbesoins les plus courants. Cependant, ces validateurs peuvent savrer insuffisants dans le cadre dapplications professionnelles o la logique mtier peut imposer la mise en place de contrles plus pousss. JSF offre donc la possibilit de dfinir des validateurs personnaliss, par la cration de classes Java implmentant linterface javax.faces.validator.Validator. Le caractre non standard de ce type de ressource implique obligatoirement sa dclaration au sein du fichier de configuration des ressources de lapplication, grce llment <validator> directement plac sous <facesconfig>: <validator> <display-name> Validation du mot de passe</display-name> <validator-id> monValidateurDeMotDePasse</validator-id> <validator-class> premierProjetJSF.ValidatorPassword</validator-class> <attribute> ... <attribute-name>longueurMinimale</attributeName> <attribute-class>java.lang.Integer</attribute-class> <default-value>5</default-value> <attribute-name>nombreCaracteresSpeciaux</attributeName> <attribute-class>java.lang.Integer</attribute-class> </attribute> </validator> Lexemple cidessus prsente la dclaration dun validateur personnalis nommmonValidateurDeMotDePasse. Cet identifiantestceluiquidoittreutilisdanslespagesdelapplicationwebpourexploiterlevalidateurenquestion. Laclassepartirdelaquelleestinstancilevalidateurestmentionnegrcellment<validator-class>.Son nomdoittreindiquintgralement,packagecompris.Silevalidateurrequiertdesattributs,ceuxcisontprciss parleurnometleurtypegrceauxlments<attribute>,<attribute-name>et<attribute-class>. Pour information, un tel validateur personnalis peut tre constitu pour vrifier que la saisie dun mot de passe rpond certains critres prcis, comme le respect dun nombre de caractres minimal, ainsi que lobligation de conteniruncertainnombredecaractresspciaux(%,#,$,etc.). LtudedesvalidateurspersonnalissestassuredemanireplusapprofondiedanslechapitreConvertisseurset validateursdecetouvrage. Convertisseurspersonnaliss Pour les mmes raisons que celles voques propos des validateurs personnaliss, il est indispensable de dclarer les convertisseurs non standards dans le fichier de configuration des ressources, afin quils soient disponibles dans lensemble de lapplication. Un convertisseur est une classe Java implmentant linterface javax.faces.convert.Converter, dont les rfrences sont prcises laide dune balise<converter>. Le code ci

- 6-

ENI Editions - All rigths reserved

dessousprsenteladclarationdunconvertisseurpersonnalis. <converter><description> Utilis pour sassurer quun nombre prcis peut tre Stock dans une proprit de JavaBean ne pouvant Accueillir quun nombre pair positif. </description> <display-name> convertisseurNombrePairPositif</display-name> <converter-id> monConvertisseurNombrePairPositif</converter-id> <converter-class> premierProjetJSF.NombrePairPositifConverter</converter-class> </converter> L encore, les proprits principales du convertisseur personnalis se limitent son identifiant, tel quil sera exploitauseindespagesdelapplication,etlaclassepartirdelaquelleilestinstanci.Cesdeuxinformations sontdonnesrespectivementparlusagedesbalises<converter-id>et<converter-class>. Rglesdenavigation Lefichierdeconfigurationdesressourcesestaussiexploitparlarchitectedelapplicationpourmentionnerleflot denavigation.LanavigationauseinduneapplicationJSFsedfinitlaidederglesdenavigationquispcifient comment il est possible daller dune page web vers une autre lorsque linternaute active un bouton ou un lien hypertexte. Concrtement,unergledenavigationconcerneunepagesourceenparticulier,etindiquelesdiffrentessituations qui peuvent provoquer la navigation de cette page source vers dautres pages de lapplication. Ces diffrentes situations, nommes cas de navigation dans la terminologie JSF, sont le plus souvent caractrises par un identifiant(chanedecaractres)etlenomdelapageciblecorrespondante. Voicicommentsedclareunergledenavigationsimple,danslefichierdeconfigurationdesressources: <navigation-rule> <display-name> inscription</display-name> <from-view-id> /inscription.jsp</from-view-id> <navigation-case> <from-outcome>succesInscription</from-outcome> <to-view-id> /confirmationInscription.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>echecInscription</from-outcome> <to-view-id> /inscriptionImpossible.jsp</to-view-id> </navigation-case> </navigation-rule> Unergledenavigationspcifiquesedfinitdonclaidedunebalise<navigation-rule>directementplacesous llment<faces-config>. La page source concerne par la rgle est indique par le contenu de llment<fromview-id>.Danslecasocetlmentnestpasprcis,larglesappliquetouteslespagesdelapplication.Siune chanegnriqueestutilisecommevaleurdecetlment(parexemple,/administration/*),seuleslespagesqui y correspondent sont concernes par la rgle de navigation (ici, toutes les pages situes dans le sous rpertoire/administrationdelapplication). Les cas de situations rpondant la rgle correspondent aux balises<navigation-case>, auxquelles sont le plus souvent associes les balises <from-outcome> et <to-view-id>. La premire contient la chane de caractres identifiantlecasdenavigation,alorsquelasecondementionnelapageciblecorrespondante. Lexemple prsent cidessus correspond une unique rgle de navigation concernant la page source inscription.jsp.Cettergleestcomposededeuxcasdenavigationpermettantdepasserdelapagesourcevers lapagecibleconfirmationInscription.jsplorsquelecasnommsuccesInscriptionestemployetdepasserversla pageinscriptionImpossible.jspenutilisantlecasechecInscription. Dautres dtails concernant la mise en uvre du modle de navigation JSF sont prsents plus loin dans ce chapitre.

ENI Editions - All rigths reserved

- 7-

tapesrespecterpourlacrationduneapplicationJSF
LedveloppementduneapplicationJSFimpliquelerespectdestapessuivantes:
q

crationduneinstancedelaFacesServlet conception des pages web en utilisant les diffrents composants graphiques ainsi que les lments de la bibliothqueCore spcificationdelanavigationauseindelapplicationweb dveloppementdesbeansncessairesaubonfonctionnementdelapplication.

LundesintrtsdelatechnologieJavaServerFacesestquellepermetunerpartitiondestchesdedveloppement entretroistypesdintervenants.Enloccurrence:
q

Ledesignerweb,quiprendenchargelacrationdespagesJSP/JSFetlergonomiegnraledelapplication. SontravailestlargementfacilitparlemploidesbibliothquesdebalisesJSF. Ledveloppeurdelapplication,dontlerleconsistecrerlesdiffrentsbeans.Celuiciestgalementamen mettre en place les ventuels composants personnaliss non graphiques, tels que les convertisseurs, les validateursetlescouteursdvnements. Le concepteur de composants graphiques personnaliss. Naturellement, sa tche comprend galement la gestiondurendudecescomposantsgraphiques.

1.CrationduneinstancedelaFacesServlet
Toutes les applications web bases sur JSF exploitent une instance de la FacesServlet. Celleci est utilise pour prendreenchargelesrequtesentrantes,lesanalyseretlesinsrerdanslecycledeviedelapplicationweb.Elle assuregalementlinitialisationdesmultiplesressourcesutilisesdanslapplication. Pour quune application Java Server Faces soit en mesure dexcuter une premire page JSP, le conteneur web invoque linstance de FacesServlet. Cela a pour effet denclencher le cycle de vie de lapplication. Linstance en questionestidentifieauniveaudelapplicationparunmappingquipeuttre:
q

unprfixe:parexemple,/faces/* uneextension:parexemple,*.faces.

CemappingestutilispourreprerlespagesJSPsusceptiblesdecontenirdeslmentsJavaServerFaces. LecodecidessousprsenteleslignescorrespondantladclarationdunmappingdelaFacesServlet,auseindu descripteurdedploiementduneapplicationweb: <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> Danscetexemple,touteslespagesJSPsituesdanslesousrpertoirefacesdelapplicationwebsontsusceptibles decontenirdescomposantsJavaServerFaces.Ilsagit donc dunmappingparprfixequipeut,parexemple,tre facilement exploit depuis la barre dadresse dun navigateur web : http://localhost:8080/monApplicationJSF/faces/index.jsp LexemplesuivantillustrelemappingdelaFacesServletparlextension*.faces:

ENI Editions - All rigths reserved

- 1-

<servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> Lorsque le conteneur web rcupre une requte adresse une page JSP dont le nom se termine par lextension faces,illatransmetlinstancedeFacesServlet.Cellecirecherchealorsdanslarborescencedelapplicationwebla page JSP correspondant au nom mentionn, en remplaant lextension faces par lextension jsp. Par exemple, si lutilisateur demande la ressource http://localhost:8080/monApplicationJSF/index.faces, cest la page index.jsp qui serarecherchepuispriseenchargeparlinstancedeFacesServlet.

2.Crationdespagesweb
Cettetapeconsisteraliserlesoprationssuivantes:
q

PositionnerlescomposantsJavaServerFacessurlapage. Lierlescomposantsdespropritsdebeans,lorsquecestncessaire. Rfrencer les ventuels convertisseurs, validateurs et couteurs auprs des composants graphiques qui requirentleurexistence.

a.DclarationdesbibliothquesdebalisesJavaServerFaces
Cesactions,thoriquementlachargedudesignerweb,imposentladclarationdesdeuxbibliothquesstandards debalisesJSFenenttedechaquepageweb.Eneffet,lexploitationdecomposantsgraphiquesJavaServerFaces dans les pages JSP ne peut se faire qu condition de savoir comment restituer lcran lapparence de ces composants:labibliothqueHTMLfournitcetteinformation.Ilestgalementimpratifdesavoircommentgrerles actions ralises au niveau de chaque composant graphique : cest le rle de la bibliothque Core. Il faut donc systmatiquement mentionner laccs ces deux bibliothques dans les pages JSP, grce aux directives taglib suivantes,dslorsquelespagesenquestionfontusagedesbalisesJSF. <%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> Lattribut uri de chacune de ces directives rfrence la TLD dcrivant les balises contenues dans la bibliothque concerne.Lattribut prefixidentifieleprfixeutilisdanslapageJSPpourfairerfrencelune ou lautredes bibliothques.Lenomdeceprfixepeuttrechoisilibrement.

b.Positionnementdesbalisesviewetform
TouslescomposantsJSFdunepagewebsontregroupsdansunarbredecomposants.DanslanomenclatureJava ServerFaces,cetarbreestnommvue.LaracinedecetarbreestuncomposantJSFissudelaclasseUIViewRoot, dont la reprsentation au sein des pages web se fait grce une balise view. Cette balise est dclare dans la bibliothqueCore.Aumomentdudveloppementdespagesdelapplication,labaliseviewdoitimprativementtre positionne en tant qulment parent de toute autre balise JSF, et en particulier de celles correspondant aux composantsgraphiques. Parailleurs,silespageswebprsententdescomposantspermettantauxutilisateursderaliserdessaisies(zones de texte, zones de liste droulantes, cases cocher, boutons doptions),il est impratif dintercaler une balise form entre la balise view et les diffrentes balises reprsentant les composants de saisie. Cette balise form est issuedelabibliothqueHTMLetpeutcomporterunattributiddontlerleconsisteidentifierdemanireuniquele formulaireauseindelapageweb. VoicilecontenutypedunepageJSPexploitantJSF,avantinsertiondetoutcomposantautrequeviewetform. <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <html> <head><title>Formulaire dinscription</title></head> <body><f:view> <h:form id="formulaireInscription"></h:form> </f:view> </body>

- 2-

ENI Editions - All rigths reserved

</html>

c.Ajoutdecomposantsgraphiquesdansunepageweb
Les lments principaux des pages web sont, bien entendu, les composants graphiques partir desquels linternauteestameninteragiraveclapplicationweb.Cescomposants,dcritsplusendtaildanslasectionLes composants graphiques de ce chapitre, sont des objets issus de classes drives de la classe parente javax.faces.component.UIComponentBase. chacun deux est associe une balise spcifique de la bibliothque HTML.LajoutdecomposantsgraphiquesJSFunepagewebconsistedoncsimplementpositionnerdanslecode sourcedecettepagelesbalisescorrespondantauxlmentsquelonsouhaitevisualiser.Ilfauttoutefoissassurer quecesbalisessontbieninsresentreleslments<f:view> et</f:view>,etquelesattributsimprativement requissontbienrenseigns. Dansleformulairedesaisieutilispourillustrercechapitre,plusieurscomposantsgraphiquessontutiliss:
q

Leschampstextedesortie,quiserventafficherdesinformationstextuellessurlinterfaceweb.Cetypede composant graphique est utilis ici pour prsenter linvite situe en entte de formulaire, ainsi que les diffrents labels des champs de saisie. La balise utiliser pour les champs texte de sortie est <h:outputText>. Leschampsdesaisiedetypetexte:labalisequileurcorrespondest<h:inputText>. Les zones de liste droulantes choix unique, reprsentes par la balise <h:selectOneListBox>. Cette balisedisposedebalisesenfants<f:selectItem>,quicorrespondentauxlmentsdelistes. Les boutons radio, gnrs grce une balise <h:selectOneRadio>. cette balise sont associes une ou plusieursbalisesenfants<f:selectItem>pourreprsenterchacundeschoixpossibles. Lesboutonsdecommande.Labalisequileurcorrespondest<f:commandButton>. Les messages qui apparaissent lorsque la validation du formulaire choue, du fait dune contrainte non respecte(nombredecaractresinsuffisant,mauvaisformatdechane,etc.).Cesmessagessontinsrs danslapagewebsouslaformedunebalise<h:message>.

LecodesourcedelapageJSPreprsentantleformulaireconcevoirestsitucidessous.TouslescomposantsJSF qui viennent dtre cits y sont mentionns : ils sont accompagns dattributs obligatoires ou optionnels, dont la signification sera explique plus loin dans ce chapitre. Notez que tous ces composants graphiques JSF sont intercalsavecducodeHTMLclassique,pourpermettrenotammentunaffichagesouslaformedetableau. <%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Formulaire dinscription</title> </head> <body> <f:view> <h:form id="formulaireInscription"> <table align="center"> <tr> <td colspan="3"> <h:outputText value="Saisissez les paramtres suivants pour valider votre inscription:" style="color: #0000FF; text-decoration: underline"> </h:outputText> <br><br> </td> </tr> <tr>

ENI Editions - All rigths reserved

- 3-

<td> <h:outputText id="otxtNom" value="Nom*"> </h:outputText> </td> <td> <h:inputText id="itxtNom" > </h:inputText> </td> <td> <h:message id="msgNom" for="itxtNom" style="color: #FF0000; background-color: #FFFF00"> </h:message> </td> </tr> <tr> <td> <h:outputText id="otxtPrenom" value="Prnom"> </h:outputText> </td> <td> <h:inputText id="itxtPrenom" value="Prnom par dfaut"> </h:inputText> </td> <td> <h:message id="msgPrenom" for="itxtPrenom" style="color: #FF0000; background-color: #FFFF00"> </h:message> </td> </tr> <tr> <td> <h:outputText id="otxtDateNaissance" value="Date de naissance*"> </h:outputText> </td> <td> <h:inputText id="itxtDateNaissance" > </h:inputText> </td> <td> <h:message id="msgDateNaissance" for="itxtDateNaissance" style="color: #FF0000; background-color: #FFFF00"> </h:message> </td> </tr> <tr> <td> <h:outputText id="otxtSexe" value="Sexe*"> </h:outputText> </td> <td> <h:selectOneRadio id="radioSx"> <f:selectItem id="sexeChoix1" itemLabel="Masculin" itemValue="Masc" /> <f:selectItem id="sexeChoix2" itemLabel="Fminin" itemValue="Fem" /> </h:selectOneRadio> </td> <td> <h:message id="msgSexe" for="radioSx" style="color: #FF0000; background-color: #FFFF00"> </h:message> </td> </tr> <tr> <td> <h:outputText id="otxtNombreEnfants" value="Nombre denfants"> </h:outputText> </td> <td>

- 4-

ENI Editions - All rigths reserved

<h:selectOneListbox id="listeAge" size="1"> <f:selectItem id="itemZero" itemLabel="0" itemValue="0" /> <f:selectItem id="itemUn" itemLabel="1" itemValue="1" /> <f:selectItem id="itemDeux" itemLabel="2" itemValue="2" /> <f:selectItem id="itemTrois" itemLabel="3" itemValue="3" /> <f:selectItem id="itemQuatre" itemLabel="4" itemValue="4" /> <f:selectItem id="itemCinqPlus" itemLabel="5 et plus" itemValue="5" /> </h:selectOneListbox> </td> <td></td> </tr> <tr> <td colspan="3" align="center"> <h:commandButton id="cmdValider" value="Valider votre inscription"> </h:commandButton> </td> </tr> </table> </h:form> </f:view> </body> </html>

ENI Editions - All rigths reserved

- 5-

Lescomposantsgraphiques
Ce paragraphe dcrit les diffrents composants dinterfaces proposs en standard par la technologie Java Server Faces. Les composants graphiques sont constitus ct serveur par des classes spcifiques, drives de la classe parente javax.faces.component.UIComponentBase. Ces composants peuvent tre associs diverses interfaces permettant notamment:
q

lemaintiendeltatentrelespagesweb lapriseenchargedelagestionvnementielle larestitutionderendusvisuelsspcifiques,variablessuivantlecomposantgraphiqueconcern.

1.Classescorrespondantauxcomposantsgraphiques
CommetouteslesclassesJava,laclasseUIComponentBasealapossibilitdtredrivedanslebutdepermettrela constitution de composants graphiques entirement personnaliss. Ce point fait lobjet de lintgralit du chapitre Composantsgraphiquespersonnalissdecetouvrage. LalistesuivanteprsentelesprincipalesclassescorrespondantdescomposantsgraphiquesstandardsJSF.Lerle decescomposantsyestprcis,ainsiqueceluideleursprincipauxattributs,modifiablesparappeldemthode(ou parprcisiondunattributspcifiquedanslabalisereprsentantlecomposant).Lesclassessontprsentesiciselon lordrealphabtique. UIColumn ReprsenteunecolonneuniqueducomposantUIData. Attributscaractristiquesventuels : contenusdelentteetdupieddecolonne(mthodessetHeader()etsetFooter()). UICommand Reprsenteuncomposantpouvanttreutilisauniveaudelinterfacewebpourprovoqueruneactionparticulire.En gnral,cetypedecomposantestrestituvisuellementparunbouton,unlmentdemenuouunlienhypertexte. Lamthode decode()decetteclasseassureladtectiondelactivationducontrle(clicdesouris,parexemple)et placeunvnementdetypeActionEventenfiledattentedetraitement. Lamthodebroadcast()assureladiffusiondecetvnementtouslescouteursconcerns. LamthodegetActionExpression()renvoielexpressiondemthode(cestdirelexpressionpointantunemthode particulire dun objet spcifique) permettant dentreprendre laction raliser lorsque linternaute active le composant. Suivant la valeur de la proprit immediate (voir ciaprs), lexcution de cette action intervient soit durantlaphaseApplyRequestValues,soitdurantlaphaseInvokeApplication). Attributscaractristiquesventuels : Listedescouteursdvnementsassociscettesource. Flagindiquantsiletraitementdesvnementsdoittretraitimmdiatementounon(mthodesisImmediate()et setImmediate()). UIData Ce composant est conu pour tre li une collection de donnes et en afficher le contenu suivant un rendu particulier. LecomposantUIDatalepluscourantestletableauHTML,instancisouslaformedunobjetdetypeHtmlDataTable (classedrivedeUIData).
ENI Editions - All rigths reserved - 1-

Attributscaractristiquesventuels : Contenusdelentteetdupieddetableau(mthodessetHeader()etsetFooter(). Nombredelignes(getRowCount()),donnesitueaurangcourant(getRowData()). UIForm Reprsente un formulaire destin tre prsent linternaute. Ce composant dispose dun ensemble de composants"enfants",correspondantauxdiffrentschampsdesaisieutilissdansleformulaire. Attributscaractristiquesventuels : Famillelaquellelecomposantestrattach(getFamily()). UIGraphic Il sagit dun composant charg de prsenter une image lutilisateur. Cette image ne peut en aucun cas tre manipule. Attributscaractristiquesventuels : LURLdelimageprsenter. UIInput CetteclasseestdrivedelaclasseUIOutput(voircidessous). Ellereprsenteuncomposantgraphiquecapablelafoisdditerducontenu(cettecapacitprovientdelhritage deUIOutput)etderecevoirdesinformationsensaisie. LinformationstockedansunchampUIInputestpriseenchargelorsdelavalidationduformulairequilecontient. DurantlaphaseApplyrequestvaluesducycledevie,lavaleurducomposant(habituellementunechanedecaractre) doittrestockeaumoyendelappeldelamthodesetSubmittedValue().ceniveau,lavaleurducomposantna pasencoretpriseenchargeparunventuelconvertisseur(voirlasectionConversionsdedonnescidessous). LorsquelecomposantUIInputnedisposedaucunevaleuraumomentdelasoumissionduformulaire,ilalacapacit denerienfaire,oudesoumettrelavaleurnull. Pendant la phaseProcessValidatorsducycledevie,unetentativedeconversiondelavaleursoumiseestralise, dans le but de pouvoir sauvegarder cette valeur au niveau de la couche mtier de lapplication web. En cas de succs,lavaleurenquestionestdesurcrotsauvegardeauniveauducomposantgraphiqueluimme,parappelde lamthodesetValue(). Lorsquelamthodevalidate()deUIInputdtecteunchangementdevaleur,etquecettenouvellevaleursubitavec succs les processus de validation et de conversion, un vnementjavax.faces.event.ValueChangeEvent est plac en file dattente. Cet vnement est par la suite propag lensemble des couteurs concerns, par appel de la mthode broadcast(). Cette propagation intervient en gnral durant la phase Process Validators, mais elle peut toutefois intervenir pendant la phase Apply Request Values si la proprit immediate du composant UIInput est positionnesurlavaleurtrue. Attributscaractristiquesventuels : Listedesvalidateurs,modifiablesparappeldesmthodesaddValidator()etremoveValidator(). Flagindiquantsilaprcisiondunevaleurpourcechampestobligatoire(mthodesetRequired()). Messagerenvoylinternauteencasdenonprcisiondunevaleur,danslecasocelleciestrequise(mthodes getRequiredMessage()etsetRequiredMessage()). Message renvoy linternaute en cas dchec du processus de conversion de la valeur du champ (mthodes getConverterMessage()etsetConverterMessage()). Message renvoy linternaute en cas dchec du processus de validation de la valeur du champ (mthodes

- 2-

ENI Editions - All rigths reserved

getValidatorMessage()etsetValidatorMessage()). UIMessage Ce composant assure laffichage de messages concernant un autre composant graphique (le client) situ sur linterfaceweb.LecontenudumessageaffichersobtientpartirdunFacesMessagegnr,parexemple,parun validateurouunconvertisseur. Attributscaractristiquesventuels : Lidentifiantduclient,cestdireducomposantconcernparlemessage(mthodesetFor()). UIMessages Permet laffichage dun ensemble de messages dans linterface web. Un composant UIMessages est en mesure de prsenter lutilisateur les ventuels messages relatifs lensemble des autres composants disposs sur la page web. Famillelaquellelecomposantestrattach(getFamily()). UIOutput Ce composant est conu pour permettre laffichage de sa valeur dans linterface utilisateur. Cette valeur, qui peut notamment tre obtenue dynamiquement depuis un JavaBean ou un bean manag, nest pas modifiable par linternaute. PendantlaphaseRenderresponseducycledevie,lavaleurducomposantdoittreconvertieenchanedecaractres pourpouvoirtreprsentelcran.Cetteconversionpeuttreassurededeuxmanires:
q

Dans le cas o lobjet UIOutput dispose dun convertisseur dfini (objet issu dune classe implmentant linterfacejavax.faces.convert.Converter),lamthodegetAsString()deceluiciestinvoque. LorsquaucunconvertisseurspcifiquenestassociauUIOutput,laconversionestassureparlappeldela mthodetoString()ducomposant.

Silaconversionchoue,uneConverterExceptionestgnre. Attributscaractristiquesventuels : Convertisseurventuellementassociaucomposant(mthodegetConverter()). UIPanel Composant jouant le rle de conteneur dautres composants graphiques. Il est charg de contrler la disposition visuelledecescomposants. Attributscaractristiquesventuels : Famillelaquellelecomposantestrattach(getFamily()). UISelectBoolean CetteclassedrivedelaclasseUIInput. Ellecorrespondunchamppermettantdesaisirunevaleurboolenne.Leplussouvent,cechampestreprsent parunecasecocher. Attributscaractristiquesventuels : Flagindiquantsilechampestslectionn(mthodessetSelected()etisSelected()). UISelectItem PeuttrepositionnauseinduncomposantgraphiqueconteneurdetypeUISelectManyouUISelectOne.Lutilisation

ENI Editions - All rigths reserved

- 3-

dececomposantprovoquelacrationduneinstancedelaclassejavax.faces.model.SelectItem,quivientsajouter lensembledesautreslmentsslectionnablesdjrattachsaucomposantconteneur. Attributscaractristiquesventuels : Ladescriptiondellment(mthodegetItemDescription()),sonlabel(getItemLabel())etsavaleur(getItemValue ()). Flagindiquantsillmentdelisteestslectionnableounon(mthodeisItemDisabled()). UISelectItems Ce composant peut tre positionn au sein dun composant graphique conteneur de type UISelectMany ou UISelectOne.Lutilisationdececomposantprovoquelacrationduneoudeplusieursinstancesissuesdelaclasse SelectItem. Ces instances viennent sajouter la liste des autres lments slectionnables dj rattachs au composantconteneur. LapropritvaluedunUISelectItemspeutcontenir:
q

UneuniqueinstancedelaclasseSelectItem Un tableau dinstances de la classe SelectItem. Les instances en question sont alors places dans lordre numriquecroissantoudanslordrealphabtique. UnecollectiondinstancesdelaclasseSelectItem Unecarte(instancedelaclasse Map).Chaquelmentdelacarteestutilispourcreruneinstancedela classeSelectItem.LacldellmentdecarteestidentifieaulabelduSelectItem,alorsquesavaleurest associelavaleurduSelectItem.

Attributscaractristiquesventuels : Famillelaquellelecomposantestrattach(getFamily()). UISelectMany CetteclassedrivedelaclasseUIInput. Cecomposantpermetlinternautederaliseruneslectionmultipleparmiunensembledevaleursprdfinies.Ce composantestgnralementrestituvisuellementselonlunedesdeuxformessuivantes:


q

Ungroupedecasescocher(instancelaclasseHtmlSelectManyCheckbox) Unezonedelistechoixmultiples(instancelaclasseHtmlSelectManyListbox).

UncomposantUISelectManypeuttreconfigurpourquecertainsdeslmentsquilcontientsoientprslectionns pardfaut. Attributscaractristiquesventuels : Listedeslmentsslectionns(mthodegetSelectedValues()). UISelectOne CetteclassedrivedelaclasseUIInput. Cecomposantestutilispourpermettrelaslectiondununiquelmentparmiunensembledevaleursprdfinies. Cecomposantestgnralementrestituvisuellementsouslaformedunezonedelistedroulantechoixunique, ousouslaformedungroupedeboutonsradio. UncomposantUISelectOnepeuttreconfigurpourquunlmentparticuliersoitprslectionnpardfaut.

- 4-

ENI Editions - All rigths reserved

LaclasseUISelectOneestdrivedeUIInput. Attributscaractristiquesventuels : Famillelaquellelecomposantestrattach(getFamily()). UIViewRoot Reprsentelaracinedelarbredecomposants.

2.Interfacesmisesenuvreparlescomposantsgraphiques
En complment du fait que les classes reprsentant les composants graphiques hritent de la classe UIComponentBase, ces classes implmentent une ou plusieurs interfaces charges de dfinir le comportement des composants graphiques visvis de certains vnements. Ces interfaces de comportement, toutes issues du packagejavax.faces.component,sontlessuivantes:
q

ActionSource : cette interface peut tre implmente par les composants susceptibles dtre la source dvnements de type javax.faces.event.ActionEvent. Les classes standards implmentant cette interface sontHtmlCommandButton,HtmlCommandLinketUICommand. ActionSource2:cetteinterfacetendlinterfaceActionSourceetfournitdoncdesfonctionnalitsidentiques. Ellepermetcependantauxcomposantsquilexploitentdutiliserlelangagedexpressionspourrfrencerles mthodeschargesdecapturerlesvnements. EditableValueHolder:cetteinterfacetendlinterfaceValueHolder(voircidessous).Elleproposedavantage de fonctionnalits comme la prise en charge de lvnement javax.faces.event.ValueChangeEvent et le supportdelavalidationdesdonnes(voirlasectionValidationdedonnesdecechapitre). StateHolder : cette interface permet au composant qui limplmente de conserver son tat entre les diffrentesrequtes. ValueHolder:lecomposantexploitantcetteinterfacemaintientunevaleurlocale,etsupportelaconversion entreletypeStringetletypedeladonneassocie,situedanslacouchemtierdelapplication.Pourplus dinformations sur la notion de conversion de donnes, voir la section Conversions de donnes de ce chapitre.

Lalistesuivantercapitulelenomdesinterfacesdecomportement,etprcisepourchacunedellesle(s)composant (s) graphique(s) qui limplmente(nt). Naturellement, les classes drives des classes de composants mentionnes exploitentgalementlesinterfacescorrespondantes. Nomdelinterface ActionSource,ActionSource2 EditableValueHolder NamingContainer StateHolder Classe(s)decomposant(s)implmentantlinterface UICommand UIInput,UISelectBoolean,UISelectMany,UISelectOne UIData,UIForm UIColumn,UICommand,UIData,UIForm,UIGraphic,UIInput, UIMessage,UIMessages,UIOutput,UIPanel,UISelectBoolean, UISelectItem,UISelectItems,UISelectMany,UISelectOne,UIViewRoot UIInput,UIOutput,UISelectBoolean,UISelectMany,UISelectOne

ValueHolder

Surunplanpurementorganisationnelpourlaconceptiondelapplicationweb,seulslesconcepteursdecomposants graphiques sont amens connatre/manipuler les diffrentes classes de composants et leurs interfaces. En loccurrence,ilnestpasncessairequecesdtailstechniquessoientconnusdudesignerweb,puisqueceluicipeut exploiter les diffrents composants graphiques en utilisant les balises des bibliothques Core et HTML qui leur correspondent.

ENI Editions - All rigths reserved

- 5-

Lagestiondurendu:notionderenderer
LaplupartdescomposantsgraphiquesJSFpeuventtrerestitusgraphiquementdediffrentesmanires,danslebut principal dassurer des affichages corrects quel que soit le type de terminal (ordinateur, tlphone mobile, etc.) accdant une page donne de lapplication. Pour un mme terminal cependant, la gestion du rendu peut tre exploite pour obtenir si ncessaire plusieurs reprsentations graphiques du mme composant. Par exemple, les composants de type UICommand peuvent tre proposs linternaute sous la forme dun simple bouton ou dun lien hypertexte. Ce paragraphe traite du fonctionnement de la gestion du rendu des composants graphiques. Il montre galement comment les designers web peuvent mettre en uvre lun ou lautre des modes de restitution par lutilisation de balisesadaptes.

1.Intrtdelagestiondurendu
Larchitecture de composants propose par la technologie Java Server Faces est constitue de telle sorte que le comportement et lapparence des composants ne sont pas grs ensemble. Comme cela a t prsent prcdemment, le comportement des composants graphiques est dcrit au sein de classes drives de la classe UIComponentBase. Lapparence des composants, quant elle, est prise en charge par la gestion du rendu. Cette sparationprsenteplusieursavantages,notamment:
q

Les dveloppeurs de composants graphiques peuvent dfinir le comportement des composants quils conoivent,etproposerpourceuxcidiffrentesfaonsdelesreprsenter.Ilestalorspossiblededisposer decomposantsdontlapparencepeuttreadapteauclientquilesaffiche(unnavigateurwebclassiquesur ordinateur,unnavigateuradaptauxtlphonesmobiles,parexemple). Lesdesignerswebpeuventrapidementchangerlapparenceducomposantsurunepagedonne,enutilisant unebalisequiassociedemanireapproprieuncomposantparticulieretunrenduspcifique.

2.KitderenduClassesderendu
Un kit de rendu dfinit comment les classes de composants doivent tre associes aux balises de composants, suivant le client qui les exploite. La technologie JSF inclut en standard un kit de rendu assurant la restitution des composantsgraphiquespourlesclientsHTML. Un kit de rendu comprend un ensemble de classes de rendu, pour chaque type de composant support. Chaque classederenduprciselamaniredontdoittrerestituuncomposantgraphiquespcifique,comptetenudutype declientmentionndanslekitderendu.titredillustration,uncomposantdetypeUISelectOnepeuttrerestitu detroisfaons:souslaformedunjeudeboutonsradio,souslaformedunezonedelistedroulante(combobox) ousouslaformedunezonedelistedroulanteavecascenseur. Chaque balise JSP dfinie dans le kit de rendu standard HTML comprend la fois les fonctionnalits du composant concern(dfiniesdanslaclassedrivedeUIComponentBasequiluicorrespond),etlesattributsderendu,prciss danslaclassederendu.

3.Bibliothquedebalisespourlerendudescomposants
Limplmentation JSF fournit en standard une bibliothque de balises destines la restitution des composants graphiquespourlesclientsHTML.IlsagitdelabibliothqueHTMLdjtraiteauchapitreComposantsgraphiques personnaliss,dontlespointsessentielssontrappelsici: Nomdebalise column Rle Restituecomme

Reprsenteunecolonnededonnesdans Unecolonneduntableau uncomposantdetypeUIData. HTML. Sertsoumettrelesdonnesdun formulaireweb. Unebalise<input>dont lattributtypepeutprendreles valeurssuivantes:submit, resetouimage. Prsentesouslaformedun

commandButton

ENI Editions - All rigths reserved

- 1-

bouton. commandLink Constitueunlienversuneressource interneouexternelapplicationweb. Sonutilisationprovoquelagnration dunjavax.faces.event.ActionEvent. dataTable Permetdereprsenteruntableaude donnes. Unebalise<table>.Ilsagit duntableauHTMLdontle contenupeutvoluer dynamiquement. Unebalise<a href>.

form

Reprsenteunformulairedesaisiedont Unebalise<form>. tousleslmentspermettent lutilisateurdesoumettredesinformations lapplicationweb. Afficheuneimagedanslenavigateur. Permetdintroduireunchampcachau seindunformulaireweb. Permetdeplacerunchampdemotde passedansunformulaire.Lescaractres saisisnesontpasvisualisables. Reprsenteunezonedesaisiedetype texte. Permetlinternautedesaisirunechane decaractresmultilignes. Afficheunmessagedanslenavigateur. Unebalise<img>. Unebalise<input>detype hidden. Unebalise<input>detype password.

graphicImage inputHidden

inputSecret

inputText

Unebalise<input>detype text. Unebalise<textarea>.

inputTextArea

message

Unebalise<span>dont lexploitationesteffective lorsquelesstylesCSSsont utiliss. Lemessageentantquetelest reprsentparunechanede caractres.

messages

Afficheplusieursmessagestextuelsdans lenavigateur.

Unensembledebalises<span> dontlexploitationesteffective lorsquelesstylesCSSsont utiliss. Lesmessagesentantquetels sontreprsentspardes chanesdecaractres.

outputFormat

Afficheunmessagedanslenavigateur.

Unesimplechanede caractres.

outputLabel

Reprsenteunlabelaffectunchampde Unebalise<label>. saisiespcifique. Constitueunlienversuneressource interneouexternelapplicationweb. ladiffrencedelabalisecommandLink, sonutilisationneprovoquepasla gnrationdun javax.faces.event.ActionEvent. Unebalise<a href>.

outputLink

outputText

Afficheunelignedetexte.

Unesimplechanede caractres.

- 2-

ENI Editions - All rigths reserved

panelGrid

Afficheuntableaudanslenavigateur.

Lassociationdesbalises <table>,<tr>et<td>. Unelignedetableau.

panelGroup

Sertregrouperauseindunconteneur unensembledautrescomposants. Permetlutilisateurdeslectionnerune valeurboolenne. Reprsenteunlmentparticulierdun ensembledlmentsdunezonedeliste (instancedelaclasseUISelectOne).

selectBooleanCheckbox

Unebalise<input>detype checkbox. Unebalise<option>.

selectItem

selectItems

Reprsenteunensembledlments Unensembledebalises appartenantunezonedeliste(instance <option>. delaclasseUISelectOne). Prsentelutilisateurunensemblede casescocher. Unensembledebalises <input>detypecheckbox.

selectManyCheckbox

selectManyListBox

Permetlutilisateurdefaireuneslection Unebalise<select>disposant multipleparmiunensembledlments. dunattributmultiple. Permetlutilisateurdefaireuneslection Unebalise<select>. uniqueparmiunensembledlments. Permetlutilisateurdefaireuneslection Unebalise<input>detype uniqueparmiunensembledlments. radio.

selectOneListbox

selectOneRadio

Le chapitre Exploitation des composants standards JSF traite de faon plus approfondie la restitution des composantsgraphiquesauseindespagesweb.Vouspourreznotammentytrouvertouteslesinformations ncessairesenvuedelintgrationdecomposantsJSFdanslespages.

ENI Editions - All rigths reserved

- 3-

Validationdedonnes
DanslatechnologieJavaServerFaces,lavalidationdesdonnessaisiesdansunformulaireestassurepardesobjets spcifiques, dnomms validateurs. Ces objets sont issus de classes implmentant linterface javax.faces.validator.Validator.

1.Principedefonctionnementdelavalidation
Pourexercersonrle,unvalidateurdoitobligatoirementtreassociuncomposantgraphiqueJSF.Aumomentde lasoumissionduformulaire,plusprcismentdanslaphaseProcessValidatorsducycledevie,lamthodevalidate ()duvalidateurestinvoque,danslebutdevaliderlavaleurmentionnedanslecomposantgraphiqueassoci. void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException Lasignaturedecettemthodeprsentetroisparamtres:
q

context,correspondantaucontextedelapplication component,identifiantlecomposantassociauvalidateur value,reprsentantlavaleurcontrler.

Lorsque la validation choue, la mthode validate() gnre une ValidatorException, laquelle est associ un messageexplicite,fournisouslaformedunobjetdetypejavax.faces.application.FacesMessage.Lagnrationde cetteexceptionapoureffetdinterrompreleprocessusdevalidationduformulaire:lemessagerattachlexception peutalorsventuellementtreprsentdanslapageweb,sicellecicontientunebalise<h:messages>ouunebalise <h:message>associaucomposantgraphiquecontrl.

2.Diffrentstypesdevalidateurs
Il existe plusieurs validateurs standards : ils permettent par exemple de contrler la longueur dune chane (LengthValidator), de vrifier quune valeur numrique est bien situe dans un intervalle prcis (DoubleRangeValidatorouLongRangeValidator).Lesprincipauxvalidateursstandardssontprsentsdanslechapitre ExploitationdescomposantsstandardsJSF. Ilestgalementpossibledecrersespropresvalidateurs,encrantuneclasseimplmentantlinterfaceValidator. CepointesttraitauchapitreConvertisseursetvalidateurs.

3.Exempledutilisationdunvalidateur
Danslecadredelapplicationillustrantcechapitre,ilestncessairedassocierunvalidateurauchamppermettantde saisirlenomdelapersonneinscrire.Ilfauteneffet,daprslescontraintesnonces,quecenomaitunnombre de caractres compris entre 5 et 100. Le validateur standard apte raliser ce type de contrle est un LengthValidator. Pour cela, le designer de la page web doit positionner une balise spcifique, issue de la bibliothque Core, correspondant ce composant JSF. Il sagitde <f:validateLength>,quiacceptedeuxattributsnomms minimumet maximum,bienvidemmentchargsdereprsenterlesnombresdecaractresminimauxetmaximaux. Pourassocierunvalidateuruncomposantgraphiqueparticulier,ilfautplacerlabalisequiluicorrespondentreles balises ouvrantes et fermantes du composant. Ainsi, pour associer unLengthValidator auUIInput reprsentant le champ de saisie Nom, la balise <f:validateLength> doit tre insre entre les balises <h:inputText> et </h:inputText>. Lesmodificationsapportesaucodesourcedelapagesontreprsentescidessous: <h:inputText id="itxtNom" required="true" > <f:validateLength minimum="5" maximum="100"></f:validateLength> </h:inputText>

ENI Editions - All rigths reserved

- 1-

Notez au passage lajout dun attribut required la balise <h:inputText>. Positionner celuici sur la valeur true revient rendre imprative la saisie dau moins un caractre dans le champ UIInput. La prsence de lattribut en question est ici ncessaire, dans la mesure o le LengthValidator ne prend pas en charge labsence de saisie, contrairementcequelonpourraitcroire.

- 2-

ENI Editions - All rigths reserved

Conversionsdedonnes
1.Pourquoiparlerdeconversiondedonnes?
LatechnologieJSFestconuepourpermettrelassociationentreuncomposantgraphiqueprsentsurlinterfaceweb, etunepropritdunobjetsituctserveur(unJavaBeanouunbeanmanag).LasectionLiaisondecomposants desbeansmanagsduchapitreExploitationdescomposantsstandardsJSFprsenteunemiseenapplicationde cetartificetechnologique. Lorsquecegenredassociationestmisen uvredansunprocessusdesaisie(parexemple,siunchampUIInputest associunepropritdebeanmanag),ilestimpratifquilyaitadquationentreletypedelavaleursaisiedans lecomposant,etceluidelapropritdubean.Demme,lorsquunetelleassociationestutilisedansunprocessus daffichage(parexemple,unchampUIOutputestliunepropritdebean),ilfautquelavaleurdelapropritsoit affichableendautrestermes,ilfautqueletypedelapropritdubeanmanagsoitcompatibleouconvertibleen String. Pourrespectercescontraintes,lanotiondeconversiondedonnesestmiseenapplication.Onditquuneconversion estraliseentrelavue ModleducomposantJSF,caractriseparletypedelapropritdubeanmanag,etla vuePrsentationdecemmecomposant,visiblesouslaformedunechanedecaractresdanslinterfaceweb. Il existe une autre situation dans laquelle les conversions de donnes peuvent tre mises en uvre. Dans ce cas particulier, il ny a pas ncessairement de liaison entre un composant graphique et une proprit de JavaBean, et lusagedelaconversionselimiteaucontrleduformatdelavaleursaisieparlutilisateurdanslechampdesaisie concern.Lexempleproposdanslecadredecechapitreillustrecetypedapplicationdelaconversiondedonnes (leformatdeladatedenaissancedoitimprativementtrejj/mm/aaaa).

2.Conversionsimplicitesetspcifiques
Danslaplupartdessituations,limplmentationJavaServerFacesassureuneconversionautomatiquequipermetde sassurer de la compatibilit des types de donnes. Cest le cas par exemple lorsque quune case cocher (composantJSFdetypeUISelectBoolean)estlieunepropritdebeanboolenne:uneconversionseffectuede maniretransparenteentreletypeStringetletypeboolean. Mais il est possible que la conversion ne soit pas ralisable automatiquement par JSF : cela se produit lorsquun composant graphique est li une proprit dont le type nest pas standard, ou lorsquil est ncessaire de contrler/modifierleformatdelavaleursaisie.Commelamiseen uvredelaconversionestimprative,leconcept deconvertisseurestintroduitparlatechnologieJSF.Ilpermetderaliseruneconversionspcifiquedelavaleurdu composantgraphiqueauquelilestassoci.

3.Convertisseursstandardsetconvertisseurspersonnaliss
Un convertisseur est un objet issu dune classe implmentant linterface javax.faces.convert.Converter. Cette interfaceprsentelesdeuxmthodessuivantes: Object getAsObject(FacesContext context, UIComponent component, String value) String getAsString(FacesContext context, UIComponent component, Object value) LamthodegetAsObjet()entreenjeudansunprocessusdesaisie:ellesertconvertirlavaleurdetypeString saisiedansuncomposantgraphiquesouslaformedunObject,compatibleaveclapropritdubeanmanagliau composant. La valeur convertie est stocke dans la proprit en question durant la phaseApply request values du cycledevie. LamthodegetAsString()effectueloprationinverse,permettantainsilaffichagedanslinterfacewebdelavaleur stocke dans la proprit dun JavaBean ou dun bean manag. Lexcution de cette mthode intervient durant la phaseRenderResponseducycledevie. Lorsquelaconversionchoue,cesmthodesdclenchentunejavax.faces.convert.ConverterException,provoquant ainsi linterruption du cycle de vie. Le motif de lchec de la conversion peut alors tre plac dans un javax.faces.application.FacesMessageenvuedtreprsentlinternaute.

ENI Editions - All rigths reserved

- 1-

JavaServerFacesproposebiensrdemanirestandardunensembledeconvertisseursdirectementutilisables.Ils sontrpartisendeuxcatgoriesprincipales:
q

Lesconvertisseursnumriques,adaptsauxsituationsfaisantnotammentintervenirdesInteger,desFloat, desLong,etc. Lesconvertisseursdedates,grceauxquelsilestpossibledeprendreenchargelaconversiondobjetsde typeStringenobjetsdetypeDate,selonunformatparticulier(parexemplejj/mm/aaaa).

Il est par ailleurs possible de crer des convertisseurs personnaliss, en dveloppant des classes implmentant linterface Converter. La personnalisation est alors assure par la surcharge du comportement par dfaut des mthodesgetAsString()etgetAsObject(). LesconvertisseursstandardssonttudisplusendtaildanslechapitreExploitationdescomposantsstandardsJSF, alorsqueledveloppementdeconvertisseurspersonnalissesttraitauchapitreConvertisseursetvalidateurs.

4.Exempledutilisationdunconvertisseur
Lexempleproposdanslecadredecechapitrefaitintervenirunconvertisseurauniveauduchampdesaisiedela date de naissance. Il faut en effet imposer linternaute le respect du format jj/mm/aaaa. Comme prcis prcdemment, il ne sagit pas ici dassurer une conversion entrant dans le cadre dune liaison entre le champ de saisie"Datedenaissance"etunventuelbeanmanag:lusagedelaconversionselimiteiciaucontrleduformat delachanesaisie. LeconvertisseurleplusappropripourraliserloprationdemandeestuncomposantdetypeDateTimeConverter pourlequelonspcifieleformatdedaterespectergrcelamthodesetPattern().Ledesignerdelapplication web,dontlemtiernelamnepasmanipulerlesclassesJava,peutfacilementmettreen uvrelutilisationdece convertisseur en utilisant la balise <f:convertDateTime> de la bibliothque Core, en prcisant une valeur adapte poursonattributpattern. Pourassocierceconvertisseurauchampdesaisiedeladatedenaissance,labalise<f:convertDateTime>doittre placeentrelesbalises<h:inputText>et</h:inputText>reprsentantlecomposantUIInputdeladate. Concrtement,lesmodificationsapporterdanslecodesourcesontlessuivantes: <h:inputText id="itxtDateNaissance" converterMessage="La date indique doit tre au format JJ/MM/AAAA" > <f:convertDateTime pattern="dd/MM/yyyy" /> </h:inputText> Danslecasolaconversionnepeuttreralise(formatnonrespectparlutilisateur),uneConverterExceptionest gnre.LemotifdelchecdeconversionestgnralementdisponiblesouslaformedunFacesMessage,maisilest ventuellement possible de surcharger simplement ce message si celuici ne convient pas (notamment lorsque la langue utilise pour le message nest pas la mme que celle employe au sein de linterface web). Pour cela, le designerwebajouteunattributconverterMessagelabalise<h:inputText>dontlavaleurcorrespondaumessage afficherencasderreurdeconversion.

- 2-

ENI Editions - All rigths reserved

Gestiondesvnements
LagestionvnementielleauseindesapplicationsJavaServerFacessappuiesurlutilisationdunensembledeclasses etdinterfacesspcifiquesdfiniesdanslepackagejavax.faces.event.

1.PrincipesmisenuvredanslagestionvnementielleavecJSF
La classe de base partir de laquelle sont dfinis les diffrents types dvnements estFacesEvent. Il sagit dune classe abstraite qui permet toutes ses classes drives de maintenir une rfrence sur lobjet lorigine de lvnement,ainsiquesurladescriptiondelvnementluimme. Pourquuneapplicationpuisseragirdesvnements,cellecidoitdisposerdeclassesimplmentantdescouteurs (listeners)etrfrencerceuxciauprsdescomposantssusceptiblesdegnrerlesvnements. Lorsquun utilisateur active un composant, en cliquant sur un bouton par exemple, un vnement particulier est dclench.cemoment,lapplicationJSFinvoquelamthodedelcouteurconupourprendreenchargelvnement enquestion.

2.Deuxtypesdvnementsexploitables
DeuxtypesdvnementspeuventactuellementtreexploitsauseindesapplicationsJSF:lesvnementsdetype actionetlesvnementsdetypevalue-change. Un vnement de type action survient lorsque linternaute active un composant graphique bas sur une classe implmentant linterface ActionSource. Parmi ces composants, on trouve les boutons et les hyperliens, tous deux basssurlaclasseUICommand. Unvnementdetypevalue-changesurvientlorsquelutilisateurchangelavaleurduncomposantgraphiquebassur laclasseUIInput.Celapeutcorrespondre,parexemple,laslectiondunecasecocher,lamodificationdutexte contenu dans une zone de texte. Les composants standards suivants sont en mesure de dclencher ce type dvnement :UIInput, UISelectOne,UISelectMany et UISelectBoolean. Notez que les vnementsvalue-change ne sontgnrsquesileprocessusdevalidationdelavaleurducomposantconcernsestralisavecsuccs.

3.Rledelaproprit"immediate"descomposantsgnrateursdvnements
Tous les composants graphiques qui viennent dtre cits, susceptibles dtre lorigine de la gnration dun vnement,disposentdune proprit nommeimmediate.Cettepropritpeuttrelueoumodifierespectivement parlappeldesmthodesisImmediate()etsetImmediate(). Suivantlavaleurdecetteproprit,lesvnementsdetypeactionpeuventtretraitsdurantlaphaseApplication phaseoudurantlaphaseApplyRequestValues.Lesvnementsdetypevalue-changesont,quanteux,traitssoit durantlaphaseProcessValidators,soitdurantlaphaseApplyRequestValues.

4.Ractionauxvnements
Il existe deux moyens exploitables pour que les composants positionns sur une page web puissent rpondre aux diffrentstypesdvnements:
q

Uncouteur,quiestunobjetissuduneclasseimplmentantlinterfacejavax.faces.event.FacesListener,ou lune de ses interfaces drives, est charg de capturer les vnements duntypeprcis.Cetcouteurdoit tre associ aux composants susceptibles de provoquer lvnement, par lajout dune balise <f:valueChangeListener> ou dune balise <f:actionListener> entre les balises dlimitant la dfinition des composantseuxmmes. AffecterunemthodeparticuliredunbeanmanagoudunJavaBeanlapriseenchargedesvnements. Lenomdelamthodeenquestionestconnudescomposantssusceptiblesdedclencherlesvnements,par lusagedattributsspcifiquesdanslesbalisesdfinissantlescomposants.

Deplusamplesrenseignementsconcernantlamiseen uvredelagestionvnementiellesontfournisdans le titre Association dcouteurs aux composants prsents dans la page du chapitre Exploitation des

ENI Editions - All rigths reserved

- 1-

composantsstandardsJSF.

- 2-

ENI Editions - All rigths reserved

Utilisationdemessages
1. Gnration des messages derreur issus des processus de validation ou de conversion
Il arrive quau moment la soumission dun formulaire web, la validation et/ou la conversion des donnes saisies chouent. Cela se produit par exemple lorsquune information ne respecte pas un format requis (chec de la conversion),oulorsquunevaleurnumriquesaisienefaitpaspartieduneplagedevaleursparticulire(checdela validation). Dans ces situations, les convertisseurs et/ou les validateurs associs aux composants graphiques gnrentuneexceptionayantpoureffetdinterromprelasoumissionduformulaire. Cesexceptions,detypeConverterExceptionouValidatorException,sechargentdemettredispositionunechane decaractreprcisantlemotifdelchecdelaconversionoudelavalidation.Cettechaneestutilisepourinstancier unobjetissudelaclassejavax.faces.application.FacesMessage.

2.Affichagedemessagesdanslinterfaceweb
Au moment du raffichage du formulaire web, le contenu dun FacesMessage a la possibilit dtre prsent lutilisateur.Pourcela,aucoursdelaconceptionduformulaire,ilestncessairedeplaceruncomposantgraphiquede type UIMessage et de lassocier un autre composant susceptible de provoquer un chec de validation ou de conversionaucoursdelasoumissionduformulaire.CetUIMessageauraalorspourrledeprsenterlecontenudes FacesMessageconcernantlecomposantgraphiqueauquelilestrattach. Ainsi, les lignes suivantes correspondent la mise en uvre des messages dans le code source du formulaire proposenillustrationdecechapitre: <h:message id="msgNom" for="itxtNom" style="color: #FF0000; background-color: #FFFF00"> </h:message> ... <h:message id="msgPrenom" for="itxtPrenom" style="color: #FF0000; background-color: #FFFF00"></h:message> ... <h:message id="msgDateNaissance" for="itxtDateNaissance" style="color: #FF0000; background-color: #FFFF00"></h:message> Chaque composant de type UIMessage est reprsent par une balise <h:message>, issue de la bibliothque HTML. Cettebalisedisposedunattributfordontlavaleurcorrespondlavaleurdelattributidducomposantgraphique associ. Par exemple, le message msgNom est associ au champ de type UIInput dont lidentifiantest itxtNom. chaque fois quun problme de conversion ou de validation survient propos de ce champ, le motif du problme pourratreprsentlutilisateurparlintermdiairedumessagemsgNom.

3.SurchargedesinformationscontenuesdanslesFacesMessage
LescomposantsgraphiquesdetypeUIMessageplacsauseindespageswebserventdoncprsenterlutilisateur lecontenudumessagestockdanslesventuelsFacesMessagegnrsaucoursdesprocessusdevalidationetde conversion.Ilarrivecependantquelecontenubrutdumessageenquestionneconviennepasenvuedunaffichage. Cest notamment le cas lorsque le message comporte des dtails techniques nintressant pas lutilisateur final de lapplicationweb,oulorsquelalangueutilisedanslemessagenestpaslammequecelleemployedanslereste dusite. Dans ces situations, il est possible de surcharger le message contenu dans le FacesMessage par un message plus adapt.Cenouveaumessagepeuttreprcisdemaniresimpleparledesignerdelinterfaceweb,enajoutantaux balisescorrespondantdescomposantsUIInputlundesattributssuivants:
q

converterMessage:utilispoursurchargerleserreursdeconversion. validatorMessage:utilispoursurchargerleserreursdevalidation. requiredMessage:utilispourprciserlemessageprsenterlorsquaucuneinformationnatfourniedans unchampobligatoire.Attention,pourquecetattributsoitprisencompte,ilfautquelabalisereprsentantle

ENI Editions - All rigths reserved

- 1-

composantdesaisiedisposegalementdunattributrequiredayantunevaleurgaletrue. Leslignescidessousprsententlesmodificationsapporteraucodesourceduformulaireproposenillustrationde cechapitre,pourmettreen uvrelasurchargedemessages. <h:inputText id="itxtNom" requiredMessage="Noubliez pas de fournir une valeur dans ce champ!" required="true"> ... </h:inputText> <h:inputText id="itxtDateNaissance" validatorMessage="La valeur fournie est invalide." converterMessage="La date indique doit tre au format JJ/MM/AAAA" requiredMessage="Veuillez fournir une valeur" required="true"> </h:inputText>

4.Lesgroupesdemessages
Il est galement possible dutiliser un unique composant graphique JSF charg dafficher sous forme de liste lensemble des messages derreurs gnrs lors de la soumission dun formulaire. Ce composant, de type javax.faces.component.UIMessages, nest alors pas spcifique dun champ de saisie particulier, au contraire des champsdetypeUIMessage.Ilprendenchargelatotalitdesmessagesderreursventuellementissusdesprocessus devalidationetdeconversiondesdonnessaisiesdansleformulaire. LusagedesUIMessagespeutnotammenttreintressantlorsquelaffichagedesmessagesderreursenregarddes champsdesaisieneprsentepasdavantages,oulorsquesurunplanpurementergonomique,ilestsouhaitableque les messages apparaissent toujours la mme position sur la page web (par exemple, toujours en haut du formulairedesaisie).Ilfauttoutefoisprendregardecequelesmessagesaffichersoientsuffisammentexplicites pourquelutilisateursoitcapablededterminerquelslmentsdeformulaireilsserapportent.Enloccurrence,il estsouhaitablequelelabeldeschampsenquestionsoitmentionndanslesmessages. Danslexempleillustrantcechapitre,ledesignerwebdelapplicationpeutinsreruncomposantdetypeUIMessages en positionnant sur la page une balise<h:messages>. Diffrents attributs peuvent tre ajouts cette balise, pour permettrenotammentdeprciserlestyleutiliserpourlaffichagedesmessages.Danslecodesourcecidessous,le groupedemessagesestprsentlinternauteenitalique,enmajuscules,avecunetailledecaractresde10pt.Le texteestcritenbleusurfondjaune. <f:view> <h:form id="formulaireInscription"> <table align="center"> ... <tr> <td colspan="3"> <h:messages id="groupeDeMessages" style="color: #0000FF; text-transform: uppercase; font-style: italic; font-size: 10px; background-color: #FFFF00; font-weight: bold" layout="table"> </h:messages> </td> </tr> </table> </h:form> </f:view>

5.Regroupementdescontenusdemessagesdansdesfichiersderessources
Pourgarantirunebonnecohrencedesmessagesderreursdlivrssurlensembledespagesduneapplicationweb, ilestfortementrecommanddedfinirdesmessagesderreurtypesauseindunfichiertexteparticulier.Ilestpar exemple souhaitable que le message prsent lutilisateur lorsquil oublie de fournir une valeur dans un champ obligatoiresoittoujourslemme,quelquesoitleformulairedelapplicationwebaffichlcran. DanslaterminologieJavaServerFaces,lefichiertextecontenantlesmessagestypesestunfichierderessources, dont le nom possde obligatoirement lextensionproperties et dont lexistence est prcise lapplication web au traversdufichierdeconfigurationfacesconfig.xml. Ainsi, dans lexemple illustrant le chapitre, il est possible de dfinir un fichier de ressources pour regrouper les messages types afficher lorsque lutilisateur omet de renseigner un champ requis, ou lorsquil saisit une valeur

- 2-

ENI Editions - All rigths reserved

incorrecte. Pour cela, les lignes inscriptionsMessages.properties:

suivantes

peuvent

tre

places

au

sein

dun fichier dnomm

valeurRequise=Veuillez fournir une valeur pour ce champ! valeurErronee=La valeur mentionne dans ce champ est incorrecte! Ladclarationdufichierderessourcesauprsdelapplicationwebsefaitdanslefichierfacesconfig.xmlparlajout deslignessuivantes: <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"> <application> <resource-bundle> <base-name> premierProjetJSF.inscriptionsMessages </base-name> <var>msgs</var> </resource-bundle> ... </application> ... </faces-config> LecontenudecefichierdeconfigurationindiquequunfichierderessourcesnomminscriptionsMessages.properties estdisponibledanslesousrpertoiresrc/premierProjetJSFdelapplicationweb.Ilprcisegalementquelefichier deressourcesenquestionpeuttrerfrencauseindespageswebparlusagedunevariablenommemsgs. Defait,silonveutexploiterlemessagetypeproposdanslefichierderessourcespourindiquerlutilisateurquila oublidesaisirunevaleurdanslechampUIInputcorrespondantladatedenaissance,lesmodificationssuivantes doiventtreapportesparledesignerwebaucodesourceduformulaire: <h:inputText id="itxtDateNaissance" validatorMessage="La valeur fournie est invalide." converterMessage="La date indique doit tre au format JJ/MM/AAAA" requiredMessage="#{msgs.valeurRequise}" required="true"> </h:inputText> Lutilisationdefichiersderessourcespourlesmessagesestgalementrequisedanslecadredelinternationalisation des applications web. Pour plus dinformations ce sujet, reportezvous au chapitre Composants graphiques personnalissdecetouvrage.

ENI Editions - All rigths reserved

- 3-

Dclarationetconfigurationdebeanmanags
Les applications Java Server Faces sont prvues pour permettre la gestion de beans sexcutant ct serveur. Ces beans peuvent tre exploits en association avec les composants graphiques prsents dans les formulaires web. Danscecas,ilssontqualifisdebeansmanags. Lutilitprincipaledecesbeansmanagssersumeauxactionssuivantes:
q

Validationdeladonnesaisiedansuncomposantgraphique. Priseenchargedesvnementsgnrsparuncomposant. Ralisation du traitement permettant de dfinir vers quelle page la navigation doit se poursuivre aprs la validationduformulaire.

Cesactionssontmisesen uvreautraversdemthodesdfiniesdanslebean. Ce paragraphe illustre la dclaration, la configuration et lutilisation dun bean manag, dans le cadre de lexemple dapplicationwebproposendbutdechapitre.

1.Crationduneclassedebeansexcutantctserveur
CommetouslesJavaBeans,unbeansexcutantctserveurdoitdisposerdunconstructeursansargument.Celuici doitncessairementtredclar,mmesisoncontenuestvide,demanirecequelebeanpuissetreinstanci parlapplicationweb:sonabsenceprovoqueuneerreurdexcution. Unbeanmanagdoitgalementdfinirautantdepropritsquedechampsdesaisieauquelilpeutpotentiellement treli.Cespropritsdoiventtredeporteprive,etdisposerdaccesseursenlectureetencriturepourrendre leuraccspossibledepuislespageswebdelapplication,oudepuisdautresbeansouclasses.Desurcrot,unbean manag peut proposer des mthodes charges de raliser des contrles ou actions spcifiques, comme cela vient dtre prcis plus haut. Naturellement, toute classe dj existante respectant ces conventions, applicables lensembledesJavaBeans,peuttreutiliseentantquebeanmanagduneapplicationwebJSF. Le code source cidessous prsente le contenu dune classe potentiellement utilisable en association avec le formulairewebproposendbutdechapitre.Cetteclasseprsentedespropritsprivesenmesuredestockerles valeurs saisies dans les diffrents champs du formulaire (nom, prnom, date de naissance, etc.), et expose des accesseurs publics utilisables pour lire ou modifier les proprits en question. Enfin, cette classe propose une mthode publique dnomme inscriptionRealisee() dont le rle peut tre dassurer une navigation dynamique danslapplicationweb(voirletitreNavigationentrelespagesdecechapitre).Laclassecidessousestbienconforme aux conventions applicables aux JavaBeans elle peut tre donc tre exploite en tant que bean manag dans lapplicationweb. package premierProjetJSF; import java.util.Date; public class private private private private private BeanInscription { String nom; String prenom; Date dateNaissance; String sexe; int nombreEnfants;

public BeanInscription() { //Constructeur par dfaut, obligatoire, //mme si son contenu est vide. } public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; }

ENI Editions - All rigths reserved

- 1-

public String getPrenom() { return prenom; } public void setPrenom(String prenom) { this.prenom = prenom; } public Date getDateNaissance() { return dateNaissance; } public void setDateNaissance(Date dateNaissance) { this.dateNaissance = dateNaissance; } public String getSexe() { return sexe; } public void setSexe(String sexe) { this.sexe = sexe; } public int getNombreEnfants() { return nombreEnfants; } public void setNombreEnfants(int nombreEnfants) { this.nombreEnfants = nombreEnfants; } public String inscriptionRealisee() { //Retourne une chane de caractres dont la valeur //peut tre utilise pour raliser de la navigation //dynamique via JSF. return "echecInscription"; } } Lorsquune proprit de bean manag est lie un composant graphique de formulaire web, son type doit tre primitif,moinsquelapplicationpuissedisposerdunconvertisseuradaptautypepersonnalisdelapropritdu bean. LaliaisondecomposantsgraphiquesdespropritsdebeansmanagsesttudieauchapitreExploitationdes composantsstandardsJSFunexempleplusapprofondidecrationdebeanpersonnalisestprsentauchapitre Convertisseursetvalidateursdecetouvrage.

2.Configurationdunbeanmanag
Unefoisquelaclassedfinissantlebeanmanagestconstitue,elledoittrerenduedisponiblelapplicationweb pourquecellecipuisselexploiter.Cetteactionsefaitautraversdufichierdeconfigurationfacesconfig.xml,dans lequelilestpossibledeprciser:
q

Lenomdelaclassecorrespondantaubeanmanag. Lenomdubeantelquilpourratreutilisdanslespagesdelapplicationweb. Laportedubean(page,sessionouapplication). Lesvaleurspardfautpotentiellementprisesparlespropritsdubeanaumomentdesoninitialisation.

Laclasse BeanInscription prsente cidessus peut ainsi tre mise la disposition de lapplicationwebaumoyen deslignessuivantes,insrerdanslefichierfacesconfig.xml: <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"

- 2-

ENI Editions - All rigths reserved

version="1.2"> ... <managed-bean> <managed-bean-name> beanInscription</managed-bean-name> <managed-bean-class> premierProjetJSF.BeanInscription</managed-bean-class> <managed-bean-scope> session</managed-bean-scope> <managed-property> <property-name> nom</property-name> <property-class> java.lang.String</property-class> <value> DUPOND</value> </managed-property> <managed-property> <property-name> prenom</property-name> <property-class> java.lang.String</property-class> <value> Jacques</value> </managed-property> <managed-property> <property-name> nombreEnfants</property-name> <property-class> int</property-class> <value> 0</value> </managed-property> <managed-property> <property-name> sexe</property-name> <property-class> java.lang.String</property-class> <value> masculin</value> </managed-property> </managed-bean> ... </faces-config>

3.Utilisationdulangagedexpressionspourexploiterlesbeansmanags
Ds lors que le fichier de configuration de lapplication web comporte des lments indiquant lutilisant de beans manags,ceuxcisontinstancisaumomentdulancementdelapplicationwebellemme.partirdumomentolun deux est utilis par une page web quelconque de lapplication, les ventuelles valeurs initiales des proprits du beansontappliquesetlebeanestpositionndanslaporteprvue. Dans lexemple propos cidessus, le bean manag nomm beanInscription est instanci partir de la classe BeanInscription au moment du lancement de lapplication web. Lorsquun premier internaute accde une page utilisantcebeanmanag,cedernierestplacdanslaportesession,etsespropritsnom,prenom,nombreEnfants etsexesontinitialisesaveclesvaleursprvuesdansfacesconfig.xml. Lorsque des composants graphiques JSF sont lis aux proprits de beans manags, ils peuvent facilement tre utiliss pour lire ou mettre jour ces proprits. Le designer web met en uvre cette possibilit en utilisant le langagedexpressioncommevaleurdecertainsattributsreprsentantlescomposantsgraphiques.Parexemple,pour quunchampUIOutputplacdansunepagewebpuisseafficherlecontenudelapropritprenomdubeanmanag beanInscription,labalisesuivantedoittreutilise: <h:outputText value="#{beanInscription.prenom}" /> Lavaleurdelattribut valuedecettebaliseexploitebienlelangagedexpression,grceauquelsontprcissentre lessquencesdecaractres#{et}lenomdubeanmanagetceluidelapropritrecherche.

ENI Editions - All rigths reserved

- 3-

Plus gnralement, le langage dexpression est utilis avec certains attributs des balises correspondant aux composantsgraphiques,lafoispourlireetmodifierlesvaleursdespropritsauxquellesilssontlis.Celangage peutgalementtreexploitpourinvoquerlesmthodesdebeansmanagsdanslebut:
q

Degrerlesvnementssurvenantauniveaudescomposantsgraphiques. Devaliderlesdonnesmentionnesdansleschampsdesaisie. Deconvertircesmmesdonnes.

Danslecodesourceprsentcidessous,lelangagedexpressionestutilisauseindelattributactiondelabalise <h:commandButton>. Il permet linvocationdelamthode inscriptionRealisee() du bean managbeanInscription, pourdterminerdynamiquementlecasdenavigationlorsdelasoumissionduformulaire. <h:commandButton id="cmdValider" value="Valider votre inscription" action="#{beanInscription.inscriptionRealisee}" ></h:commandButton>

- 4-

ENI Editions - All rigths reserved

Navigationentrelespages
Le modle de navigation propos par la technologie Java Server Faces est conu pour permettre aux architectes dapplications web de dfinir rapidement et facilement lordre de succession des pages visites. La souplesse de sa constitutiongarantitparailleurslapossibilitdemodifiersimplementlanavigationentrelespages,encasdvolution delalogiquemtierdelapplicationoudelastructuredusiteellemme.

1.Dfinitionderglesdenavigation
DanslaterminologieJSF,lanavigationestdfiniecommeunensemblederglesutilispourdterminerlapagequi doittreprsentelinternauteunefoisqueceluiciacliqusurunboutondeformulaireousurunlienhypertexte. Ces rgles sont prcises au sein du fichier de configuration des ressources de lapplication, facesconfig.xml, partirdunensembledlmentsXML. Ladmarcheadopterpourmettreen uvreleprocessusdenavigationJSFconsistedonctoutdaborddclarer danslefichierfacesconfig.xmllesdiffrentesrgles,pourlesquellessontnotammentprcisslecasdenavigation qui leur correspond, ainsi que les pages sources et cibles. Ces choix, raliss par larchitecte de lapplication web, doivent ensuite tre pris en compte par le designer web au moment de la conception des pages de lapplication. Celuicidoiteneffetexploiterconvenablementlescasdenavigationdanslesattributsactiondesboutonsetliens hypertextequilmetenplace. DeuxtypesdenavigationJSFsontcourammentdistingus:lanavigationsimple,danslaquellelescasdenavigation sont mentionns de manire statique au sein des pages web de lapplication, et la navigation dynamique, qui fait appelauxbeansmanags,chargsdegnrerdynamiquementlescasdenavigationcomptetenuducontexte.Quel quesoitletypedenavigation,ladfinitiondesrglesdenavigationresteidentique. Lecodesourcecidessous est un extrait du fichierfacesconfig.xml correspondant lapplicationwebillustrantce chapitre. <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"> ... <navigation-rule> <display-name> inscription</display-name> <from-view-id> /inscription.jsp</from-view-id> <navigation-case><from-outcome>succesInscription</from-outcome> <to-view-id> /confirmationInscription.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <display-name> inscription</display-name> <from-view-id> /inscription.jsp</from-view-id> <navigation-case><from-outcome> echecInscription</from-outcome> <to-view-id> /inscriptionImpossible.jsp</to-view-id> </navigation-case> </navigation-rule> ... </faces-config> Cecodesourceprsentedeuxrglesdenavigation,dfiniesgrceauxbalises<navigation-rule>.Pourchacunede cesrglessontprciseslesinformationssuivantes:
q

Le nom de la page web partir de laquelle linternaute provoquera la navigation : cette page source est mentionneparlintermdiairedelabalise<from-view-id>.

ENI Editions - All rigths reserved

- 1-

La description du cas de navigation, caractris par une balise <navigation-case> et deux balises enfants, <from-outcome>et<to-view-id>.Lapremiredecesdeuxbalisesenfantsencadreunechanedecaractres identifiant le nom du cas de navigation en tant que tel. Ce peut tre cette chane qui est recherche au moment o linternaute active un bouton ou un lien hypertexte, pour identifier la rgle de navigation exploiter.Ladeuximebaliseenfant,<to-view-id>,prciselenomdelapagewebverslaquellelanavigation estorienteencasdutilisationducasdenavigation.

Lechoixdelachanedecaractresidentifiantuncasdenavigationspcifique(balise<from-outcome>)peuttrefait librement.Ilexistecependantquelquesvaleurscommunmentutilisesdanslesapplicationsweb:
q

success:employlorsquetouteslesvrificationssontralisesavecsuccs. failure : employ lorsquune erreur au moins est identifie par le processus mtier charg de raliser les contrles(voirleparagrapheUtilisationdelanavigationdynamique).Lanavigationestalorsrenvoyevers unepagederreur. Logon : signifie que linternaute doit passer par une tape dauthentification avant de poursuivre la navigation:ilestrorientversunepagecomportantunformulairedauthentification. no results : utilis dans les cas o un processus de recherche (dans une base de donnes, par exemple) aboutituneabsencedersultats.Lanavigationestredirigeversleformulairederecherche.

Comptetenudecesexplications,lecodesourceprsentplushautmontrequelesdeuxrglesdenavigationsont applicablespartirduneuniquepagewebsourcenommeinscription.jsp.Lanavigationestrenduepossibledepuis cette page, soit par navigation simple, soit par navigation dynamique, vers la page confirmationInscription.jsp lorsque le cas de navigation succesInscription est utilis, ou vers la page inscriptionImpossible.jsp si le cas de navigationechecInscriptionestemploy. Pourcecasparticulier,deuxrglesdenavigationdistinctesonttdfinies,alorsquecellesciconcernentlamme pagewebsource.Dansunetellesituation,ilesttoutfaitpossibledenedfinirquuneseulergle,regroupantles deuxcasdenavigationvoqus,desortequelecodesourcesuivantsoitquivalentceluimontrprcdemment: <navigation-rule> <display-name> inscription</display-name> <from-view-id> /inscription.jsp</from-view-id> <navigation-case><from-outcome>succesInscription</from-outcome> <to-view-id> /confirmationInscription.jsp</to-view-id> </navigation-case> <navigation-case><from-outcome> echecInscription</from-outcome> <to-view-id> /inscriptionImpossible.jsp</to-view-id> </navigation-case> </navigation-rule> SouslenvironnementdedveloppementEclipse,cesdeuxcasdenavigationpeuventtrevisualissgraphiquement, commelemontrelafigurecidessous.

- 2-

ENI Editions - All rigths reserved

2.Utilisationdelanavigationsimple
Comme cela a t prcis plus haut, la navigation simple concerne les situations o les cas de navigation sont spcifis de manire statique au sein des pages web de lapplication. Pour cela, le designer web mentionne simplementlenomducasdenavigationexploitergrcelattributactiondescomposantsdetypeUICommandquil disposesurlinterface(boutons,lienshypertexte). Ainsi, dans lexemple propos pour ce chapitre, la page webinscription.jsp peut tre conue de telle faon que la navigationsorientesystmatiquementverslapageconfirmationInscription.jsp,encasdesoumissionduformulaire dinscription.Pourcela,ilestncessairedefaireappelaucasdenavigationsuccesInscription,dfinidanslefichier facesconfig.xml pour permettre la navigation de la premire page vers la seconde. Lattributaction de la balise <h:commandButton>reprsentantleboutondesoumissionduformulaireestdoncpositionnenconsquence: <h:commandButton id="cmdValider" value="Valider votre inscription" action="succesInscription"> </h:commandButton>

3.Utilisationdelanavigationdynamique
Mais il est courant que la navigation simple ne convienne pas, en particulier dans le cadre dapplications web vocationprofessionnelleoucommerciale.Biensouventeneffet,lanavigationestrenduedpendantedunensemble de facteurs lis au contexte dans lequel sinscrit le systme dinformation mis en place. La navigation peut par exemplevariersuivantleprofildelinternaute,enautorisantlavisualisationdecertainespages,touteninterdisant laccs dautres ressources. Pour permettre la conception de telles applications, Il est ncessaire de mettre en uvreleconceptdenavigationdynamique. AveclatechnologieJavaServerFaces,cetypedenavigationestrendupossibleparlexploitationdeJavaBeans,en partie chargs de gnrer dynamiquement la chane identifiant le cas de navigation adapt au contexte. Concrtement, cest une mthode spcifique de ces JavaBeans qui est identifie pour raliser les traitements ncessairesetrenvoyerlecasdenavigationattendu.Lestraitementsenquestionpeuventconsisterparexemple vrifierlesparamtresdauthentificationfournisparlinternauteeninterrogeantunebasededonnes.Comptetenu de la russite ou de lchec de lopration, deux chanes de caractres distinctes peuvent tre renvoyes par la mthode : ces chanes doivent bien entendu correspondre des cas de navigations prvus par larchitecte de lapplicationweb,demanirepouvoirtreexploitesefficacementdanslecadredunenavigationdynamique. Lexempleproposdanscechapitrepeuttoutfaittremisprofitpourillustrercetypedenavigation.Pluttque dorientersystmatiquementlanavigationdepuislapageinscription.jspverslapagesuccesInscription.jsp,comme cela a t vu dans le paragraphe prcdent, la navigation peut tre variable suivant les informations saisies par linternaute, ou suivant le contexte dapplication luimme. Il est par exemple possible denvisager le succs systmatique dune inscription (et donc la navigation vers succesInscription.jsp) dans tous les cas de figure, sauf lorsquelunedessituationssuivantesseprsente :
q

Lenommentionnnecorrespondpaslunedesvaleursautorises,spcifiesdansunetabledebasede donnes. Labasededonnespermettantdecontrlerlenomnestpasdisponible.

Danscescasparticuliers,lanavigationdoittreorienteverslapageinscriptionImpossible.jsp. Pour rendre possible une telle navigation, le bean manag dnomm BeanInscription (prsent au paragraphe CrationduneclassedebeansexcutantctserveurdelasectionDclarationetconfigurationdebeansmanags decechapitre)peuttreutilis.Endlguantlunedesesmthodeslaralisationdescontrlesrequisaumoment dunedemandedinscription,ilestpossibledegnrerdynamiquementlachanedecaractresidentifiantlecasde navigationutiliser,comptetenudursultatdescontrles.LamthodeinscriptionRealisee(),dontunepartiedu codesourceestprsentecidessous,estunexempledemthodeassigneauxcontrlesentreprendre. public String inscriptionRealisee() { //Retourne une chane de caractres dont la valeur //peut tre utilise pour raliser de la navigation dynamique //via JSF. String casNavigation="succesInscription"; if (!baseDeDonneesDisponible) casNavigation="echecInscription"; if (nomInvalide) casNavigation="echecInscription"; return casNavigation;

ENI Editions - All rigths reserved

- 3-

} Pour que cette mthode puisse tre invoque au moment de la soumission du formulaire dinscription, le designer web doit mentionner une expression de mthode adapte, en tant que valeur de lattribut action de la balise <h:commandButton>.CetteexpressiondemthodedoitfairerfrenceaubeanmanagdetypeBeanInscription,tel quilestdclarauseindufichierfacesconfig.xml,ainsiquaunomdelamthodechargederaliserlescontrles. <h:commandButton id="cmdValider" value="Valider votre inscription" action="#{beanInscription.inscriptionRealisee}" ></h:commandButton>

4. Rle des instances par dfaut de ActionListener et de NavigationHandler dans la navigationdynamique


Ilpeuttreintressantdesattarderplusprcismentsurlafaondontestgrletraitementdelanavigationparle modledenavigationJSF. Au moment o linternaute active un bouton ou un lien hypertexte au niveau de linterface, le composant correspondantgnreunvnementdetypeaction.Celuiciestalorsprisenchargeparlcouteurprvupardfaut parlimplmentationJSF:ilsagitduncouteurimplmentantlinterfacejavax.faces.event.ActionListener,dontle rleestdappelerlamthoderfrenceparlecomposantloriginedelvnement,puisdercuprerlarponse fournieparcettemthode,cestdireunechanedecaractrecorrespondantnormalementuncasdenavigation prvu. Linstance par dfaut de ActionListener transmet ensuite cette chane de caractre une instance de la classe javax.faces.application.NavigationHandler (il en existe une fournie par dfaut par limplmentation JSF). Ce NavigationHandlerslectionnealorslapagesuivanteafficher,enrecherchantunecorrespondanceentrelecasde navigation quil a reu de lActionListener et lensemble des rgles de navigation dfinies dans le fichier de configurationfacesconfig.xml. LorsqueleNavigationHandlertrouveunecorrespondancevalide,laphasederestitutiondelavuecommence,etla nouvellepageafficherestprsentelinternaute.

- 4-

ENI Editions - All rigths reserved

ArbredecomposantsetcycledeviedunepageJSF
CeparagrapheestdestinapporterdesinformationscomplmentairescellesdjfournieslasectionLecyclede vie phases multiples dune page JSF du chapitre Langage dvaluation dexpressions. Il prsente de plus amples dtailsconcernantlesdiffrentesphasesconstituantlecycledevieduneapplicationJavaServerFaces. Pour rappel, une page JSF diffre dune page JSP par le fait quelle est reprsente sous la forme dun arbre de composantsbasssurlaclassejavax.faces.component.UIComponentBase.DanslaterminologieJSF,larbreenquestion est appelvue. Au cours du cycle de vie dune page web limplmentation JSF construit la vue, tout en prenant en comptelestatsprcdentsdesdiffrentscomposants(encasderaffichagedelapage).Lorsquelinternautesoumet un formulaire, ou sil engage une action impliquant une volution de la navigation, deux tches principales sont assures:lavalidationdesdonnessaisiesdanslesdiffrentscomposantsgraphiques,etlaconversiondestypesde ces mmes donnes en types compatibles avec les proprits des Java Beans associs aux champs de saisie. Ces actions sont prises en charge de manire squentielle au cours du cycle de vie : leur traitement est rparti en diffrentesphasesdontledtailvousestprsentdanslasuitedecechapitre.

1.Lesdiffrentstypesderequtesetleurmodedepriseencharge
Les requtes assurant la navigation au sein de lapplication peuvent tre vues de deux faons diffrentes par limplmentation JSF : il sagit soit de requtes initiales, soit de requtes de retour, dites postback. Les premires correspondent aux situations o les internautes consultent une page pour la premire fois au cours dune mme session.Lessecondesserencontrentprincipalementlorsquelesinternautesvalidentdesformulairescontenusdans despagesweb,ellesmmesrsultantdelapriseenchargedunerequteinitiale.

a.LesobjetsFacesContextetFacesContextFactory
UnFacesContextestuntypedobjetissudelaclassejavax.faces.context.FacesContext.Ilestconupourcontenir touteslesinformationsrelativesunerequteJSFspcifique.Ilestassocilarequtedsledbutduprocessus de traitement par un appel de la mthode getFacesContext() sur linstance de la classe javax.faces.context.FacesContextFactory, obligatoirement disponible pour lapplication web. Le FacesContext est ensuitetransmissuccessivementdanschacunedesphasesducycledevie,pourytrepotentiellementmanipul.Il estnotammentutilis,commecelaatvuprcdemmentdansleprocessusdevalidationdesdonnessaisies.

b.Traitementdunerequteinitiale
SeuleslesphasesRestoreViewetRenderResponsesontmisesen uvrelorsdutraitementdunerequteinitiale.En effet, aucune action de lutilisateur nest prendre en compte dans cette situation, au contraire de ce qui est fait pourletraitementdesrequtespostback,pourlesquelleslatotalitdesphasesducycledevieestexploit. Lorsquun internaute clique sur bouton ou un lien hypertexte pointant vers une page JSF, lapplication web doit fournirunerponsecorrespondantlapageJSFdemande.Pourcela,ellecreunenouvellevue(unnouvelarbre decomposants)etlaplacedansuneinstancedelaclasseFacesContext. Une fois la vue place dans le FacesContext, lapplication web rcupre la rfrence des diffrents composants graphiques constituant la page. Dans le cas dunerequteinitiale,lapplication poursuit son action en appelant la mthoderenderResponse()delobjetFacesContext.Letraitementdelarequteestalorsdirectementtransmisla phaseRenderResponse,outrepassantlesautresphasesintermdiaires.

c.Traitementdesrequtesvisantdesressourcesexterneslapplication
Ilarriveparfoisquelapplicationdoiveprendreenchargeunerequtequineluiestpasdestine.Celaseproduit notammentlorsquelutilisateurtentedatteindreunautresiteweb,oulorsquunetentativedaccsunserviceweb est ralise. Dans ce cas, la mthode responseComplete() du FacesContext est invoque et la phase Render Responsenestpastraite.

2.Lesdiffrentesphasesducycledevie
La situation la plus courante est celle au cours de laquelle une action ralise sur un composant graphique JSF provoquelappelduneautrepageJSFdelapplication.Larequtecorrespondanteestalorscaptureparlapplication. ElleestensuiteassocieauFacesContext,puistransmisesuccessivementauxdiffrentesphasesducycledeviepour quelesventuellesvalidationsetconversionssoientralises.

ENI Editions - All rigths reserved

- 1-

a.LaphaseRestoreView
DsquunerequtedestinationdunepageJSFestmise,limplmentationJavaServerFacesactivelecycledevie delapageenquestionparlaphaseRestoreView. Au cours de cette phase, larbre de composants de la page est constitu. Chaque composant graphique se voit attribuer ses ventuels gestionnaires dvnements et validateurs, et larbre de composant est enfin sauvegard dans le FacesContext. Au sein de la page JSF, lensemble des composants, gestionnaires dvnements, convertisseursetvalidateurspeuventavoiraccsauFacesContext. Silarequteayantenclenchlecycledevieestunerequteinitiale,unenouvellevueestconstitueetlecyclede vieavancedirectementjusqulaphaseRenderResponse. Sinon, la requte est une requte postback et une vue correspondant la page demande existe dj. Limplmentation JSF restaure alors cette vue (do le nom de la phase) partir des informations dtat sauvegardesctclientet/ouctserveur. Concernant lexemple propos pour ce chapitre, la vue correspondant la pageinscriptions.jsp, dans laquelle se trouveleformulairedinscription,estconstitueduncomposantjavax.faces.component.UIViewRoot,faisantofficede racine pour larbre de composants. Le premier composant enfant de cette racine correspond au formulaire dinscription,reprsentparuncomposantdetypejavax.faces.component.UIForm.Cederniercomposantpossde sontourplusieurscomposantsenfants,unpourchacundeslmentsprsentsdansleformulaire.

b.LaphaseApplyRequestValues
lissue de la phase Restore View, larbre de composants correspondant la page demande est constitu ou restaur.Chacundescomposantsdecettevuercupredepuislachanederequtelanouvellevaleursusceptible de lui tre attribu. Cette opration se ralise au travers dun appel la mthode decode(), disponible dans la classeUIComponentBase,etdoncaccessibletouslescomposantsgraphiquesJSF.Lesnouvellesvaleurssontalors stockes localement dans les composants euxmmes, moins que le processus de conversion engag sur ces valeursprovoqueuneerreur.Danscederniercas,desmessagesderreurssontalorsconstitus,puisplacsdansle FacesContext.Chaquemessage,quicontientladescriptiondelerreuretlarfrenceducomposantencause,pourra parlasuitetrerestitulinternautedurantlaphaseRenderResponse,enmmetempsquelesautresventuels messagesderreursissusduprocessusdevalidationdesdonnes. Aucoursdecettephase,ilestpossiblequelexcutiondelamthodedelundescomposantsprovoquelappeldela mthoderenderResponse()duFacesContext.LecycledevievoluealorsdirectementverslaphaseRenderResponse. Si des vnements sont survenus durant la phase Apply Request Values, ceuxci sont transmis aux couteurs concerns. Par ailleurs, si certains des composants de larbre disposent dun attribut immediate positionn sur la valeur true, les processus de conversion, de validation, ainsi que les vnements associs sont traits immdiatement. Parailleurs,silapplicationJSFestameneengagerunenavigationversuneressourceexterne(autresiteweb, service web), ou si elle doit produire une page web ne comportant aucun composant JSF, alors la mthode responseComplete()duFacesContextpeuttreinvoque. lissuedecettephase,touslescomposantscontenusdanslavuepossdentleurnouvellevaleur.Lesmessages derreurs issus du processus de conversion, ainsi que les vnements ventuels, sont placs en attente de traitement.

c.LaphaseProcessValidations
Au cours de cette phase, tous les validateurs ventuellement affects aux composants de larbre sont pris en considration. Limplmentation JSF examine les attributs de composants dcrivant les rgles respecter pour la validation.Cesattributssontalorscomparsauxvaleursstockeslocalementdanslecomposant.Lacomparaison estassureparappeldelamthodevalidate()delaclasseUIInput. Lorsquecettecomparaison,pouruncomposantdonn,sesoldeparlamiseenvidencedunonrespectdelargle nonce,leprocessusdevalidationchoue.UnmessagederreurestalorsstockdansleFacesContextetlecycle devievoluedirectementverslaphaseRender Response:lapageestalorsrestituelinternaute,accompagne du(des)message(s)derreur. ToutcommepourlaphaseApplyRequestValues,silapplicationJSFestameneengagerunenavigationversune ressource externe (autre site web, service web) ou si elle doit produire une page web ne comportant aucun composantJSF,alorslamthoderesponseComplete()duFacesContextpeuttreinvoque. Danslecasparticulierdelexemplechoisipourillustrercechapitre,unvalidateurstandardestassociauchampde saisie du nom. Celuici est utilis pour vrifier que la longueur du nom est toujours comprise entre 5 et 100 caractres.Lorsquecettecontraintenestpasrespecte,uneerreurdevalidationsurvientdurantlaphaseProcess Validation.Lapagecontenantleformulaireestalorsrestituelinternaute,etlemessagederreurestprsentpar lintermdiairedescomposantsUIMessageouUIMessagesdisposssurlinterfaceweb.

- 2-

ENI Editions - All rigths reserved

d.LaphaseUpdateModelValues
Une fois que lensemble des donnes saisies dans les composants graphiques a t valid, limplmentation JSF parcourtnouveautouslescomposantsettentedaffecterleursvaleursauxpropritsdeJavaBeansauxquelsils sont lis. Si les valeurs en question ne peuvent pas tre converties dans un type compatible avec celui des propritsquileurcorrespondent,alorslecycledeviedelapagevoluedirectementverslaphaseRenderResponse. La page est alors de nouveau prsente linternaute. Les messages derreurs sont galement affichs si des composantsUIMessageouUIMessagessontprsents. Ce processus de mise jour des proprits des JavaBeans est concrtement assur par appel de la mthode updateModel() de chacun des composants graphiques issus de la classe UIInput. Il nest donc appliqu quaux lmentsdeformulairepermettantderaliserunesaisie. L encore, si lapplication JSF est amene engager une navigation vers une ressource externe (autre site web, service web), ou si elle doit produire une page web ne comportant aucun composant JSF, alors la mthode responseComplete()duFacesContextpeuttreinvoque. Sidesvnementssurviennentdurantcettephase,ceuxcisonttransmisauxcouteursconcerns.

e.LaphaseInvokeApplication
Cettephaseassurelapriseenchargedesvnementsdeniveauapplication,telsquelesclicssurlesboutonsou leslienshypertextes. Parexemple,danslillustrationproposepourcechapitre,leformulaireestenmesuredeprovoquerunvnement de niveau application. Celuici survient lorsque linternaute clique sur le bouton de soumission du formulaire. Le traitementdecetvnementestassurparlActionListenerassocilapplicationweb,quisechargedercuprer le cas de navigation mentionn dans lattribut action de la balise correspondant au bouton de soumission. LActionListener transmet ensuite ce cas dutilisation au NavigationHandler, afin de dterminer la rgle de navigationassocieaucasdenavigationspcifi.Lecontenudelargledenavigationainsiidentifieprciselenom de la page web afficher par la suite. Limplmentation JSF prend alors en compte la vue correspondant cette pagecible,etlecycledeviesepoursuitparlaphaseRenderResponse.

f.LaphaseRenderResponse
Ilsagitdelaphasefinaleducycledevie,aucoursdelaquellelaresponsabilitdelarestitutiondelapagedansle navigateur est transmise au conteneur JSP. Tous les composants contenus dans la vue sont restitus par ce conteneurdanslordredesbalisesrencontresdanslapage. Dans le cas dune requte postback, des erreurs ont pu tre dtectes durant les phases Apply Request Values, ProcessValidation,etUpdateModelValues.Lapageprsenteinitialementestrestituetellequellelutilisateurles messagesderreurssontaffichssidesbalises<h:message>ou<h:messages>sontprsentesdanslecodesourcede lapageweb.

ENI Editions - All rigths reserved

- 3-

Codesourcedelapplicationillustrantlechapitre
Pourclorecechapitre,voicilintgralitducodesourcecorrespondantlapageJSFcomportantleformulairedesaisie. ladiffrencedelaversionprsenteendbutdechapitre,cetteversioncomportetousleslmentsncessairesau bon fonctionnement de lapplication, notamment les validateurs et les convertisseurs. Elle est donc fournie ici dans lunique but de faciliter lanalyse de ce code source, aprs les multiples ajouts qui y ont t faits au cours de ce chapitre. <%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Formulaire dinscription</title> </head> <body> <f:view> <h:form id="formulaireInscription"> <table align="center"> <tr> <td colspan="3"><h:outputText value="Saisissez les paramtres suivants pour valider votre inscription:" style="color: #0000FF; text-decoration: underline"></h:outputText><br> <br> </td>

</tr> <tr> <td colspan="3"><h:messages id="groupeDeMessages" style="color: #0000FF; text-transform: uppercase; font-style: italic; font-size: 10px; background-color: #FFFF00; font-weight: bold" layout="table"></h:messages></td>

</tr> <tr> <td><h:outputText id="otxtNom" value="Nom*"> </h:outputText></td> <td><h:inputText id="itxtNom" requiredMessage="Noubliez pas de fournir une valeur dans ce champ!">

<f:validateLength minimum="5" maximum="100"> </f:validateLength> </h:inputText></td> <td><h:message id="msgNom" for="itxtNom" style="color: #FF0000; background-color: #FFFF00"> </h:message></td> </tr> <tr> <td><h:outputText id="otxtPrenom" value="Prnom"> </h:outputText></td> <td><h:inputText id="itxtPrenom" value="Prnom par dfaut"></h:inputText></td> <td><h:message id="msgPrenom" for="itxtPrenom" style="color: #FF0000; background-color: #FFFF00"> </h:message></td>
ENI Editions - All rigths reserved - 1-

</tr> <tr> <td><h:outputText id="otxtDateNaissance" value="Date de naissance*"> </h:outputText></td> <td><h:inputText id="itxtDateNaissance" validatorMessage="La valeur fournie est invalide." converterMessage="La date indique doit tre au format JJ/MM/AAAA" requiredMessage="#{msgs.valeurRequise}" required="true"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:inputText></td> <td><h:message id="msgDateNaissance" for="itxtDateNaissance" style="color: #FF0000; background-color: #FFFF00"> </h:message></td> </tr> <tr> <td><h:outputText id="otxtSexe" value="Sexe*"> </h:outputText></td> <td><h:selectOneRadio id="radioSx"> <f:selectItem id="sexeChoix1" itemLabel="Masculin" itemValue="Masc" /> <f:selectItem id="sexeChoix2" itemLabel="Fminin" itemValue="Fem" /> </h:selectOneRadio></td> <td><h:message id="msgSexe" for="radioSx" style="color: #FF0000; background-color: #FFFF00"> </h:message></td> </tr> <tr> <td><h:outputText id="otxtNombreEnfants" value="Nombre denfants"> </h:outputText></td> <td><h:selectOneListbox id="listeAge" size="1"> <f:selectItem id="itemZero" itemLabel="0" itemValue="0" /> <f:selectItem id="itemUn" itemLabel="1" itemValue="1" /> <f:selectItem id="itemDeux" itemLabel="2" itemValue="2" /> <f:selectItem id="itemTrois" itemLabel="3" itemValue="3" /> <f:selectItem id="itemQuatre" itemLabel="4" itemValue="4" /> <f:selectItem id="itemCinqPlus" itemLabel="5 et plus" itemValue="5" /> </h:selectOneListbox></td> <td></td> </tr> <tr> <td colspan="3" align="center"><h:commandButton id="cmdValider" value="Valider votre inscription" action= "#{beanInscription.inscriptionRealisee}"></h:commandButton></td>

</tr> </table>

</h:form> </f:view> </body> </html>

- 2-

ENI Editions - All rigths reserved

DescriptiondelenvironnementEclipsepourJSF
La prise en charge de la technologie Java Server Faces par lenvironnement Eclipse est facilite par lutilisation de diffrentesvues.CertainessontbienvidemmentcommunesauxautrestypesdeprojetssappuyantsurEclipse,mais dautres sont spcifiques JSF. Les principales vues concernent laffichage de la zone ddition, de lexplorateur de projets,delasortie,desserveursexploitsparlapplication,desproprits,etdelexplorateurdebasesdedonnes. Voiciundescriptifdechacunedelles:

1.Lazoneddition
Il sagit de la partie principale de lenvironnement de dveloppement. Son rle principal consiste prsenter lutilisateurlecontenudesdiversfichierslistsdanslexplorateurdeprojets,ainsiquluifaciliterlamisejourde cesfichiers. En loccurrence, cette zone est spcifiquement adapte la cration de pages JSP : elle permet en effet la prsentation de la page en mode code source ou en mode design, et propose une palette doutils autorisant le glissdposdobjetsdivers,telsquedeslmentsdeformulairesHTML,descomposantsJSP(balisestaglig,balises param,etc.),etbiensrdescomposantsJSF(zonesdesaisies,convertisseurs,validateurs,etc.).Laprvisualisation despagesJSPcresestgalementrenduepossibleparlutilisationdunongletspcifique. Enfin, la zone ddition a la particularit de faciliter laffichage et la mise jour du fichier de configuration des ressources des applications JSF, dnomm par dfaut facesconfig.xml, par le biais de formulaires de saisie particuliers.

a.ditiondunepageJSP
Lafiguresuivantedonneunaperudelazoneddition,aumomentdelaffichagedunepageJSP.

IlestpossiblequecetaffichagenesoitpasactivpardfautaumomentdelaffichagedespagesJSP.Dans cecas,seullecodesourcedelapageestvisualislcran.Pourobtenirlaffichageprsentcidessus,il estalorsncessairedindiquerEclipsequelditeurutiliserestleWebPageEditor:celasefaitsimplementen cliquantdroitsurlenomdufichierJSPdepuislexplorateurdeprojet,puisenslectionnantlesousmenuOpen WithWebPageEditor. Dans cette situation, la zone ddition est constitue de deux lignes. La premire prsente la zone daffichage proprement parler, ainsi que la palette doutils partir de laquelle il est possible de slectionner les objets positionnersurlapage.LasecondeligneexposelecodesourcedelapageJSPaffiche. Deux ongletsDesign etPreview sont galement visibles en bas de cette zone ddition : leur usage permet de basculerentrelesmodesdveloppementetprvisualisationdelapage. En mode ddition de pages JSP, la palette dobjets prsente un contenu spcifique, regroupant divers objets rpartis en une vingtaine de catgories distinctes. Parmi ces catgories, il en existe quatre qui intresseront particulirement les concepteurs dapplications web bases sur les technologies JSP/JSF : il sagit des catgories HTML,JSFHTML,JSFCoreetJSP.

ENI Editions - All rigths reserved

- 1-

CatgorieHTML Elle regroupe tous les objets correspondant aux lments de formulaires HTML (zones de textes, zones de listes droulantes,casescocher,etc.).Lutilisationdecesobjetsparglissdpospermetdeconcevoirrapidementdes sectionsdepageswebpurementstatiques,quinimpliquentlamiseen uvredaucundynamismeparticulier. CatgorieJSFHTML EllecontientdesobjetsfacilitantlintgrationdescomposantsgraphiquesJSFdanslespagesweb.Onyretrouve donclaplupartdescomposantssappuyantsurdesclassesdrivesdeUIComponentBase,parexempledesobjets detype UICommande,UIForm ouUIInput. Comme cela sera prsent plus en dtail dans la suite de ce chapitre, le glissdpos dun de ces objets sur la page web crer entrane la gnration automatique de la balise JSF correspondante, dans le code source de la page. Il sagit obligatoirement dune balise issue de la bibliothque HTML. CatgorieJSFCore Elle regroupe principalement les objets JSF qui peuvent tre associs aux composants graphiques lists dans la catgorie JSF HTML. Il sagit notamment des convertisseurs (objets implmentant linterface Converter), des validateurs (objets implmentant linterface Validator), et des couteurs (objets implmentant linterface FacesListener). Le fait de glisserdposer lun des objets de la catgorie JSF Core dans la page web crer entrane la gnration automatique de la balise JSF correspondante, dans le code source de la page. Il sagit obligatoirementdunebaliseissuedelabibliothqueCore. CatgorieJSP Elle regroupe des objets dont lexploitation permet une intgration plus aise des balises spcifiques la technologieJavaServerPages,commelesbalisescorrespondantdesdirectives,desredirections,lusagede JavaBeansoulintgrationdescriptlets.

b.ditiondufichierdeconfigurationdesressourcesdesapplicationsweb
OutrelaconceptiondespagesJSP,lazonedditionestgalementconuepourfaciliterlamisejourdufichierde configurationdesressourcesdesapplicationsweb.Endoublecliquantsurlenomdecefichier(engnralfaces config.xml) depuis lexplorateur de projets, diffrents formulaires de saisie sont proposs pour permettre la dfinition des rgles de navigation, la dclaration des beans manags et de leurs proprits, ainsi que la dclarationdediversautrescomposants,telsquelesconvertisseurs,lesvalidateursoulescouteurs.Biensr,il estgalementpossibledevisualiserdunseulcoupd il lensembleducodesourcedecefichierdeconfiguration desressources. Dfinitiondesrglesdenavigation Celleci se fait directement aprs la slection de longletNavigation Rule et se ralise exclusivement de manire graphique.

Lillustrationcidessusprsentelesrglesdenavigationvalablespouruneapplicationcomposedau moins trois pagesJSPdnommespremierePage.jsp,secondePage.jsp,ettroisiemePage.jsp. Pourmettrecesrglesenplace,ilfautdansunpremiertempsslectionnerloutilPagesitudanslapalette,puis intgrersuccessivementdanslazonedditionchacunedespagesconcernes,parlintermdiaire dunformulaire

- 2-

ENI Editions - All rigths reserved

proposparlenvironnementdedveloppement. Il faut ensuite, dans un second temps, prciser les diffrents cas de navigation en utilisant loutil Linkdisponible danslapalette.Uncasdenavigationparticuliersedfinitalorssimplementencliquantsuccessivementsurlapage source,puissurlapagecible.Lamentiondune valeur pour les attributsfrom-outcome etfrom-actionsefaitpar lintermdiairedelavueProperties.

UnclicsurlongletSourcedelazonedditionpermetdevisualiserlecodesourcedufichierdeconfiguration.Les casdenavigationprsentscidessuscorrespondentaucodesuivant: <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"> <navigation-rule> <display-name> premierePage</display-name> <from-view-id> /premierePage.jsp</from-view-id> <navigation-case> <from-outcome> UnVersDeux</from-outcome> <to-view-id> /secondePage.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <display-name> premierePage</display-name> <from-view-id> /premierePage.jsp</from-view-id> <navigation-case> <from-outcome> UnVersTrois</from-outcome> <to-view-id> /troisiemePage.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <display-name> troisiemePage</display-name> <from-view-id> /troisiemePage.jsp</from-view-id> <navigation-case> <from-outcome> TroisVersDeux</from-outcome> <to-view-id> /secondePage.jsp</to-view-id> </navigation-case> </navigation-rule> </faces-config>

ENI Editions - All rigths reserved

- 3-

Dclarationdesbeansmanagsetdeleursproprits Chaque bean manag intervenant dans le cadre dune application web doit tre dclar dans le fichier de configuration des ressources. La slection de longletManagedBean de la zone ddition permet de faciliter cette dmarche,parlaprsentationdeformulairesdesaisiespcifiques.

Larborescencesituesurlagauchedelazonedditionproposeunerpartitiondesbeansmanagssuivantleur porteauseindelapplication(session,request,applicationounone). Lorsquedesbeansmanagssontdjdisponiblesdanscettearborescence,laslectiondelundeux permet de visualiser lensemble de ses caractristiques sur la partie droite de la zone ddition : il est alors possible de modifier ou prciser le nom du bean luimme, sa porte, la classe qui lui correspond, ainsi que les valeurs initialementattribuessesproprits. La dclaration dun nouveau bean manag se fait galement trs simplement par le biais de cette interface, en prcisantlenomdubean,saclasseetsaporte.Ilestengnralprfrabledavoirpralablementcrlaclasse correspondantaunouveaubeanmanag,maiscelanestcependantpasindispensable:lacrationdecetteclasse peuteneffettrefaitelavole,aumomentmmedeladclarationdubeanmanag. Naturellement,toutemodificationapportedansladclarationdesbeansmanagsestimmdiatementrpercute danslecodesourcedelapplication,visibleparlaslectiondelongletSourcedelazoneddition. Dclarationdecomposantspersonnaliss La dmarche suivre est ici identique celle prsente pour la dclaration des beans manags. La slection de longlet Component de la zone ddition permet dafficher diffrents formulaires chargs de faciliter la dclaration desobjetspersonnalisssuivants:composantsgraphiques,convertisseurs,validateursetkitsderendus.

- 4-

ENI Editions - All rigths reserved

Aprs avoir slectionn le type de composant crer/modifier depuis larborescence situe gauche de la zone ddition,ilestpossibledechoisirlundescomposantsdjdclarspourenmodifierlescaractristiques,ouden dclarer un nouveau. Il est important de prciser ici que les classes correspondant aux nouveaux composants doiventimprativementexisterpralablementpourqueladclarationpuissetreralise. Parmilescaractristiquesquipeuventoudoiventtrementionnes,ontrouvelenomducomposantpersonnalis, sadescription,sonidentifiant,laclassequilecaractrise,etenfinlesattributsetpropritsquiluisontpropres. Dclarationdesautrestypesdecomposants CetteactionpeuttreentrepriseparlaslectiondelongletOthersdelazoneddition.Ellepermetdassurerla dclarationdesressourcesquinontpasencoretvoques,savoir,notamment:lescouteursetlesfichiers demessagespersonnaliss. Lemodededclarationdecesressourcessefaitsurlemmeprincipequecequiatvuprcdemment :slection dutypederessourcedclarer,puisprcision/modificationdespropritsquilecaractrisent(parexemple:nom declassepourlescouteursnomdefichierpourlesmessagespersonnaliss). Aperugnraldesressourcesdclares La rpartition de laffichage du contenu du fichier de configuration des ressources dans diffrents onglets peut potentiellement rendre sa lecture difficile. Il peut en effet tre intressant de visualiser de manire globale lensemble des ressources, en vue dune impression par exemple. La zone ddition propose de rpondre ce besoinparlaslectiondelongletOverview,quioffreunevuercapitulativedesressourcesdelapplication.

ENI Editions - All rigths reserved - 5-

2.Lavuedexplorationdeprojets
Ilsagitdunevuehabituellementrencontredanslesdiffrentstypesdeprojetssupportsparlenvironnementde dveloppement Eclipse. Elle permet de naviguer au sein des diffrents projets et daccder ainsi facilement aux multiplespagesJSPetclassesJavautilisesparlesapplicationswebencoursdecration. noter la prsence dun n ud darborescence correspondant aux serveurs dclars et utilisables par lenvironnement Eclipse. Son utilisation, qui permet daccder rapidement aux diffrents fichiers de configuration de cesserveurs,sefaitconjointementlaffichagedelafentredeproprits,ainsiquavecceluidelavueServerselle mme.

3.LavueOutline

- 6 ENI Editions - All rigths reserved

CettevueoffreunaperuarborescentdelapageJSPencoursddition.Lensembledescomposantsdisposssurla pageysontreprsents,quilsagissedecomposantsHTMLpurs,decomposantsgraphiquesJSFoudecomposants qui peuvent leur tre associs. Un clic sur lun des lments de cette arborescence provoque la slection du composantcorrespondantdanslazoneddition,etlaffichagedespropritsquilecaractrisentdanslafentrede proprits.

4.LavueServers
Lutilisation de cette vue permet de dclarer diffrents serveurs et moteurs de servlets, dans le but de les rendre directementexploitablesparEclipsesansquilsoitncessairedepasserpardesutilitairesannexes.

a.Adaptateursdeserveurs
OutreleclassiqueserveurHTTPdeApache,EclipseproposelagestiondeserveursspcifiquesJ2EEdisponibles gratuitement, tels que Tomcat, GlassFish et Sun Application Server. Lexploitation de produits payants est galementpropose,notammentcelledeIBMWebSphereetOracleOC4JServer.Ilestimportantdenoterquela listedeserveursgrablesparEclipsenestpasferme:ellepeuttrsfacilementtrecomplteparlinstallation dadaptateursspcifiquesrecherchssurleweb.LillustrationsuivantemontrelutilitairedEclipsechargdetrouver lesadaptateursdisponibles.CetutilitairesactivedepuislavueServers.

Naturellement,linstallationdunadaptateurspcifiquenedispensepasdelinstallationduserveurluimmedansle systmedexploitation.CettetapeobligatoiredoittreentrepriseindpendammentdelIDEEclipse.

b.Configurationdesserveurs
La vue Servers est galement conue pour faciliter la configuration des diffrents serveurs : une fois lun des serveurs slectionn, la zone ddition est mise jour pour en faire apparatre les multiples paramtres de configuration. Il est notamment possible de mentionner/modifier les ports TCP/IP utiliss par le service de publicationetderfrencerlesdiffrentesapplicationswebprisesenchargeparleserveurslectionn. titredillustration,limagecidessousprsentelapparencedelazonedditionpourlaconfigurationdunserveur
ENI Editions - All rigths reserved - 7-

sappuyant sur le moteur de servlets Apache Tomcat. La prsence dun onglet Modules permet de basculer vers laffichageetlagestiondesapplicationswebprisesencharge.

Eclipsepermetgalementlagestiondeplusieursserveurssappuyant sur le mme produit (par exemple, Apache Tomcat).Cesserveurspeuventalorsfonctionnerindpendammentlesunsdesautres,conditionquilnyaitpas deconflitsdanslesnumrosdeportsTCP/IPattribus.Ilspeuventexploiterdeslistesdapplicationswebdistinctes, toutcommedisposerduncertainnombredapplicationscommunes.

5.LavueProperties
Cette vue est classiquement charge de prsenter la ou les proprits de lun des lments slectionn dans lenvironnement de dveloppement. Par exemple, elle affiche les diverses informations concernant les fichiers ou dossiers exposs dans la vue dexploration de projets (chemin daccs complet, date de la dernire modification, taille,etc.). Dans le cadre de la cration dapplications web exploitant des composants JSF, cette vue est dune importance certaine,danslamesureoellefacilitegrandementlaffichageetlamisejourdespropritsdesdiverscomposants positionnssurlespages.

a.AffichagedespropritsdecomposantsdetypeHTMLouJSF
Pourcetypedecomposants,lavuePropertiesprsenteuneuniquegrilledesaisie,dnommeAttributes,partir de laquelle le concepteur de lapplication web a la possibilit de prciser rapidement les valeurs qui doivent tre attribuesauxdiffrentespropritsducomposantslectionn. Par exemple, pour un simple bouton reprsent par une balise HTML <input type=button>, la vue Properties exposelintgralitdesattributsdebalisedfinisparlanorme:ledveloppeurpeutdoncfacilementprciserles valeursdelattributname,mentionnerlecodeJavaScriptexcuterlorsdunclicsurlebouton,ouencoredfinirune imageassocieraummebouton.LimagecidessousmontrelecontenudelavuePropertiespourcecasdefigure spcifique. Bien sr, lutilisation de cette grille de saisie dispense le concepteur de modifier directement le code source de la pagewebpourprciserlavaleurdesattributs.

b.AffichagedespropritsdecomposantsissusdescatgoriesJSFCoreetJSFHTML
ConcernantletraitementdescomposantsJSFissusdescatgoriesJSFCoreetJSFHTMLdelapaletteddition,la

- 8-

ENI Editions - All rigths reserved

vuePropertiessefaitbeaucoupplusprcise.OutrelaprsentationdelagrilledesaisieAttributesquivientdtre voque, cette vue propose systmatiquement un formulaire de saisie spcifique au type de composant JSF slectionn dans la zone ddition. Ce formulaire est accessible par le biais dun onglet Quick Edit situ sur la gauchedelavueProperties. Les informations qui peuvent tre fournies grce ce formulaire dpendent bien entendu du type de composant JSF:ellespeuventnotammentconcernerlaprcisiondevalidateurs,deconvertisseursoudcouteursassocierau composantchoisi.LillustrationsuivantemontrelecontenudesinformationsaffichesdanslongletQuickEditpour uncomposantJSFdetypeInputText,auquelestassociunconvertisseurdetypeConvertDateTime.

6.LavueDataSourceExplorer
LadernirevuequipeutpotentiellementintresserleconcepteurdapplicationswebbasessurJSFestlavueData SourceExplorer.Commecertainesdesautresvuesquionttvoquesprcdemment,cellecinestpasspcifique cetypedeprojets:ellepeuttoutfaittreexploitedansdescontextescompltementdiffrents.Nanmoins, comptetenudelimportancedelutilisationdesbasesdedonnesdanslesprojetswebactuels,ilparatncessaire dvoquerlexistencedecettevuedanslecadredecetouvrage.

a.Accsauxbasesdedonnes
Le rle de la vue Data Source Explorer est de fournir au dveloppeur un moyen daccder rapidement aux diffrentesbasesdedonnesutilisablesparlapplicationweb.Cetoutildispensedepasserpardesoutilsannexes, tels que les logiciels clients dits par les fournisseurs de systmes de gestion de bases de donnes, et permet lexploitationdEclipsedanstoutesadimensiondenvironnementdedveloppementintgr. Lesprincipalesactionsquipeuventtreentreprisespartirdecettevuesontdesoprationsdegestion,telsque lajoutoulasuppressiondetables,limportoulexportdedonnes.Biensr,lesdonnesellesmmespeuventtre visualises en slectionnant la base, puis la table dont on veut connatre le contenu : les donnes sont alors prsentesdanslazoneddition.Ilestgalementpossibledemettrejourlesinformations,etmmedajouter denouveauxenregistrements.

ENI Editions - All rigths reserved

- 9-

b.Accsdautrestypesdesourcesdedonnes
Outre lexploitation des bases de donnes, la vue Data Source Explorer permet galement de faire appel dautressourcesdedonnes.Enloccurrence,lesfichiersplats(auformatCSV,parexemple)peuventtreprisen charge,demmequelesfichiersXMLetlessourcesdedonnesaccessiblesparWebServices.

- 10 -

ENI Editions - All rigths reserved

Ajoutdecomposantsgraphiquesunepage
Comme cela a t mentionn dans le paragraphe prcdent, lajout de composants graphiques JSF dans les pages websefaittrssimplement,parutilisationduglissdpos,depuislapalettedobjetsverslazoneddition. Au moment de lintgration dun composant dans une page, le code source de celleci est mis jour pour faire apparatre une balise spcifique au type de composant choisi : cest ce que lon appelle une balise de restitution. Il sagit,selonlecas,dunebaliseappartenantlabibliothqueHTMLoudunebaliserfrencedanslabibliothque Core.titredillustration,lintgrationduncomposantdetypeUICommandpeutprovoquerlajoutdelabalisesuivante danslecodesourcedelapageweb: <h:commandButton style="color: #FF0000" action="suite" value="Cliquez ici pour valider le formulaire" id="idValidation"> </h:commandButton> Dans ce cas particulier, le composant UICommand a t restitu par une balise <h:commandButton> de la bibliothque HTML,dontlapparencegraphiquecorrespondcelledunclassiqueboutondesoumissionHTML.Cettebaliseprsente plusieurs attributs qui, en gnral, servent prciser lapparence graphique du composant (couleurs, styles...) ou indiquerlesactionsquipeuventtreengageslorsdelutilisationdececomposant(parexemple,appeldunefonction JavaScriptaumomentdusurvolparlasourisutilisationduncasdenavigationparticulieraumomentduclic). Dune manire plus gnrale, il est important de noter que la plupart des balises correspondant aux composants graphiquesJSFpartagentunjeudattributscommuns.Cestlecasnotammentdelattributid,quiestdisponiblepour latotalitdescomposantsJSF.Saprsenceestdailleursmentionnedanslexemplecidessus,concernantlebouton de soumission. Mais ces balises proposent galement un jeu dattributs spcifiques, qui diffre suivant le type de composantgraphiquereprsent.Parexemple,labalisecorrespondantunboutondesoumissionexposeunattribut action qui lui est propre : cet attribut ne peut pas tre utilis pour dautres composants (champ de saisie, par exemple). Ce paragraphe a pour objectif de prsenter les diffrentes balises de restitution de composants JSF, en prcisant notammentlerledeleursprincipauxattributscommuns,etdemontrercommentseraliselintgrationdecesbalises danslespagesweb. SeulssonttraitsicilescomposantsJSFrestitusdanslapagepardesbalisesissuesdelabibliothqueHTML. IlsagitdoncuniquementdesobjetssetrouvantdanslacatgorieJSFHTMLdelapalette.Desinformations concernant les autres types de composants (convertisseurs, couteurs et validateurs) sont fournies dans les paragraphessuivantsdecechapitre.

1.Classesetbalisesderestitution
CepointfaitchocertainesinformationsdjdonnesdanslechapitreComposantsgraphiquespersonnalissde cet ouvrage. Il rappelle la liste des classes correspondant des composants graphiques JSF, indique pour chacun deuxlabalisederestitutionutiliserenvueduneprsentationdansunepageweb,etrappellelapparencevisuelle ducomposant. Le tableau cidessous prsente lensemble de ces informations, et mentionne, pour chaque composant, le nom de lobjet correspondant tel quil est prsent dans la palette Eclipse. Les composants sont classs ici en catgories, comptetenudeleurrlerespectif. Classe Balisederestitution Apparencevisuelle Nomdelobjet correspondant danslapalette (catgorieJSF HTML)

Catgorie:Composantsdetype"Texte" HtmlInputText <h:inputText> Zonedetextesurune seuleligne Zonedemotdepasse Champcach TextInput

HtmlInputSecret HtmlInputHidden HtmlInputTextArea

<h:inputSecret> <h:inputHidden> <h:inputTextarea>

SecretInput HiddenInput

Zonedetextemultilignes TextareaInput

ENI Editions - All rigths reserved

- 1-

HtmlOutputLabel

<h:outputLabel>

tiquetteassocieun autrecomposant Affichagedunensemble demessagesselonun formatspcifique

OutputLabel

HtmlOutputFormat

<h:outputFormat>

OutputFormat

HtmlOutputLink

<h:outputLink>

Hyperliendont Nonreprsent lutilisationneprovoque pasdvnementdetype ActionEvent (contrairementau composantdetype HtmlCommandLink) Textesimple.Peuttre associdautres composants,telsque HtmlCommandLink. OutputText

HtmlOutputText

<h:outputText>

HtmlSelectBooleanCheckbox

<h:selectBooleanCheckbox> Casecocher

SelectBoolean Checkbox SelectMany Checkbox

HtmlSelectManyCheckbox

<h:selectManyCheckbox>

Ensembledecases cocher

HtmlSelectOneMenu

<h:selectOneMenu>

Zonedelistedroulante SelectOneMenu choixunique Zonedelistechoix SelectManyMenu multiple(unseullment visible) Zonedelistechoix unique.Plusieurs lmentsvisibles. Zonedelistechoix multiples.Plusieurs lmentsvisibles. Boutonradio SelectOneListbox

HtmlSelectManyMenu

<h:selectManyMenu>

HtmlSelectOneListBox

<h:selectOneListbox>

HtmlSelectManyListBox

<h:selectManyListbox>

SelectManyListbox

HtmlSelectOneRadio

<h:selectOneRadio>

SelectOneRadio

Catgorie:composantsdetype"Commande" HtmlCommandButton HtmlCommandLink <h:commandButton> <h:commandLink> Bouton Hyperliendont lutilisationprovoquela gnrationdun vnementdetype ActionEvent. CommandButton CommandLink

Catgorie:composantsdetype"Tableaudedonnes" HtmlDataTable <h:dataTable> Tableaudedonnesde NlignesetMcolonnes Colonnedetableaude donnes. DataTable

HtmlColumn

<h:column>

Column

Catgorie:composantsde type"Prsentation"

- 2-

ENI Editions - All rigths reserved

HtmlPanelGrid

<h:panelGrid>

Grilledeprsentationde PanelGrid NlignesetMcolonnes Conteneurde composants PanelGroup

HtmlPanelGroup

<h:panelGroup>

Catgorie:composantsdetype"Messages" HtmlMessage <h:message> Texteaffichantles messagesderreur gnrsparlutilisation delundescomposants delapage. Texteaffichanttousles messages. Message

HtmlMessages

<h:messages>

Messages

Catgorie:composantdetype"Images" HtmlGraphicImage Catgorie:composantdetype "Formulaire" HtmlForm <h:form> Formulairedesaisie. Form <h:graphicImage> Image GraphicImage

2.Principauxattributsdebalisescommuns
Laconnaissancedurledechaqueattributestindispensablepourqueleconcepteurdunelapplicationwebpuisse utiliserefficacementlescomposantsJSFdontildispose. Il est possible de distinguer deux groupes dattributs communs : le premier concerne lensemble des attributs utilisablesparlatotalitdesbalisesderestitution.Lesecondselimiteauxattributsexclusivementapplicablesaux balisescorrespondantdescomposantsdestinslasaisiedinformation(zonesdetexte,casescocher,etc.).

a.Attributscommunslensembledesbalisesderestitution
Lesattributscommunslespluscourammentutilisssontbinding,id,immediate,rendered,styleetstyleClass. Lattributbinding Il permet de lier linstance du composant reprsent par la balise une proprit de bean manag. Cela permet notammentdemodifierparprogrammationlesattributsducomposantenquestion. Le code source cidessous correspond celui dun JavaBean extrmement simple : il ne possde quune seule propritdetypeUIInput,dnommechampEntree,quiluipermetdestockerlarfrencedunobjetdecetype. package premierProjetJSF; import javax.faces.component.UIInput; public class Liaison { UIInput champEntree; public UIInput getChampEntree() { return champEntree; } public void setChampEntree(UIInput champEntree) { this.champEntree = champEntree; } } Un tel JavaBean peut tre exploit en tant que bean manag dans une application web JSF, condition de le dclarerdanslefichierdeconfigurationdesressourcesdelapplication.Leslignessuivantescorrespondentune

ENI Editions - All rigths reserved

- 3-

telledclaration:lebeanestdnommliaisonilestdetypepremierProjetJSF.Liaisonetdisposedelaporte sessiondanslapplicationweb: <managed-bean> <managed-bean-name>liaison</managed-bean-name> <managed-bean-class>premierProjetJSF.Liaison</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> Touteslesconditionssontdoncruniespourraliseruneliaisonentreuneinstanceduncomposantgraphiquede lapplicationetlapropritchampEntreedubean liaison.Naturellement,letypeducomposantliernepeutpas trechoisilibrement:lapropritchampEntreetantdetypeUIInput,seulslescomposantsdecetype(restitus parunebalise<h:inputText>)sontligibles.VoiciunexempledecontenudepageJSPdanslequeluncomposant UIInputestlilapropritchampEntreedubeanliaison. <f:view><h:form> <h:inputText binding="#{liaison.champEntree}"></h:inputText> </h:form></f:view> Parcemcanisme,leJavaBeandisposedelarfrenceauchampdesaisie:ilpeutdoncenmodifierlesattributssi ncessaire. Lattributid Cet attribut permet de rfrencer le composant qui lutilise au sein de lapplication web. Il ne sagit pas dun caractre obligatoire, mais son absence empche la manipulation du composant concern par les autres composantsdelapage,oupardautresclasses. LexemplesuivantcorrespondlaprsenceduncomposantdetypeUIMessagesurunepageJSP.Cecomposantest restitusouslaformedunebalise<h:message>,dontlattributidprendicilavaleurmessageMotPasse: <h:message for="champMotPasse" id="messageMotPasse"> </h:message> Lattributrendered Cetattributdebalisepermetdeprcisersilecomposantdoittreprsentlinternauteousildoittrecach.La valeurdelattributrenderedestbienentenduunboolen,dontlavaleurpeuttrementionnedirectementoupar lintermdiairedune expression boolenne. Il est galement possible de prciser cette valeur grce lemploidu langagedexpressionspcifiqueJSF,dontlvaluationrenvoieunboolen. <h:outputText rendered="#{beanInscription.nom!=test}" value="texte affich"> </h:outputText> Danslexemplecidessus,laffichagedunchampdesortiedetypeUIOutputestcontrlgrcelattributrendered, dontlavaleurcorrespondlvaluationduneexpressionJSF.Letestassurparcetteexpressionconsistevrifier silapropritnomdunbeanmanagdnommbeanInscriptionpossdeunevaleurdiffrentedelachanetest. LesattributsstyleetstyleClass Cesdeuxattributsdebalisepermettentdespcifierlestyleappliqueraucomposantgraphique.Lattributstyle accepte une valeur correspondant la dfinition complte du style utiliser (prcision dune couleur, dun fond, dunepolice,etc.). <h:outputText binding="#{liaison.champLabel}" id="txtLabel1" value="Saisissez la quantit souhaite (entre 1 et 10):" rendered="true" style=color: #0000FF; font-style: italic; font-size: 12px; font-family: "Comic Sans MS", Sans-Serif; font-weight: bold > </h:outputText> Dans cet exemple, le champ de type UIOutput dnommtxtLabel1 permet dafficher un texte italique de couleur bleue,detaillegaledouzepixels.LapoliceutilisepourcetexteestComicSansMS.

- 4-

ENI Editions - All rigths reserved

b.Attributscommunsauxseulesbalisesderestitutioncorrespondantdeschampsdesaisie
DanslaspcificationJavaServerFaces,lescomposantsgraphiquesdestinslasaisiesontinstancispartirdela classe UIInput, ou de ses classes drives. Il existe actuellement onze classes drives de UIInput, auxquelles sont associes des balises de restitution HTML. Outre les attributs communs tous les types de balises de restitution, les balises restituant des composants de saisie dans les pages web partagent spcifiquement un ensembledattributscommunsdontvoiciunedescription: Attributconverter Cetattributpermetdespcifierleconvertisseurassociauchampdesaisie.Pourrappel,unconvertisseurestun objet charg de sassurer que la donne saisie dans le composant graphique est compatible avec la valeur attenduepourlapropritdubeanlaquelleestlilecomposant. Supposons par exemple que le fichier de configuration des ressources dune application web dispose de la rfrenceunconvertisseurpersonnalis,parlintermdiairedeslignesdecodesuivantes: <converter> <display-name> convertisseurPerso</display-name> <converter-id> convertisseurPersoID</converter-id> <converter-class> premierProjetJSF.MonConvertisseur</converter-class> </converter> Le convertisseur en question se nomme convertisseurPerso. Il est issu dune classe premierProjetJSF.MonConvertisseur implmentant linterface Converter et peut tre utilis par lensemble des pageswebdelapplicationJSFgrcesonidentifiantconvertisseurPersoID. Ainsi, ce convertisseur peut, par exemple, tre associ un champ de saisie de type HtmlInputText. Pour cela, lidentifiant du convertisseur est utilis comme valeur de lattribut converter de la balise <h:inputText> reprsentantlecomposant. <h:inputText id="txtPrenom" converter="convertisseurPersoID" rendered="true" required="true"> </h:inputText> AttributconverterMessage Ilindiquelecontenudumessageprsenterlinternautelorsquelaconversiondeladonnesaisiechoue. Dans lexemple suivant, un champ de type HtmlInputText dispose dun convertisseur standard issu de la classe DateTimeConverter. Ce convertisseur est utilis pour vrifier que la date mentionne dans le champ de saisie respecte bien un format particulier (par exemple : dd/MM/yyyy). Ce format est indiqu par lattribut pattern de la balise <f:convertDateTime> reprsentant le convertisseur. En cas de nonrespect du format de date attendu, le message mentionn par lattribut converterMessage de la balise correspondant au champ de saisie est gnr : celuicipeutventuellementtreprsentlinternaute,silapageprvoituneassociationentrelechampdesaisie etunobjetdetypeUIMessage.Cequiestlecasici. <h:inputText id="itxtDateNaissance" converterMessage="La date indique doit tre au format JJ/MM/AAAA" <f:convertDateTime pattern="dd/MM/yyyy" /> </h:inputText> <h:message id="msgDateNaissance" for="itxtDateNaissance" style="color: #FF0000; background-color: #FFFF00"> </h:message> Attributdir Cetattributsertprciserlesensdanslequeldoittreaffichlecomposantdesaisie.Ilpeutsagirdundfilement deladroiteverslagauche(lavaleurdelattributdirestalorsgalertl,pourrighttoleft),oudundfilementde lagaucheversladroite(lavaleurdelattributseraalorsgaleltr,pourlefttoright). Danslexemplesuivant,lasaisieralisedanslechamptxtCommentairesefaitdedroitegauche. <h:inputText id="txtCommentaire" d i r ="rtl"> </h:inputText>

ENI Editions - All rigths reserved

- 5-

Attributlabel Cetattributpermetdattribuerunetiquetteauchampdesaisie.Cettetiquettenestpasvisibleentantquetelle dansleformulaire,maiselleestutiliselorsquedesmessagesderreurconcernantlechampdesaisiesontgnrs. Celapermet,enparticulierlorsquunepagewebprsenteunformulairecomportantdenombreuxchampsdesaisie, didentifierrapidementetprcismentleschampslorigineduneerreur. Danslecodesourcesuivant,unezonedetextetxtQuantitepermetlutilisateurdesaisirunevaleurnumrique. Cette zone est associe un validateur, charg de vrifier systmatiquement que la valeur mentionne est bien compriseentre1et10.Encasderreur,unmessageadaptestprsentlutilisateurparlintermdiairedelobjet UIMessage associ la zone de saisie. Ce message fait spcifiquement mention de ltiquette correspondant au champlorigineduproblme,carlabalise<h:inputText>quilereprsentecomporteunattributlabelrenseign. <f:view><h:form> <h:outputText binding="#{liaison.champLabel}" id="txtLabel1" value="Saisissez la quantit souhaite (entre 1 et 10):" rendered="true" ></h:outputText> <br> <h:inputText label="Quantit souhaite" id="txtQuantite" immediate="false"> <f:validateDoubleRange minimum="1" maximum="10"> </f:validateDoubleRange> </h:inputText> <h:message for="txtQuantite" style="color: #FF0000"> </h:message> <br> <h:commandButton id="btnValidation" value="Enregistrer la quantit" immediate="true"> </h:commandButton> </h:form></f:view>

Attributrequired Cetattributpermetdespcifierquelasaisieestobligatoiredansunchampdesaisieparticulier.Lavaleurdecet attributestbienentenduunboolen. LexemplesuivantcorrespondlutilisationdunchampdesaisietxtCommentaire,danslequellutilisateurestforc defourniruneinformation:lattributrequireddelabalise<h:inputText>esteneffetpositionnsurlavaleurtrue. En cas de nonrespect de cette contrainte, un message adapt est renvoy linternaute par le biais de lobjet UIMessageassociauchampdesaisie. <f:view> <h:form> <h:outputText id="txtIntitule" value="Saisissez imprativement un commentaire:"></h:outputText> <br> <h:inputText id="txtCommentaire" label="Commentaire impratif" required="true"> </h:inputText> <h:message id="messageCommentaire" for="txtCommentaire"
- 6 ENI Editions - All rigths reserved

style="color: #FF0000; font-weight: bold"> </h:message> <br> <h:commandButton id="btnValidation" value="Validation du formulaire"> </h:commandButton> </h:form> </f:view> </html> AttributrequiredMessage Lorsquelasaisiedansunchampestrendueobligatoireparlaprsencedelattributdebaliserequired,unmessage pardfautestrenvoylutilisateurencasdenonrespectdelacontrainte.Ilestprobablequecemessagepar dfautneconviennepasdanscertainessituations,pouruneraisonquelconque(parexemple:linformationdlivre est trop prcise (ou au contraire, pas assez) la langue utilise pour le message nest pas la mme que celle utilisedanslerestedelapageweb). Il est alors possible dempcher laffichage du message propos par dfaut, grce lutilisation de lattribut de balise requiredMessage. La valeur fournie pour cet attribut sert alors de message derreur affich lorsque linternauteoubliedefourniruneinformationdansunchamprequis. Lexemple propos prcdemment pour lattribut required peut tre adapt en rajoutant un attribut requiredMessagelabalise<h:inputText>correspondantauchampdesaisie: <h:inputText id="txtCommentaire" label="Commentaire impratif" required="true" requiredMessage="Vous devez obligatoirement saisir une information dans ce champ!"> Attributvalidator Cet attribut sert identifier une mthode spcifique dun JavaBean, charge de faire toutes les vrifications requisesparrapportlavaleursaisiedansunchampparticulier. Lamthodeenquestiondoitimprativementtredetypevoidetaccepterlestroisargumentssuivants :
q

Un argument de type FacesContext permettant au JavaBean de dtenir une rfrence au contexte de lapplicationweb. UnargumentdetypeUIComponent,correspondantaucomposantJSFloriginedelademandedevalidation. Un argument de type Object, reprsentant la valeur du composant JSF lorigine de la demande de validation.

titredexemple,considronsunepagewebdanslaquellesetrouveunchampdesaisiedetypeHtmlInputText.On peut imaginer la mise en place dune validation triviale, destine sassurer que le texte saisi dans le champ contienneexactementdeuxoccurrencesdelalettreA.Pourrpondrecetteattente,ilestpossibledentreprendre successivementlestapessuivantes:
q

CrationdunJavaBeancontenantunemthodespcifiquementchargedelavalidation. DclarationduJavaBeandanslefichierdeconfigurationdesressources. Associationentrelecomposantgraphiquedontonveuttesterlavaleur,etlamthodedevalidation.

Conformment aux contraintes voques plus haut concernant la signature que doit respecter la mthode de validation,voicilecodesourcedunJavaBeancapablededterminerlenombredoccurrencesdelalettreAdansla chanereprsentantlavaleurduncomposantgraphique(quelquesoitsontype). package premierProjetJSF; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext;
ENI Editions - All rigths reserved - 7-

import javax.faces.validator.ValidatorException; public class BeanAttributValidator { private int nombreOccurences(char carac,String chaine) { //Retourne le nombre doccurences du caractre //"carac" dans la chane passe en second argument. int nbOccurences=0; for (int i=0;i<chaine.length();i++) { if (chaine.charAt(i)==carac) nbOccurences++; } return nbOccurences; }

public void checkName(FacesContext arg0, UIComponent arg1, Object arg2) throws ValidatorException { System.out.println("Composant demandant la validation: "+arg1.getId()); System.out.println("Valeur saisie dans le composant: "+arg2.toString()); String valeur=arg2.toString().toUpperCase(); int nombreDeA_requis=2; int nombreDeA=nombreOccurences(A, valeur); if (nombreDeA<nombreDeA_requis) throw new ValidatorException(new FacesMessage("Il manque "+(nombreDeA_requis-nombreDeA)+" caractre(s) A dans la chane saisie!")); if (nombreDeA>nombreDeA_requis) throw new ValidatorException(new FacesMessage("Il y a "+(nombreDeA-nombreDeA_requis)+" caractre(s) A en trop dans la chane saisie!")); } } Le code de ce JavaBean montre que la mthode pouvant faire office de mthode de validation se nomme checkName:elleprsenteeffectivementlestroisargumentsrequispourassurerunevalidation.Lecontenudecette mthode indique que si le nombre doccurrences de la lettre A est incorrect, alors une exception de type ValidatorExceptionestgnre.Lacrationdecetteexceptionsefaitobligatoirementenfournissantunmessage dcrivantlacausedelerreur:cemessageestunobjetdetypeFacesMessage. PourqueceJavaBeanpuissetreexploitdanslespagesdelapplicationweb,sonexistencedoittredclareau sein du fichier de configuration des ressources de lapplication. Les lignes suivantes peuvent correspondre une telledclaration: <managed-bean> <managed-bean-name> beanAttributValidator </managed-bean-name> <managed-bean-class> premierProjetJSF.BeanAttributValidator </managed-bean-class> <managed-bean-scope> session </managed-bean-scope> </managed-bean> Parcesmodificationsdanslefichierfacesconfig.xml,touteslespagesweblapplicationpeuventexploiterlebean de session nommbeanAttributValidator, instance de la classeBeanAttributValidator, et exploiter sa mthode checkNamepourraliserunevalidation. Voici pour finir le contenu dune page JSP contenant un champ de saisie de type HtmlInputText. Ce champ, reprsent par la balise <h:inputText>, est associ la mthode checkName de beanAttributValidator, grce lutilisationdelattributvalidator.

- 8-

ENI Editions - All rigths reserved

<f:view> <h:form> <h:outputText id="txtIntitule" value="Saisissez un commentaire comprenant 2 occurences de la lettre A:"> </h:outputText> <br> <h:inputText id="txtCommentaire" validator="#{beanAttributValidator.checkName}" label="Commentaire" required="true" requiredMessage="Vous devez obligatoirement saisir une information dans ce champ!"> </h:inputText> <h:message id="messageCommentaire" for="txtCommentaire" style="color: #FF0000; font-weight: bold"> </h:message> <br> <h:commandButton id="btnValidation" value="Validation du formulaire"> </h:commandButton> </h:form> </f:view> </html> LexcutiondecettepageJSPmontrebienlapriseenchargecorrectedelavalidationattendue:

Deplus,conformmentaucontenudelamthodecheckNamedelaclasseBeanAttributValidator, lidentifiantetla valeurducomposantpourlequellavalidationestdemandesontprsentsdanslavueConsoledEclipse:

AttributvalidatorMessage CetattributjoueunrlesimilaireceluidelattributrequiredMessage,maisilconcerneleprocessusdevalidation.Il permet au concepteur de pages web de prciser le message qui doit tre renvoy linternaute lors de lchec dune validation. Ce message vient en remplacement de celui qui est gnr par le composant ou la mthode chargdassurerlavalidation. Dans lexemple qui vient dtre voqu propos de lattribut validator, le message renvoy par la mthode checkName peut tre ignor par laffectation dun attribut validatorMessage la balise reprsentant le champ de saisiedanslapageJSP: <h:inputText

ENI Editions - All rigths reserved

- 9-

id="txtCommentaire" validatorMessage="Le commentaire ne respecte pas la contrainte nonce!" validator="#{beanAttributValidator.checkName}" label="Commentaire" required="true" requiredMessage="Vous devez obligatoirement saisir une information dans ce champ!"> AttributvalueChangeListener Cet attribut permet de mentionner le nom dune mthode de JavaBean qui doit tre excute ds quun changementintervientauniveaudelavaleurduncomposant. Defaonsimilairecequiatvuconcernantlattributvalidator,unemthodecapabledeprendreenchargece typedvnementdoitrespecterunesignatureparticulire.Enloccurrence,lamthodeenquestiondoit:
q

tredetypevoid. PrsenterunargumentdetypeValueChangeEvent.

Le concepteur de lapplication web doit dvelopper le JavaBean contenant la mthode voque, dclarer ce JavaBean dans le fichier de configuration des ressources de lapplication et faire appel la mthode depuis un composant graphique positionn dans une page JSP. Cet appel de mthode se fait par le biais de lattribut valueChangeListenerdelabalisequireprsentelecomposant. titredillustration,voicilecodesourcedunJavaBeancomportantunemthodemodificationContenupouvantfaire officedcouteurpourlesvnementsdetypeValueChangeEvent.Lorsquuntelvnementsurvient,lamthodeen question rcupre la rfrence du composant qui en est la source, puis incrmente un compteur permettant de connatre le nombre de fois que lvnement est survenu. La valeur de ce compteur est enfin affiche dans la console. package premierProjetJSF; import javax.faces.component.UIComponent; import javax.faces.event.ValueChangeEvent; public class BeanAttributValueChangeListener { private int compteur; public BeanAttributValueChangeListener() { compteur=0; } public void modificationContenu(ValueChangeEvent evenement) { UIComponent composant=evenement.getComponent(); compteur++; System.out.println("Dj "+compteur+" modification(s) de la valeur du composant "+composant.getId()); } } CeJavaBeandoitensuitetredclardanslefichierdeconfigurationdesressourcespourpouvoirtreexploitpar le reste de lapplication web. Les lignes suivantes montrent la dclaration dun bean de session dnomm beanAttributValueChangeListenerbassurlaclasseBeanAttributValueChangeListener. <managed-bean> <managed-bean-name> beanAttributValueChangeListener</managed-bean-name> <managed-bean-class> premierProjetJSF.BeanAttributValueChangeListener </managed-bean-class> <managed-bean-scope> session</managed-bean-scope> </managed-bean> La capture des vnements de type ValueChangeEvent par la mthode modificationContenu peut dsormais tre assure.UncomposantgraphiquesitusurunepageJSFpeutdoncfairelobjetdecettecapture:labalisequile

- 10 -

ENI Editions - All rigths reserved

reprsente doit contenir un attribut valueChangeListener dont la valeur vaut {beanAttributValueChangeListener.modificationContenu}.Lecodesuivantenestuneillustrationpossible: <h:inputText id="txtCommentaire" valueChangeListener = "#{beanAttributValueChangeListener. modificationContenu}" label="Commentaire" required="true" requiredMessage="Vous devez obligatoirement saisir une information dans ce champ!" >

3.IntgrationdescomposantsgraphiquesdanslespagesJSP
Aprs avoir abord les diffrents attributs partags par lensemble des balises de restitution, et ceux partags uniquement entre les balises de restitution des composants de saisie, voyons maintenant comment intgrer concrtementlesprincipauxcomposantsgraphiquesdanslespagesJSP. Pour cela, nous pouvons nous appuyer sur la mise en place dun formulaire web comprenant les composants graphiqueslespluscourammentutiliss,etdtaillerpaspaslestapesderalisation.Lafiguresuivanteillustrele rsultatobtenir:

a.Intgrationducomposantcorrespondantauformulairedesaisie
Aprs avoir cr la page JSP dans laquelle les diffrents composants seront positionns, il faut immdiatement placerlabalisederestitutioncorrespondantauformulairedesaisie.Lesbalisesdesautrescomposantsgraphiques serontparlasuiteobligatoirementencadresparlabaliseduformulaire. Parunsimpleglissdposdepuislapalette,lobjetFormestpositionndanslazoneddition.Onconstateque lenvironnement a automatiquement insr le formulaire au sein dun couple de balises <f:view> </f:view>. Au besoin,depuislavueProperties,ilestpossibledeprcisercertainsattributsduformulaire. <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Mieux vous connatre</title> </head> <body>

ENI Editions - All rigths reserved

- 11 -

<f:view> <h:form></h:form> </f:view></body> </html>

b.Intgrationdunegrilledeprsentation
Pourquelaprsentationduformulairedesaisiesoitassezesthtique,ilestncessairederpartirlesdiffrents composants graphiques dans un conteneur tabulaire. En loccurrence, compte tenu de lapparence qui doit tre donneceformulaire,ceconteneurpourratreconstituparlutilisationdelobjetPanel Griddelapalette.Au moment o celuici est dpos sur la zone ddition, il se prsente sous la forme dun tableau de deux lignes et deuxcolonnes.Sidautrescolonnesdoiventtrerajoutes,ilfautmodifierlavaleurdelaproprit columnsdela balise<h:panelGrid>. Pardfaut,chaquecelluledutableaucontientunobjetdetypeHtmlOutputText:ceuxcipeuventtrebienentendu supprims. <h:panelGrid border="1" columns="2"> <h:outputText value="item1"></h:outputText> <h:outputText value="item2"></h:outputText> <h:outputText value="item3"></h:outputText> <h:outputText value="item4"></h:outputText> </h:panelGrid> Pour constituer le reste du formulaire de saisie, chacun des composants graphiques devra tre dpos dans la celluleadaptedelagrilledeprsentation. Les cellules de lobjetHtmlPanelGrid ne peuvent contenir quun seul composant graphique : il nestdonc paspossible,deprimeabord,dedisposerdanslammecelluleunezonedetexteetltiquettequiluiest associe(parexemple).Pourraliserunetelleopration,ilestindispensabledefaireusagedunconteneurde typeHtmlPanelGroupdanslequellescomposantsenquestionserontplacs.

c.Intgrationduntextesimpleetdunezonedetexteligneunique

On slectionne successivement les objets Output Text et Text Input depuis la palette, pour les positionner correctementdanslazoneddition.LutilisationdelavuePropertiespermetdeprcisercertainsattributs,telsque id,valueetstyle. <h:outputText id="otxtNom" value="Vos nom et prnom:" style="color: #0080FF; font-weight: bold"> </h:outputText> <h:inputText id="txtNom"></h:inputText>

d.Intgrationdunezonedemotdepasseetdunmessage

Ilfauticipositionnerlesdeuxcomposantsetassocierlemessagelazonedemotdepasse.Celapermettraparla suitedentreprendreuntestdevalidationconcernantlemotdepasse,etdafficherunmessagederreuradapten casdchecdelavalidation(pourcausedemotdepassetropcourt,parexemple). Laralisationdunteltestdevalidationrequiertgalementlassociationdelazonedemotdepasseavec unvalidateurstandard,ouavecunvalidateurpersonnalis.Cepointnestpastraitici,danslamesureo lon se limite lajout des composants la page web. Pour obtenir des dtails sur lassociation entre un composantetunvalidateur,voyezletitreExploitationdesvalidateursstandardsdecechapitre. Linsertion des composants se fait par lutilisation des objetsSecret Input et Message de la palette. Cependant,

- 12 -

ENI Editions - All rigths reserved

pour les insrer ensemble dans la mme cellule de la grille de prsentation, il faut pralablement positionner un conteneur Panel Group dans la cellule en question. Les deux composants doivent ensuite tre successivement glisss/dpossdansceconteneur. Ilestimpratifdedonnerunevaleurlattributiddelabalisecorrespondantauchampdemotdepasse,defaon permettresonassociationaveclemessage.Labalisederestitutiondumessagedoit,quantelle,comporterun attributfordontlavaleurestidentiquecelledelattributiddelazonedemotdepasse. Pourimposerlinternautedesaisirunmotdepasse,ilfautdonnerlavaleurtruelattributrequireddelabalise <h:inputSecret>. Si lon souhaite quun message derreuradaptsoitprsentlorsquecettesituationsurvient,il estpossiblederenseignerlattributrequiredMessagedelammebalise. Un message derreur afficher en cas dchec de validation peut galement tre spcifi grce lattribut validatorMessageduchampdemotdepasse.Attention,danscecas,lemessagederreurventuellementgnr dynamiquementparunautrebiaisnepourrajamaistreaffich.VoirletitreAjoutdecomposantsgraphiquesune page Principaux attributs de balises communs cidessus, concernant lattribut validatorMessage, pour plus dexplications. <h:outputText style="color: #0080FF; font-weight: bold" id="otxtMotDePasse" value="Votre mot de passe:"> </h:outputText> <h:panelGroup id="idPanel1"> <h:inputSecret id="txtMotDePasse"validatorMessage="Le mot de passe ne comporte pas assez de caractres!" required="true" requiredMessage="Vous devez saisir un mot de passe!"> </h:inputSecret> <h:message id="messageMotDePasse" for="txtMotDePasse" style="color: #FF0000; font-weight: bold"> </h:message> </h:panelGroup>

e.Intgrationdeboutonsradios
Linsertion de boutons radios dans une page web se fait par le biais de lobjet Select On Radio de la palette Eclipse. Un groupe de boutons radios permet lutilisateur de manifester un choix unique parmi un ensemble de propositions.Pourconstitueruntelgroupe,ilsuffitderaliserununiqueglissdposdelobjetSelect One Radio sur la page web. La dfinition des diffrentes propositions se fait trs simplement depuis la vue Properties, qui prsenteunerubriqueChoicespermettantderajouterlesitems.Cesitemssontrestitussouslaformedebalises <f:selectItem>.

Unefoisquechacundesitemsatdclar,ilfautimprativementenafficherlespropritsdemanireprciser le label (attribut itemLabel) et la valeur (attribut itemValue) qui leur correspondent. Il est galement fortement recommanddefixerunevaleurpourleurpropreattributid. Ladispositiondesdiffrentespropositions,enligneouencolonne,peuttreprciseaumoyendelattributlayout de la balise de restitution de lobjet de type HtmlSelectOneRadio. Les diffrentes valeurs autorises sont

ENI Editions - All rigths reserved

- 13 -

mentionnesdanslavueProperties. <h:outputText id="otxtGenre" value="Vous tes:" style="color: #0080FF; font-weight: bold"> </h:outputText> <h:selectOneRadio id="radioGenre" layout="lineDirection"> <f:selectItem id="idGenre1" itemLabel="Un homme" itemValue="masculin"/> <f:selectItem id="idGenre2" itemLabel="Une femme" itemValue="feminin"/> </h:selectOneRadio>

f.Intgrationdunezonedelistedroulantechoixunique
La dmarche suivre ici est identique celle qui vient dtre vue pour linsertion de boutons radios. On dpose lobjetSelect One Menusurlazoneddition,aprslavoirslectionndanslapalette.LavuePropertiesspcifique cetobjetprsenteunerubriqueChoicesquilconvientrempliraveclesdiffrentschoixproposableslutilisateur. chaque choix correspond une balise <f:selectItem>, pour laquelle il faut prciser les attributs id,itemLabel et itemValue. <h:selectOneMenu id="selectEnfants"> <f:selectItem id="itemEnfant0" itemLabel="0" <f:selectItem id="itemEnfant1" itemLabel="1" <f:selectItem id="itemEnfant2" itemLabel="2" <f:selectItem id="itemEnfant3" itemLabel="3" </h:selectOneMenu>

itemValue="0"/> itemValue="1"/> itemValue="2" /> itemValue="3"/>

Malgr les facilits quoffre la vue Properties pour saisir les diffrents items, son utilisation ne peut tre envisagequesilenombredlments insrer dans la zone de liste droulante est rduit. Lorsque ce nestpaslecas(parexemplepourconstituerunelistecontenanttouslesnombrescomprisentre1et100000),il convientdegnrerlesitemsdynamiquement:celapeuttrefaitparlexploitationdunbeanmanagdetype ArrayList. Ce cas de figure est dcrit dans le paragraphe Liaison de composants des sources de donnes externesdecechapitre.

g.Intgrationdunezonedetextemultilignes
Cette tape ne pose pas de difficult particulire. Il peut tre intressant de fixer un nombre de lignes et de colonnespourlazonedetexte:ilfautpourcelautiliserrespectivementlesattributsrowsetcolsdelabalisede restitution<h:inputTextArea>. <h:outputText id="otxtCommentaires" value="Vos commentaires:" style="color: #0080FF; font-weight: bold"> </h:outputText> <br> <h:inputTextarea id="txtCommentaires" cols="50" rows="10"> </h:inputTextarea>

h.Intgrationdunboutondesoumission
Letraitementdesdonnessaisiessefaitaprslavalidationduformulaire:celleciestinitieparlutilisationdun boutondesoumission,quelonpositionnesurlapagewebgrceunobjetCommand Button.Engnral,labalise <h:commandButton> reprsentant ce bouton doit disposer dun attribut action, dont la valeur est utilise par limplmentation JSF pour identifier la ressource (autre page JSP, JavaBean) charge de traiter les informations saisies par linternaute. En dautres termes, la valeur de lattribut action doit correspondre lun des cas de navigationprvusdanslefichierdeconfigurationdesressourcesdelapplication. Silattributactionnestpasrenseign,lesdonnessonttraitesparlapageellemme. Lorsque la valeur de lattribut action est mentionne, mais quelle ne correspond aucun des cas de navigationprvu,lenvironnementEclipselesignaleparunavertissementquiprcisequelesdonnesdu formulairenepourrontpastreprisesencharge.

- 14 -

ENI Editions - All rigths reserved

<h:commandButton id="btnEnregistrerInformations" value="Enregistrer les informations" action="sauvegarde"> </h:commandButton>

ENI Editions - All rigths reserved

- 15 -

Exploitationdesvalidateursstandards
1.Lesdiffrentstypesdevalidateursetleurmodedutilisation
a.Descriptiondesvalidateurs
LaspcificationJSFproposeenstandardquatrevalidateursdistincts:ilscorrespondentdesclassesimplmentant linterfacejavax.faces.validator.Validator. Cependant,limplmentationJSFchoisiedanslecadredecetouvrage(SunJSF1.2RI)nepermetlexploitationque detroisdentreeux.IlssontvisiblesdanslacatgorieJSFCoredelapalette,etleurutilisationdirecteaucoursdu dveloppement dune application web est rendu possible par lexploitation de balises de restitution issues de la bibliothqueCore. Le tableau suivant rcapitule les informations concernant chaque validateur standard utilisable pour la cration dapplicationsweb:ilprciselaclassedontlevalidateurestissu,labaliseCorequilereprsente,etlobjetdela palettequiluicorrespond.Lerleduvalidateurestgalementmentionn. Nomdeclasse BaliseCore Objetdelapalette (catgorieJSFCore) validateLength Rle

LengthValidator

<f:validateLength>

Contrledelalongueur dunechanede caractres. Permetdecontrlerune valeurnumriqueentire. Permetdecontrlerune valeurnumrique dcimale.

LongRangeValidator

<f:validateLongRange>

validateLongRange

DoubleRangeValidator

<f:validateDoubleRange> validateDoubleRange

Lequatrimevalidateur,nondisponibledanslinterfaceEclipsepourlaconceptiondepagesweb,estissu de la classe javax.faces.validator.MethodExpressionValidator. Il est charg de vrifier la conformit dune mthode dexpression (cestdire quil sassure quune expression correspond effectivement lappel dunemthodesurunobjet).

b.Composantssupportantlesvalidateurs
Dans le cadre du dveloppement dapplications web, ces validateurs ne prsentent dintrt que lorsquils sont associs un champ de saisie particulier. Un LengthValidator sera utilis pour vrifier quun nom ou un mot de passeabientsaisi,alorsquunLongRangeValidatorpourravrifierquelaquantitdemandepourunarticlede boutiqueenligneestbiencompriseentredeuxvaleursdonnes. Les composants JSF capables de supporter les validateurs sont ceux qui sont directement issus de la classe UIInput : celleci prsente en effet une mthode addValidator() permettant dassocier un validateur au composant,ainsiquunemthodegetValidators()utilisablepourobtenirlalistedetouslesvalidateursassocisau composant.

c.Modedutilisationdesvalidateurs
Avec lenvironnement Eclipse, lassociation entre un composant graphique et un validateur particulier se dfinit partir de la vue Properties, lorsque le composant de saisie en question est slectionn. Longlet Quick Edit de cette vue comporte une rubrique Validators, partir de laquelle il est possible dassocier un ou plusieurs validateursaucomposant,etdeprciserleursattributs. Dans lillustration cidessous, deux validateurs distincts sont associs un champ de type HtmlInputText. Le premierdentreeuxestunLongRangeValidatorvrifiantquelachanesaisiedanslechampestunentiercompris entre 2323 et 10671. Le second est un LengthValidator sassurant que la longueur de la chane contient au minimum5caractresetaumaximum6.Naturellement,lesdeuxcontraintesimposesparlesvalidateursdevront trevrifiessimultanmentaumomentdelasaisiedanslechamp.

ENI Editions - All rigths reserved

- 1-

2.Contrlerlalongueurdunechanedecaractres
Ilestcourant,danslesformulairesdesaisie,dedevoirsassurerquelachanesaisiedansunchampaunecertaine taille.Cetypedesituationserencontreparexemplepourvrifierquunmotdepassecontientunnombresuffisant decaractres.Lamiseen uvreduntelcontrleavecJSFsefaitfacilementparlutilisationdunvalidateurstandard detypeLengthValidator. Ce validateur dispose de deux proprits de type int,nommes minimum etmaximum, qui permettent de raliser le traitementattendu.
q

Lorsquune valeur est attribue minimum, le validateur sassure que la chane saisie dans le champ de formulaire contient au moins minimum caractres. Si ne nest pas le cas, une exception de type ValidatorException est gnre : la prise en charge de celleci par lapplication web peut permettre laffichagedunmessagederreuradaptparlintermdiairedunobjetdetypeHtmlMessage. Lorsquune valeur est attribue maximum, le validateur sassure que la chane saisie dans le champ de formulaire contient au plus maximum caractres. Si ne nest pas le cas, une exception de type ValidatorException est gnre : elle peut tre prise en charge par lintermdiaire dun objet de type HtmlMessage. Si les deux proprits sont dfinies, la chane saisie doit rpondre simultanment aux deux contraintes prcdemmentcites.

LecodesourcesuivantillustrelexploitationdunLengthValidatorchargdesassurerquelachanesaisiedansun champ HtmlInputText dispose dune longueur comprise entre 5 et 10 caractres. En cas du nonrespect de cette contrainte, un message derreur spcifique est prsent linternaute grce un objet HtmlMessage associ au champdesaisie. <f:view> <h:form> <h:outputText id="txtIntitule" value="Saisissez imprativement un commentaire (entre 5 et 10 caractres):"> </h:outputText> <br> <h:inputText id="txtCommentaire" label="Commentaire impratif" required="true"> <f:validateLengthminimum="5" maximum="10"> </f:validateLength> </h:inputText> <h:message id="messageCommentaire" for="txtCommentaire" style="color: #FF0000; font-weight: bold"> </h:message> <br> <h:commandButton id="btnValidation" value="Validation du formulaire"> </h:commandButton>

- 2-

ENI Editions - All rigths reserved

</h:form> </f:view> Notezquelabalise<h:inputText>,reprsentantlechampdesaisie,disposedunattributrequiredpositionntrue. En effet, bien que le LengthValidator soit configur pour vrifier que la chane saisie contient entre 5 et 10 caractres,celuicinestpasenmesuredefaireunquelconquetraitementlorsdelabsencedesaisie.Enloccurrence, aucune ValidatorException ne sera gnre dans ce cas de figure et la soumission du formulaire se fera avec succs,malgrlacontrainteexprimeparlevalidateur.Ilestdoncindispensabledimposerunesaisiedanscechamp texte,parlusagedelattributdebaliserequired. LagnrationduneValidatorExceptionparunvalidateur,quelquesoitsontype,lorsdunonrespectdune contrainte, provoque systmatiquement dans les applications web lchec de validation du formulaire de saisie. Cela oblige linternaute fournir des informations cohrentes et limite les risques de mise en chec de lapplicationellemmepourcausedefourniturededonnesinadaptes,parexemple.

3.Sassurerquunevaleurnumriqueestcompriseentredeuxbornes
Deux validateurs permettent de rpondre ce besoin : LongRangeValidator et DoubleRangeValidator. Bien quils soienttousdeuxenmesuredecontrlerdesvaleursnumriques,leurdiffrencersidedanslefaitquelepremierne peut prendre en charge que des valeurs entires, alors que le second traite la fois les valeurs entires et les valeursdcimales.Cettediffrenceestclairementvisibleauregarddesconstructeursrespectifsdesdeuxclasses: public LongRangeValidator(long maximum, long minimum) public DoubleRangeValidator(double maximum, double minimum) Les modes de fonctionnement de ces deux validateurs sont identiques : ils effectuent une comparaison entre la valeursaisieparlinternautedansunchampdeformulaireetdeuxvaleurs,minimumetmaximum.
q

Si aucune valeur nest saisie, aucun traitement nest ralis. Le validateur ne bloque pas la soumission du formulaire. Silesproprits minimumetmaximumsontprcises,levalidateursassurequelavaleursaisiesesituebien entrelesdeux.Lorsquecenestpaslecas,uneexceptiondetypeValidatorExceptionestgnre.Cequia poureffetdempcherlasoumissionduformulaire. Siseulelapropritminimumestindique,alorslevalidateurvrifiequelutilisateuramentionnunevaleur suprieureougalecelleci.Danslecascontraire,uneValidatorExceptionestgnre. Siseulelapropritmaximumestindique,alorslevalidateurvrifiequelutilisateuramentionnunevaleur infrieureougalecelleci.Danslecascontraire,uneValidatorExceptionestgnre.

a.ExempledutilisationdunLongRangeValidator
Aprs avoir dpos un champ de saisie dans la zone ddition dEclipse, il est possible de lui associer un LongRangeValidatordepuislavueProperties.Lespropritsminimumetmaximumpeuventgalementtreprcises depuis cette vue. Laperu du code source de la page web montre que la balise <f:validateLongRange> correspondant au validateur est une balise enfant de celle reprsentant le champ de saisie (par exemple <h:inputText>). <f:view> <h:form> <h:inputText id="txtDuree"> <f:validateLongRangeminimum="2323" maximum="10671"> </f:validateLongRange> </h:inputText> <h:message for="txtDuree"> </h:message> <br> <h:commandButton value="Tester le validateLongRange"> </h:commandButton> </h:form>

ENI Editions - All rigths reserved

- 3-

</f:view> LassociationdunobjetHtmlMessageaveclechampdesaisieestutilepourprsenterlutilisateurlesraisonsdun ventuelchecdelavalidation.Danslecodecidessus,cetteassociationestassureparladclarationdelattribut fordelabalise<h:message>,dontlavaleurcorrespondcelledelattributidduchampcontrler. OutrelescasprcdemmentcitspourlesquelsleLongRangeValidatordclencheuneValidatorException, un chec de la validation peut galement survenir lorsque la chane de caractres saisie par lutilisateur nestpasconvertibleentypelong.Celaseproduitdsquuncaractrenonnumriqueesttrouvdanslachane, et a fortiori le caractre point ("."). Cest la raison pour laquelle la validation dunnombredcimalnepeutpas treassureparunLongRangeValidator:ilfautpourcelaexploiterunDoubleRangeValidator.

b.ExempledutilisationdunDoubleRangeValidator
La mise en uvre de ce validateur ne diffre en aucun point de ce qui vient dtre dit concernant le LongRangeValidator : lassociation du validateur un champ de saisie peut se faire depuis la vue Properties dEclipse,enmmetempsquelaprcisiondesvaleursdesdeuxpropritsminimumetmaximum. lexcution,onconstatequeffectivementlasaisiedunnombredcimalneposeaucunproblme,contrairement cequiestobservaveclusagedunLongRangeValidator. <f:view> <h:form> <h:inputText id="txtDuree"> <f:validateDoubleRange minimum="10" maximum="100"> </f:validateDoubleRange> </h:inputText> <h:message for="txtDuree"></h:message> <br> <h:commandButton value="Tester le validateDoubleRange"> </h:commandButton> </h:form> </f:view>

- 4-

ENI Editions - All rigths reserved

Exploitationdesconvertisseursstandards
1.Lesdiffrentstypesdeconvertisseursetleurmodedutilisation
a.Descriptiondesconvertisseurs
UnconvertisseurestunobjetissuduneclasseimplmentantlinterfaceConverter,dontlerleconsistetenterla conversiondunevaleurdonnepourlarendrecompatibleavecunepropritparticuliredunJavaBean. LaspcificationJSFdfinitenstandardtreizeclassesdeconvertisseurs,permettantdassurerdesconversionsvers diverstypesnumriques,ainsiqueversletypeDate.Danslecadredudveloppementdapplicationswebbases surJSF,seulsdeuxconvertisseurssontpropossenstandard:
q

Le premier traite de la conversion des nombres, en facilitant notamment la prise en charge de plusieurs formats de donnes (pourcentages, monnaies, etc.) : il est disponible dans la catgorie JSF Core de la palette dEclipse sous le nom convertNumber. La balise de restitution qui lui correspond est <f:convertNumber>. Le second prend en charge les conversions de chane vers un format spcifique de date (et rciproquement).IlsesituedanslammecatgoriedelapaletteetsenommedateTimeConverter.Sabalise derestitutionest<f:dateTimeConverter>.

b.Composantssupportantlesconvertisseurs
LanalysedudiagrammedesclassesmontrequeseulslescomposantsgraphiquesJSFissusdeclassesbasessur UIOutputpeuventsevoirassocierunconvertisseur. Ilestdoncpossibledattribuerunconvertisseurunchampdesaisieparticulier,telquunezonedetexteouune zonedelistedroulantechoixunique.Danscecas,leconvertisseurestutilispourconvertirladonnesaisie,de manirelarendrecompatibleaveclasuitedutraitement(ilsagitleplussouventdustockagedelavaleursaisie dansunepropritdunJavaBean). Maisilestgalementpossibledutiliserunconvertisseurpourlassocierunlabelouuntexteprsentenlecture seule.Danscettesituation,leconvertisseureffectueuntraitementrciproquedeceluiquivientdtredcrit:ilse chargedeconvertir,sicelaestpossible,lavaleurdunepropritdeJavaBeanenvuedunaffichageauniveaude linterfaceweb.IlsagitdoncdunetentativedeconversionduntypequelconqueversletypeString. Ilnestpaspossibledassocierplusieursconvertisseursuncomposantgraphiqueparticulier.

c.Modedutilisationdesconvertisseurs
Delammemanirequecequiatvuconcernantlesvalidateurs,lassociationentreuncomposantgraphiqueet un convertisseur se fait facilement depuis la vue Properties dEclipse, lorsque le composant en question est slectionn.Unefoisleconvertisseurdclar,sesdiffrentsattributspeuventrapidementtreprcissdepuisla mmevue.

ENI Editions - All rigths reserved

- 1-

LillustrationproposemontrelespropritsdunobjetdetypeHtmlOutputText.LarubriqueConvertercontientla dclarationdunconvertisseurdetypeDateTimeConverter,alorsquelattributvalueindiquequecechamptexteest associlapropritdateCourantedubeanmanagbeanDateCourante.

2.Conversiondesvaleursnumriques
a.Propritsutilisesdanscetypedeconversion
Cetypedeconversionsefaitlaidedun NumberConverter.Lorsdeladclarationdecetypedeconvertisseur,la vuePropertiesmontrelexistencedequatreproprits:
q

type:sertprcisersileconvertisseurestutilispourconvertirdesdevisesmontaires,despourcentages oudesnombresquelconques.Ellepermetaussidindiquerqueleconvertisseurnecorrespondaucunde cestypesprdfinis:letypeestalorspersonnalis. Currency Code:cettepropritestutilisepourdesconversionsdedevises.Ellepermetdeprciserune chane de caractres correspondant la devise en question (par exemple, EUR pour les euros). Les diffrentesvaleurspossiblessontproposesdansunezonedelistedroulanteetsontissuesdelanorme ISO4217. Currency symbol : utilise galement pour la conversion de devises, elle sert mentionner le symbole correspondantlamonnaie(parexemple,pourleseuros). Pattern:dfinitleformatquedoitrespecterlachaneoulavaleurdelapropritduJavaBean.

Suivant les choix raliss au moment de la dfinition des proprits du convertisseur, toutes les proprits ne peuventpastreprcises:enloccurrence,lusage dunconvertisseurdedevisesexclutlamentiondunevaleur pourlapropritPattern,alorsqueladclarationdunconvertisseurdepourcentagesrendinutilelaprcisiondune valeurpourlespropritsCurrency CodeetCurrency Symbol.

b.Modedefonctionnementdelaconversion
Lefonctionnementdecetypedeconvertisseurdiffreselonquelaconversionseraliseenvuedustockagedune valeursaisiedansunepropritdeJavaBean,ouque,linverse,elleestutilisedanslebutdafficherlecontenu dunepropritdeJavaBeansurlinterfaceweb.Lapremiresituationcorrespondlaconversiondunechaneen ObjectlasecondeestlaconversiondunObjectenchanedecaractres. LorsdelaconversiondunechaneenObject LachanesourceestanalysedanslebutdelaconvertirenobjetdetypeLongouDouble.

- 2-

ENI Editions - All rigths reserved

Silalongueurdelachaneestnulle,aucuneconversionnestassure. SilapropritPatternestrenseigne,savaleurdoitrespecteruncertainformat,selonlesrglesprcises dans la classe java.text.DecimalFormat. La prcision dune valeur pour Pattern provoque labsence de priseencomptedelavaleurdelaproprittype. Si la propritPatternnestpasrenseigne,lanalysedelachanesourceestralisecomptetenudela valeur de la proprit type. Selon le cas (conversion de devises, de pourcentages ou de nombres quelconques),leformatrespectercorrespondceluimentionndanslesmthodesgetCurrencyInstance (),getNumberInstance()etgetPercentInstance()delaclassejava.text.NumberFormat.

LorsdelaconversiondunObjectenchanedecaractres Laconstitutiondelachanedecaractresseffectueselonladmarchesuivante:
q

SilObjectsourcecorrespondlavaleurnull,unechanedelongueurnulleestrestitue. SilObjectsourceestunechanedecaractres,celleciestrestituetellequelle. Si la proprit Pattern possde une valeur, celleci doit respecter le formatage prvu dans la classe java.text.DecimalFormat.Ellerendinutilelaprcisiondunevaleurpourlaproprittypeduconvertisseur. SilapropritPatternnestpasmentionne,lObjectsourceestconvertisouslaformedunechanedontle format correspond, selon la valeur de lattribut type, une devise, un pourcentage ou un nombre quelconque.LeformatenquestioncorrespondceluimentionndanslesmthodesgetCurrencyInstance (),getNumberInstance()etgetPercentInstance()delaclassejava.text.NumberFormat.

checduneconversion Si la conversion demande, dans un sens ou dans lautre, ne peut pas tre assure, une exception de type ConverterExceptionestgnre:celaempchelasoumissionduformulairedanslequelsetrouvelecomposantJSF auquel est associ le convertisseur. Le cas chant, le motif de lchec de la conversion peut tre prcis linternauteparlebiaisdunobjetdetypeHtmlMessageouHtmlMessages.

c.ExempledutilisationdunNumberConverter
Le code source cidessous illustre lemploi dun NumberConverter associ un champ de type HtmlInputText. Ce convertisseurestreprsentparunebalise<f:convertNumber>possdantunattributpatternrenseign:lavalidit de la conversion est donc dtermine en comparant le format de la chane saisie par linternaute dans le champ <h:inputText>aveclavaleurdupattern. La prsence dun objet HtmlMessage associ au champ de saisie permet de prsenter lutilisateur le motif dun ventuelchecdeconversion.Enloccurrence,lateneurdumessageenquestioncorrespondrasystmatiquement lavaleurdelattributconverterMessagedelabalise<h:inputText>. <f:view> <h:form id="formulaireInscription"> <br> <h:panelGrid border="1" columns="2"> <h:outputText id="otxtValeurNumerique" value="Saisissez une valeur numrique"> </h:outputText> <h:panelGroup> <h:inputText id="itxtValeurNumerique"converterMessage="Format non respect (0,00%)" requiredMessage="Vous devez renseigner ce champ!" required="true"> <f:convertNumber pattern="0.00%"/> </h:inputText> <h:message id="msgValeurNumerique" for="itxtValeurNumerique" style="color: #FF0000; background-color: #FFFF00"> </h:message> </h:panelGroup>
ENI Editions - All rigths reserved - 3-

</h:panelGrid><br> <h:commandButton id="btnTester" value="Tester la conversion de linformation saisie"> </h:commandButton> </h:form> </f:view>

3.Conversiondeladateetdelheure
a.Propritsutilisesdanscetypedeconversion
CetteconversionsobtientparlutilisationdunconvertisseurdetypeDateTimeConverter.Quatrepropritspeuvent tredfiniesdepuislavuePropertiesdEclipsepourceconvertisseur:
q

Type : sert indiquer si la conversion concerne la date uniquement, lheure uniquement, ou les deux simultanment. Date Style : dans le cas dune conversion de date, cette proprit est utilise pour spcifier le style daffichage/destockagedeladate.Ilpeutsagirduneformecourte,complteouintermdiaire. Time Style : dans le cas dune conversion dheure, cette proprit est utilise pour spcifier le style daffichage/destockagedelheure.Ilpeutsagirduneformecourte,complteouintermdiaire. Pattern:lutilisationdecettepropritexclutlemploidestroisautrespropritsprcdemmentvoques. Elle permet de mentionner un format particulier daffichage/de stockage de la date ou de lheure. Lensembledesformatsautorissestindiquauseindunezonedelistedroulante.

b.Modedefonctionnementdelaconversion
De la mme manire que pour un convertisseur NumberConverter, un convertisseur de type DateTimeConverter prsente un mode de fonctionnement qui diffre, selon quil soccupe de la conversion dune chane en vue du stockagedansunepropritdeJavaBean,ouqulinverse,ilsattachelaconversionducontenuduneproprit deJavaBeanpourenraliserunaffichagedanslinterfaceutilisateur. LorsdelaconversiondunechaneenObject LachanesourceestanalyseafindetentersaconversionenobjetdetypeDate.
q

SilobjetStringinitialvautnull,ousilenombredecaractresdecettechaneestnul,laconversionnest pasenchec,maislobjetDatequienrsulteestnull. Lorsque la proprit pattern est spcifie, sa valeur doit tre conforme aux rgles mentionnes dans la classejava.text.SimpleDateFormat.

LorsdelaconversiondunObjectenchanedecaractres Danscecasdefigure,leconvertisseurtentelaconversiondunepropritdunJavaBeanenchanedecaractres. LapropritenquestionpeuttreduntypequelconquecompatibleavecletypeDateoutredetypeString.La dmarchesuivanteestralisepourmettreen uvrelaconversion:


q

Si la valeur de proprit du JavaBean est gale null, le rsultat de la conversion est une chane de caractresdelongueurnulle. SilapropritduJavaBeanestdetypeString,savaleurestrestituetellequelleparleconvertisseur. Si la proprit pattern est spcifie, sa valeur doit respecter la syntaxe prcise dans la classe java.text.SimpleDateFormat. En cas dutilisation de cette proprit, toutes les autres proprits du convertisseursontignores.

- 4-

ENI Editions - All rigths reserved

checduneconversion Lorsque cette situation survient, une exception de type ConverterException est gnre. La soumission du formulairedanslequelsetrouvelecomposantassociauconvertisseurestinterrompue.Unmessageexplicitantle motif de lchec de la conversion peut tre prsent lutilisateur si un objet HtmlMessage est rattach au composantenquestionousiunobjetHtmlMessagesestprsentsurlapageweb.

c.ExempledutilisationdunDateTimeConverter
titre dillustration, on peut imaginer la mise en place dun formulaire de saisie partir duquel un internaute mentionneunedatequelconqueauformatjj/MM/aaaa.Lavalidationduformulairedoitentranerlaffichagedunom dujourcorrespondantladatefournie(parexemple,samedi). Afin de garantir la saisie de la date selon le format choisi, il est ncessaire dassocier un convertisseur de type DateTimeConverter au champ de saisie. Ce convertisseur doit disposer duneproprit pattern correspondant au formatrespecter. Par ailleurs, pour rendre ais laffichage du nom du jour de la date saisie, il est trs intressant dexploiter un JavaBean dont lune des proprits correspond prcisment cette date, et de lier cette proprit avec un label dispos sur la page web. Laffichage du nom du jour seul, sans prcision de la date ellemme, se fait alors extrmementsimplementparlemploidunDateTimeConverterassociaulabel.Ceconvertisseurdoitcomporterune propritpatterndontlavaleurcorrespondauseulaffichagedujourdelasemaine,tellequelleestprcisedans laclasseSimpleDateFormat. Pourrcapituler,lapagewebexploiteunbeanmanag(dclarerdanslefichierdedescriptiondesressources de lapplication web) comportant une proprit de type Date qui pourra servir stocker la date saisie par linternaute.Deplus,lapagewebdoitcomporter:
q

unchampdesaisieHtmlInputTextlilapropritdetypeDatedubeanmanag,etassociunpremier convertisseurDateTimeConverterdontlapropritpatternestgaledd/MM/yyyy. Un label de type HtmlOutputText, galement li la proprit de type Date du bean manag (mais en lectureseulecettefois),associunsecondDateTimeConverterdontlapropritpatternestfixeEEEE.

Voici le code source dun JavaBean rpondant au besoin exprim. La cration dune instance de ce JavaBean initialiselapropritdetypeDateavecladatedujour. package premierProjetJSF; import java.util.Calendar; import java.util.Date; public class BeanDateCourante { private Date dateCourante; public BeanDateCourante() { setDateCourante(Calendar.getInstance().getTime()); } public Date getDateCourante() { return dateCourante; } public void setDateCourante(Date dateCourante) { this.dateCourante = dateCourante; } } La dclaration dun bean manag sappuyant sur cette classe peut se faire dans le fichier de description des ressourcesdelapplicationparleslignessuivantes: <managed-bean> <managed-bean-name> beanDateCourante </managed-bean-name>

ENI Editions - All rigths reserved

- 5-

<managed-bean-class> premierProjetJSF.BeanDateCourante </managed-bean-class> <managed-bean-scope> session</managed-bean-scope> </managed-bean> LapagewebcontenantlesdiffrentscomposantsJSFpeutcorrespondreaucodesourcecidessous. Les champs <h:inputText> et <h:outputText> sont lis la proprit dateCourante du bean manag par lintermdiaire de lattribut de balise value. Ce point particulier, illustrant lassociationdun composant avec un JavaBean, est trait plusendtaildansletitreLiaisondecomposantsdessourcesdedonnesexternesdecechapitre. <f:view> <h:form id="formulaireInscription"> <br> <h:panelGrid border="1" columns="2"> <h:outputText id="otxtDateDuJour" value="Saisissez une date valide:"> </h:outputText> <h:panelGroup> <h:inputText id="itxtDateDuJour"value="#{beanDateCourante.dateCourante}" converterMessage="La date indique doit tre au format JJ/MM/AAAA" requiredMessage="Vous devez renseigner ce champ!" required="true"> <f:convertDateTimepattern="dd/MM/yyyy" /> </h:inputText> <h:message id="msgDateDuJour" for="itxtDateDuJour" style="color: #FF0000; background-color: #FFFF00"> </h:message> </h:panelGroup> </h:panelGrid> <h:outputText id="otxtDateCourante" value="#{beanDateCourante.dateCourante}"> <f:convertDateTime type="date" dateStyle="full" pattern="EEEE" /> </h:outputText><br> <h:commandButton id="btnTester" value="Afficher le nom du jour"> </h:commandButton> </h:form> </f:view>

- 6-

ENI Editions - All rigths reserved

Associationdcouteursauxcomposantsprsentsdanslapage
CommecelaatexpliqulasectionGestiondesvnementsduchapitreCompositionduneapplicationJSF,deux types dvnements peuvent tre pris en charge dans le cadre des applications web bass sur la technologie Java ServerFaces:
q

Les ActionEvent, qui peuvent tre gnrs par des composants implmentant linterface ActionSource (notamment,lescomposantsdetypeHtmlCommandButtonouHtmlCommandLink). LesValueChangeEvent,quiconcernenttouslescomposantsJSFbasssurlaclasseUIInput(champsdesaisie).

Ces vnements peuvent tre traits indiffremment par des couteurs spcifiques, ou par des mthodes de JavaBeans.

1.Priseenchargedesvnementsparuncouteur
UncouteurestlinstanceduneclasseimplmentantlinterfaceFacesListener,oulunedesesinterfacesdrives. Enloccurrence,pourquuneclassepuissetraiterunActionEvent,elledoitimplmenterlinterfaceActionListener.De mme,uneclasseimplmentantValueChangeListenerpeutrceptionnerdesValueChangeEvent.

a.UtiliseruncouteurprenantenchargelesActionEvent
Lexemple suivant montre le code source dune classe BeanActionListener implmentant ActionListener : elle prsente une mthode processAction dont largument correspond un vnement de type ActionEvent. Les instructionscontenuesdanscettemthodesecontententdexploitercetvnementpourenconnatrelorigine(la mthode getComponent() de la classe ActionEvent renvoie en effet la rfrence du composant ayant provoqu lvnement).Lidentifiantdececomposantestensuiteaffichdanslaconsole. package premierProjetJSF.listeners; import import import import javax.faces.component.UIComponent; javax.faces.event.AbortProcessingException; javax.faces.event.ActionEvent; javax.faces.event.ActionListener;

public class BeanActionListener implements ActionListener { public void processAction(ActionEvent arg0) throws AbortProcessing Exception { UIComponent composantSource=arg0.getComponent(); System.out.println("Vous venez dutiliser le composant did "+composantSource.getId()); } } ComptetenudufaitquecetteclasseimplmenteActionListener,cellecipeuttreutiliseauseinduneapplication webafindeprendreenchargeles ActionEventgnrslorsdelexploitation de certains composants graphiques JSF(boutondecommandeouhyperlien). Raliser une association entre un composant JSF et un couteur se fait facilement depuis la vue Properties dEclipse,lorsquelecomposantenquestionestslectionn.Sicecomposantestcapabledegnrerlundesdeux types dvnements prvus par la spcification, une rubrique Listeners est en effet disponible. Son utilisation permet dassocier un ou plusieurs couteurs au composant. Bien sr, seuls les couteurs compatibles avec le composantsontpropossenvueduneassociation. Dans le code source suivant, un composant de type HtmlCommandButton est prsent dans la page web. La balise <h:commandButton>quilereprsentedisposedunebaliseenfant,<f:actionListener>.Celleciidentifieuncouteur detypeActionListenerassociauboutonellepossdeunattributobligatoiretypepermettantdementionnerla classe implmentant lActionListener. Il sagit bien sr ici du nom complet de la classe dcrite prcdemment : BeanActionListener. <f:view> <h:form>

ENI Editions - All rigths reserved

- 1-

<h:outputText id="otxtNom" value="Votre nom:"></h:outputText> <h:inputText id="itxtNom"></h:inputText> <h:commandButton id="btnEnregistrer" value="Enregistrer" > <f:ActionListener type="premierProjetJSF.listeners.BeanActionListener"/> </h:commandButton> </h:form> </f:view> Lutilisation de cette page web montre bien que la ralisation dun clic sur le bouton de commande associ lActionListenerprovoquelaffichagedelidentifiantduboutondanslaconsoleEclipse.

b.UtiliseruncouteurprenantenchargelesValueChangeEvent
Lammedmarchepeuttreutilisepourillustrerlamiseen uvreduncouteurdetypeValueChangeListener : uneclasseimplmentantcetteinterfaceprsenteunemthodeprocessValueChangeprenantenchargeunobjetde type ValueChangeEvent. Cet objet correspond un vnement gnr, et lappel de sa mthode getComponent() permetdobtenirlarfrenceducomposantquienestlasource. package premierProjetJSF.listeners; import import import import javax.faces.component.UIInput; javax.faces.event.AbortProcessingException; javax.faces.event.ValueChangeEvent; javax.faces.event.ValueChangeListener;

public class BeanValueChangeListener implements ValueChangeListener { public void processValueChange(ValueChangeEvent arg0) throws AbortProcessingException { //Affichage du nombre de caractres saisis //dans le composant lorigine de lvnement. UIInput composantSaisie= (UIInput)arg0.getComponent(); System.out.println("La valeur du composant "+composantSaisie.getId()+ " a t modifie ("+composantSaisie.getValue()+")"); } } UncomposantJSFsappuyantsurlaclasseUIInputpeuttreloriginedunvnementdetypeValueChangeEvent. Pour assurer un traitement spcifique lorsque survient ce type dvnement, il faut associer le composant en questionuncouteurdetypeValueChangeListener. Danslexemplecidessous,unchampdetypeHtmlInputTextareaestpositionnsurunepageweb,ctecteavec uncomposantHtmlCommandButton.Labalisequilereprsentecomporteunebaliseenfant<f:valueChangeListener>, indiquant quil est associ un couteur de type ValueChangeListener. Cette balise enfant dispose dun attribut type dont la valeur correspond au nom dune classe capable de prendre en charge les ValueChangeEvent. En loccurrenceici:BeanValueChangeListener. <f:view> <h:form> <h:inputTextarea id="itaCommentaires"> <f:ValueChangeListener type="premierProjetJSF.listeners.BeanValueChangeListener"/> </h:inputTextarea> <h:commandButton id="btnValider" value="Valider"> </h:commandButton> </h:form> </f:view> Lorsdelexcutiondecettepage,onconstatequunmessageestindiqudanslaconsoleEclipsechaquefoisque

- 2-

ENI Editions - All rigths reserved

leformulairedesaisieestvalidetquelecontenudelazonedetexteatmodifi.

2.Associerplusieurscouteursununiquecomposant
La spcification JSF prvoit la possibilit dassocier plusieurs couteurs un unique composant. Il est par exemple ralisablededclarerNgestionnairespourlvnementActionEventpourunboutondecommandeparticulier.Dans cettesituation,lvnementgnresttransmissuccessivementlensembledesgestionnaires. Lecodesourcecidessousillustrececasdefigure:unboutondecommandedisposededeuxcouteurscapablesde prendreenchargedesActionEvent.chaquebalise<f:actionListener>reprsentantlescouteurscorrespondune classespcifiqueimplmentantlinterfaceActionListener. <f:view> <h:form> <h:commandButton id="btnTester" value="Tester plusieurs couteurs"> <f:actionListener type="premierProjetJSF.listeners.BeanActionListener"/> <f:actionListener type="premierProjetJSF.listeners.EvenementClicListener"/> </h:commandButton> </h:form> </f:view>

3.GestiondesvnementsparlexploitationdunemthodedeJavaBean
Outre la prise en charge des vnements par des couteurs spcifiques de type ValueChangeListener ou ActionListener,ilestgalementpossiblededlguerlagestionvnementielledesimplesmthodesdeclasses. Danscecas,lescomposantsJSFsusceptiblesdtrelasourcedesvnementssontreprsentssurlespagesweb par des balises comportant, selon le cas, soit un attribut actionListener, soit un attributvalueChangeListener. La valeurdecesattributsfaitappelaulangagedexpressionsspcifiqueJSF,etpermetdidentifierunemthodede beanmanagchargedetraiterlvnement.Silenomdunetellemthodepeuttrechoisilibrement,lerestedesa signaturedoitrespecterlescontraintessuivantes:lamthodedoittrepublique,detypevoidetaccepterununique paramtre de type ActionEvent ou ValueChangeEvent (selon le type dvnement prendre en charge). Les deux lignesdecodesuivantescorrespondentdessignaturesdemthodescapablesdetraiterdesvnementsgnrs pardescomposantsJSF: public void modificationContenu(ValueChangeEvent evenement) public void traitementClic(ActionEvent actionEvent) ExempledepriseenchargedunActionEvent Pour illustrer ce concept, imaginons que lon souhaite mettre en place une page web contenant un bouton de commandedontlelabelchangechaquefoisquelinternautelutilise(parexemple,letexteaffichsurleboutonpasse delavaleur"OUVRIR"lavaleur"FERMER",etrciproquement). Il faut, dans un premier temps, utiliser un JavaBean comportant une mthode capable de traiter un vnement de typeActionEvent.LecodesourcesuivantcorresponduntelJavaBean:ilcomporteeneffetunemthodepublique de type void, dnomme traitementClic, acceptant un unique paramtre de type ActionEvent. Les instructions contenuesdanslamthodeenquestionassurentlobtentiondelarfrenceducomposantUICommandloriginede lvnement,eteffectuentunepermutationdesavaleurparlappeldesmthodesgetValueetsetValuedelaclasse UICommand. package premierProjetJSF.listeners; import javax.faces.component.UICommand; import javax.faces.event.ActionEvent; public class BeanActionListener2 { public void traitementClic(ActionEvent actionEvent) { UICommand actionSource=(UICommand)actionEvent.getComponent(); String texte=(String)actionSource.getValue();

ENI Editions - All rigths reserved

- 3-

if (texte.toUpperCase().equals("OUVRIR")) actionSource.setValue("FERMER"); else actionSource.setValue("OUVRIR"); } } Dansunsecondtemps,ilestindispensablededclarerceJavaBeanentantquenouvelleressourcedelapplication web:ilseraalorsconsidrcommeunbeanmanagetpourradonctreexploitparlespagesJSPdelapplication grceaulangagedexpressions.Unetelledclarationpeutprendrelaformesuivantedanslefichierdeconfiguration desressourcesdelapplication: <managed-bean> <description> Ce JavaBean comporte une mthode capable de traiter les ActionEvent. </description> <managed-bean-name> beanActionListener2</managed-bean-name> <managed-bean-class> premierProjetJSF.listeners.BeanActionListener2 </managed-bean-class> <managed-bean-scope> session </managed-bean-scope> </managed-bean> Il ne reste plus enfin qu concevoir la page web ellemme. Celleci peut, par exemple, comporter une balise <h:commandButton> dont lattribut ActionListener identifie la mthode traitementClic du bean manag beanActionListener2commegestionnairedesvnementsActionEventquisurviennentsurlebouton. <f:view> <h:form> <h:commandButton id="btnValidation" value="OUVRIR" actionListener="#{beanActionListener2.traitementClic}"> </h:commandButton> </h:form> </f:view> lexcution,onconstatequeffectivementleboutonchangedelabelchaquefoisquelutilisateurcliquedessus. Un exemple de prise en charge dun ValueChangeEvent par une mthode de JavaBean est prsent la section Ajout de composants graphiques une page Principaux attributs de balises communs de ce chapitre.

- 4-

ENI Editions - All rigths reserved

Liaisondecomposantsdesbeansmanags
IlexistediffrentsmoyenspermettantdelieruncomposantJSFunbeanmanag.Lepluscourantconsisteassocier lecomposantunepropritdebean.Maisilestgalementpossibledemettreenplaceuneliaisonaveclunedes mthodesdubean.

1.Lieruncomposantlunedespropritsdunbeanmanag
LemcanismedeliaisondecomposantsgraphiquesJSFavecdespropritsdebeansmanagsesttrslargement mis en uvre dans la conception dapplications web bases sur cette technologie. En effet, ce type de liaison est utilis pour sauvegarder les informations saisies dans un formulaire par linternaute. Il est aussi exploit pour prsenterlinternautelesvaleursdespropritsdebeansmanags,enrespectantparfoisunformatageparticulier (exemple:unedatedontonneveutafficherquelenumrodujour). Concrtement, la plupart des composants graphiques JSF sappuient sur des classes disposant de deux mthodes particulires:getValueetsetValue.CestlecasnotammentdetouslescomposantsbasssurlesclassesUIOutput etUICommand.Commeleursnomslindiquent,cesdeuxmthodesserventrespectivementlireetmodifierlavaleurdu composant. Biensr,ledesignerdespageswebpeutaismentfaireappelcesmthodesparlexploitationdelattributvalue des balises reprsentant les composants. Lusage de cet attribut est particulirement intressant lorsquil sagit dafficher dans linterface web une information stocke dans un fichier de messages. ce sujet, de plus amples dtails sont fournis dans le chapitre Internationalisation dune application web de cet ouvrage, concernant linternationalisation des applications. Lattribut value est aussi utilis pour donner une valeur par dfaut au composant (texte dun label, par exemple). Mais il est aussi trs souvent utilis pour lier la valeur locale dun composantgraphiqueJSFaveclavaleurdunepropritdebeanmanag.Danscecas,lavaleurdecetattributfait appelaulangagedexpressionJSF,grceauquelilestpossibledementionnerlenomdubeanetceluidelaproprit lieraucomposant.

a.Liaisonencriture(sauvegardedesdonnesdeformulaires)
Lamiseenplacedunetelleliaisonconsistecopierlavaleurlocaleducomposantgraphiquedansunepropritde JavaBean. Lapplication la plus courante de cet artifice technologique concerne la sauvegarde des informations saisiesdansunformulaire. Imaginons par exemple le classique cas du formulaire dauthentification quun internaute visualise lors de la consultationdelapremirepageduneapplicationwebprotge:linternauteyestinvitsaisirunloginetun motdepasse.Afindenepasalourdirlavisitedusite,cesinformationsdauthentificationdoiventtrestockesct serveur.DanslecadreduneapplicationbasesurlatechnologieJSF,cestockagectserveurpeuttreassur parlexploitationdunbeanmanagdeportesession,dontlespropritssontcompatiblesaveclesinformations sauvegarder.LecodesourcesuivantcorresponduntelJavaBean:sespropritsnameetpassword,toutesdeux detypeString,peuventservirarchiverctserveurunloginetunmotdepasse. package premierProjetJSF; public class LoginBean { private String name; private String password; public LoginBean() { super(); } public String getName() { return name; } public void setName(String name) { System.out.println("Modification du login: "+name); this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { System.out.println("Modification du mot de passe: "+password);

ENI Editions - All rigths reserved

- 1-

this.password = password; } } Ce JavaBean doit tre rendu disponible lensemble de lapplication web. Pour cela, il doit tre dclar dans le fichierdeconfigurationdesressourcesentantquebeanmanag.Cebeandevrancessairementavoiruneporte session,demanirecequilsubsisteenmmoireletempsdelavisitedusitewebparlinternaute,etquilnesoit pas partag avec dautres utilisateurs. Voici les lignes ajouter au fichier facesconfig.xml pour assurer cette dclaration: <managed-bean> <managed-bean-name> loginBean </managed-bean-name> <managed-bean-class> premierProjetJSF.LoginBean </managed-bean-class> <managed-bean-scope> Session </managed-bean-scope> </managed-bean> Cebeanmanagpeutensuitetreutilisparlesautresressourcesdelapplication,enutilisantlidentifiantquilui correspond : loginBean. La page web contenant le formulaire dauthentification contient diffrents composants, dontunchamptextedetype HtmlInputText et un champ de mot de passe de typeHtmlInputSecret. Les balises reprsentantcescomposantsdoiventtreliesauxpropritsnameetpassworddeloginBean.Pourcela,lattribut debalisevalueestexploit:savaleurindiquelenomdubeanmanagetlapropritlieaucomposant. Notez galement la prsence de lattribut action de la balise <h:commandButton> reprsentant le bouton de soumission du formulaire. La valeur de cet attribut correspond un cas de navigation prvu dans le fichier de configurationdesressources:lemploiduboutondesoumissionentranedonclutilisationdececasdenavigation, et donc la poursuite de la navigation vers une autre page JSP (dont le rle peut consister rafficher les paramtresdauthentificationsaisis). <f:view> <h:form> <h:panelGrid border="1" columns="3"> <h:outputText value="Login:"></h:outputText> <h:inputText value="#{loginBean.name}" id="champCodeClient"> </h:inputText> <h:message for="champCodeClient" id="messageCodeClient"> </h:message> <h:outputText value="Mot de passe:"> </h:outputText> <h:inputSecret value="#{loginBean.password}" id="champMotPasse"> </h:inputSecret> <h:message for="champMotPasse" id="messageMotPasse"> </h:message> </h:panelGrid> <h:commandButton value="Valider" id="btnLogin" action="authentificationValide"> <f:actionListener type="premierProjetJSF.listeners.EvenementClicListener" /> </h:commandButton> </h:form> </f:view>

b.Liaisonenlecture
Danscetypedeliaison,lavaleurdunepropritdebeanmanagestlueenvuedesonaffichagedansunepage web. Le plus souvent, la valeur en question est prsente linternaute au travers de composants de type HtmlOutputTextouHtmlInputText. Mais dunemaniregnrale,ellepeuttreaffichedanstouslescomposants

- 2-

ENI Editions - All rigths reserved

graphiquesinstancispartirdeclassesdetypeUIOutputetUICommand. Pourfairesuitelexempleproposprcdemmentpourlaliaisonencriture,ilestpossibledemettreenplacela pageJSPquidoittredvoilelinternauteaprslavalidationduformulairedauthentification.Cettepagepeut parexemplesecontenterderafficherlesparamtresfournisparlutilisateur.Pourcela,lapageenquestionpeut comporterdeuxlabelsdetypeHtmlOutputTextdontlesbalisesquilesreprsententdisposentdunattributvalue. Par utilisation du langage dexpression propre JSF, la valeur de cet attribut doit rfrencer le bean manag loginBean, ainsi que la proprit adapte (name ou password). Voici un exemple de code source correspondant cetteattente: <f:view> <h:form> <h:outputText id="otxtTitre" value="Rappel des paramtres dauthentification saisis:" style="text-decoration: underline; font-weight: bold"> </h:outputText> <br> <h:outputText id="otxtLabelLogin" value="Login: "> </h:outputText> <h:outputText id="otxtLogin" style="color: #FF0000" value="#{loginBean.name}"> </h:outputText> <br> <h:outputText id="otxtLabelMotPasse" value="Mot de passe: "> </h:outputText> <h:outputText id="otxtMotPasse" style="color: #FF0000" value="#{loginBean.password}"> </h:outputText> <br> </h:form> </f:view>

2.Liaisondesmthodesdebeansmanags
Outrelaliaisonavecunepropritdebeanmanag,ilestpossibledelieruncomposantaveclune des mthodes dun JavaBean. Lillustration la plus classique de ce concept correspond la mise en uvre de la navigation dynamique. Leformulairedauthentificationprcdemmentvoqucontientuneillustrationdelanavigationstatiqueentrepages web : la balise reprsentant le bouton de commande destin valider le formulaire dispose en effet dun attribut action dont la valeur est fixe. Cette valeur correspond lun des cas de navigation prvus dans le fichier de configuration des ressources de lapplication web. Cela signifie que, dans toutes les situations, la validation du formulairedauthentificationimpliquesystmatiquementunenavigationverslammepageweb. Maistypiquement,ilseraitsouhaitabledliminerunetellerigiditenrendantpossibleunenavigationdynamique.En cas dchec de lauthentification, notamment, il serait intressant de ne pas autoriser la navigation vers la page suivante.Pourobtenircersultat,ilestpossiblededlguerletestdevaliditdelauthentificationaubeanmanag loginBean contenant les paramtres saisis par linternaute. Ce test de validit est alors assur par une mthode spcifiqueduJavaBean,dontlersultatpeutpotentiellementservirorienterdynamiquementlanavigationweb.Le code source suivant montre une mthode du bean loginBean dont le contenu permet de contrler trivialement les paramtresdauthentification: public String verificationAuthentification() { //Cette mthode renvoie une chane dont la valeur //peut servir orienter la navigation. //La valeur de la chane dpend du rsultat de //lauthentification. if (getPassword().equals("motdepasse1") && getName().equals ("utilisateur1")) return "authentificationValide"; else return null; }

ENI Editions - All rigths reserved

- 3-

La mthode verificationAuthentification est de type String. Elle renvoie la chane authentificationValide lorsque lauthentification est russie, ce qui correspond lun des cas de navigation prvu. En cas de saisie de paramtreserrons,lauthentificationchoueetlamthoderenvoienull. Il reste associer le rsultat de lexcution de cette mthode avec le bouton de soumission du formulaire, pour rendrelanavigationdynamique.Celasefaitsimplementparlebiaisdelattributdebaliseaction,dontlavaleurfait rfrenceaubeanmanagetlamthodeverificationAuthentificationgrceaulangagedexpression. <h:commandButton action="#{loginBean.verificationAuthentification}" value="Valider" id="btnLogin"> </h:commandButton>

- 4-

ENI Editions - All rigths reserved

Liaisondecomposantsdessourcesdedonnesexternes
La liaison de composants des proprits et mthodes trouve galement tout son intrt lorsquil sagitdexploiter dessourcesdedonnesexternes. Eneffet,ensuivantunedmarchevisantsparerclairementlesvuesduneapplicationwebdelacouchedaccsaux donnes,lespageswebnedoiventjamaisdisposerdunaccsdirectauxsourcesdedonnes.Ellesdoivent,dansle casdesapplicationsJava,exploiterdesclassesqui,ellesseules,peuventatteindrecessources.Enconsquence,lier un composant graphique JSF une source de donnes quivaut lier ce composant un JavaBean qui, lui seul, exploitelesdonnesdirectement. Considrons le cas dune page web charge de prsenter linternautelalistedesclientsdune boutique en ligne, dansunezonedelistedroulante.Lesinformationsconcernantlesclientssontstockesdansunetabledebasede donnes. Conformment au modle physique prsent cidessous, chaque client est reprsent par son nom, son prnometsonadresseemail.

Au niveau de linterface web, une zone de liste droulante peut correspondre un composant JSF de type HtmlSelectManyListBox. Un lment particulier de cette zone de liste est, quant lui, une instance de la classe javax.faces.model.SelectItemquipeuttrerestituedanslespageswebparunebalise<f:selectItem>.Lorsquela zonedelistecontientdenombreuxlments,ilesttrsprfrablederegrouperlatotalitdesitemsdansuneclasse de type ArrayList dont la restitution dans les pages web se fait par lintermdiaire dune unique balise <f:selectItems>. Enimaginantquelenombredeclientsdelaboutiquevirtuelleestimportant,leJavaBeanchargdaccderdirectement labasededonnespeutdonctreunreprsentantduneclasseissuedeArrayList.Parlexploitationdunerequte SQL adapte, cette classe rcupre lensemble des informations concernant les clients, puis cre un objet de type SelectItemspcifiquepourchaqueclienttrouv.NotezquelundesconstructeursdelaclasseSelectItempermetde mentionner la valeur et le label de llment de liste. Le code source suivant est celui dune classe rpondant lensembledecescritres. package premierProjetJSF; import import import import import java.sql.Connection; java.sql.DriverManager; java.sql.ResultSet; java.sql.Statement; java.util.ArrayList;

import javax.faces.model.SelectItem; public class ArrayPersonnes extends ArrayList { private void chargerDonnees() { String label, value; try { //Tentative de connexion une base de donnes //Postgresql. Class.forName("org.postgresql.Driver"); Connection cnx= DriverManager.getConnection ("jdbc:postgresql://localhost/boutiquevirtuelle","test","test"); //Rcupration de la liste des clients. Statement st=cnx.createStatement(); ResultSet rst= st.executeQuery("select * from clients"); Personne personne; //Parcours du jeu denregistrements while (rst.next()) { SelectItem element;

ENI Editions - All rigths reserved

- 1-

//Cration dun SelectItem en prcisant //sa valeur et son label. value=rst.getString("email"); label=rst.getString("prenom")+ " "+rst.getString("nom"); element=new SelectItem(value,label); //Ajout du SelectItem au ArrayList. this.add(element); } } catch (Exception exc) { System.out.println("Problme lors du chargement des donnes"); } } public ArrayPersonnes() { chargerDonnees(); } } Ce JavaBean doit tre dclar dans le fichier de configuration des ressources, en tant que bean manag de porte session.Celalerendraaccessibletouteslesautresressourcesdelapplication. <managed-bean> <managed-bean-name> listePersonnes</managed-bean-name> <managed-bean-class> premierProjetJSF.ArrayPersonnes</managed-bean-class> <managed-bean-scope> session</managed-bean-scope> </managed-bean> LebeanmanagestidentifiparlenomlistePersonnes.Lapagewebchargedeprsenterlensembledesclients linternaute doit comporter une balise<h:selectManyListBox> disposant dune unique balise enfant<f:selectItems>. Cettedernirepermetderestituerlatotalitdeslmentsdelazonedelistedroulante:lavaleurdesonattribut valuedoitfairerfrenceaubeanmanaglistePersonnesparlintermdiairedulangagedexpressionJSF. Defait,onconstatelexcutionquelazonedelistedvoileeffectivementlesinformationsattenduesconcernantles clients de la boutique virtuelle. Chaque lment de cette liste est traduit en langage HTML par une balise <option> comportantlelabeletlavaleurduSelectItemgnrdanslebeanmanag. <f:view> <h:form> <h:outputText value="Liste des clients de la boutique virtuelle" style="font-size: 24px; font-weight: bold"> </h:outputText><br> <h:selectManyListbox size="10"> <f:selectItems value="#{listePersonnes}"/> </h:selectManyListbox> <br> <h:commandButton action="voirLesSelections" value="Valider"> </h:commandButton> </h:form> </f:view>

- 2-

ENI Editions - All rigths reserved

Conceptiondunconvertisseurpersonnalis
La spcification JSF propose en standard treize convertisseurs. Deux dentre eux sont utilisables directement par le designerlorsdelaconceptiondespagesduneapplicationweb.
q

LepremierestissudelaclasseNumberConverter:sonrleconsistetenterlaconversiondelavaleursaisie dansunchampdeformulairepourlarendrecompatibleaveclapropritdebeanmanagauquelestassoci ce champ de saisie. Ce convertisseur standard ralise galement un traitement rciproque, dans lequel la valeurdunepropritnumriquedunbeanmanagestconvertieenchanedecaractresafindepouvoirtre prsentedansunepageweb. LesecondestdetypeDateTimeConverter.IlassuredestentativesdeconversiondelaclasseString vers la classeDate,etrciproquement.Ilpermetdesassurerquelavaleursaisieparuninternautedansunchampde formulaireparticulierrespectebienunformatagecompatibleavecunedate,etquellepeutdonctrestocke entantquevaleurdunepropritdeJavaBeandetypeDate.linverse,ceconvertisseursertaussivrifier que quune proprit de type Date dun JavaBean peut voir sa valeur affiche dans une page web sous la formedunechanedecaractres.

Vous trouverez de plus amples informations sur les convertisseurs standards la section Exploitation des convertisseursstandardsduchapitreExploitationdescomposantsstandardsJSF. Malgr la souplesse propose lors de lexploitation de ces convertisseurs standards et le large champ dapplication quilscouvrent,ceuxcipeuventnepasconvenirdanscertainscontextes.Lestraitementsquilsralisentpeuventpar exemplesavrertropsuccincts,ouaucontrairetroppousss.Ilfautalorsenvisagerlaconceptiondeconvertisseurs personnaliss,rpondantpleinementcertainescontraintesspcifiques.Pourcela,danslecadredelamiseenplace dapplicationswebbasessurlatechnologieJSF,ilestncessairededvelopperuneclassereprsentantlenouveau convertisseur,puisdeladclarerentantquenouveaucomposantdanslefichierdeconfigurationdesressourcesde lapplication. Lensemble des autres ressources, en particulier les pages web, peut alors exploiter le nouveau convertisseur.

1.Dfinitiondelaclassereprsentantleconvertisseur
Uneclassedfinissantunconvertisseurdoitimprativementimplmenterlinterfacejavax.faces.convert.Converter. Celleciprvoitdeuxmthodes,getAsStringetgetAsObject.Lapremiredoitpermettredassurerlaconversiondune chanedecaractresenuneinstancedetypeObject,alorsquelasecondeeffectuelaconversioninverse.Voiciles signaturesdecesdeuxmthodes: Object getAsObject(FacesContext context, UIComponent component, String value) String getAsString(FacesContext context, UIComponent component, Object value) Endehorsdutypeetdunomdecesmthodes,lasignaturedecellescinediffrentqueparleurtroisimeargument qui reprsente lobjet qui doit tre converti. Le premier argument correspond au contexte JSF, cestdire celui de lapplication web ellemme, alors que le second argument est une rfrence au composant JSF pour lequel la conversionestdemande. Lesinstructionscontenuesdanslecorpsdecesmthodespeuventtrequelconques.Laseulecontrainteexistante, mis part le fait que la mthode doit au final renvoyer un objet du type adapt, concerne la situation o la conversionnepeutpastreassure:ilfautdanscecasintroduireuneinstructionprovoquantlagnrationdune exceptiondetypeConverterException. Lecodesourcequisuitcorrespondladfinitionduneclasserpondanttouslescritresrequispourconstituerun nouveau type de convertisseur. Le rle de ce nouveau convertisseur est de tenter la conversion dune chane de caractresenvaleurnumriqueentirepositivepaire.Lessituationsprovoquantunchecdelaconversionsontles suivantes:
q

Lachanesaisienecorrespondpasunevaleurnumrique. Lachanesaisieestunevaleurnumriquengative.

ENI Editions - All rigths reserved

- 1-

Lachanesaisieestunevaleurnumriquepositiveimpaire.

Lorsque lune de ces situations est rencontre, une ConverterException est gnre : celleci est constitue dun messagederreurexpliciteutilispourinstancierun FacesMessagequipeutpotentiellementtrercuprauniveau delinterfacewebafindtreprsentlinternaute. Danslecasdunedemandedeconversioninverse,cestdire une conversion du typeObject vers le typeString, aucun traitement nest propos ici, dans un souci de simplification du code prsent. La mthode getAsObject se contentedoncderenvoyerlavaleurnull. package premierProjetJSF; import import import import import javax.faces.application.FacesMessage; javax.faces.component.UIComponent; javax.faces.context.FacesContext; javax.faces.convert.Converter; javax.faces.convert.ConverterException;

public class NombrePairPositifConverter implements Converter { public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) { //Tentative de conversion de arg2 en objet //de type NombrePairPositif. int laValeurNumerique; NombrePairPositif nombrePair; try { //Tentative de conversion de largument arg2 //en valeur de type int. //Cela peut bien sr provoquer //une NumberFormatException. laValeurNumerique=Integer.parseInt(arg2); //Tentative de conversion en objet //de type NombrePairPositif. //L encore, une Exception est susceptible //dtre gnre. nombrePair=new NombrePairPositif(laValeurNumerique); //Largument arg2 est bien un nombre pair positif. return nombrePair; } catch (Exception exc) { String msg=exc.getMessage(); //Personnalisation du message en cas //de NumberFormatException. if (exc.getClass()==NumberFormatException.class) msg="Valeur non numrique"; //Renvoi dune ConverterException avec gnration //dun FacesMessage contenant le motif de lchec //de la conversion. throw new ConverterException(new FacesMessage(msg)); } } public String getAsString(FacesContext arg0, UIComponent arg1,Object arg2) { return null; } }

- 2-

ENI Editions - All rigths reserved

NotezenfinquelesinstructionsquicomposentcenouveauconvertisseurfontappeluneclasseNombrePairPositif, reprsentant un nombre pair positif. En ralit, la raison mme du nouveau convertisseur est de sassurer quune chanedecaractresourcepeuteffectivementtreutilisepourcreruneinstancedelaclasseNombrePairPositif. Le code source de cette classe est prsent cidessous. Il sagit dun simple JavaBean ralisant un test trivial au momentdelamisejourdunepropritvaleurEntierePositiveetgnrantuneexceptionlecaschant. package premierProjetJSF; public class NombrePairPositif { int valeurEntierePositive; public NombrePairPositif() {valeurEntierePositive=0;} public NombrePairPositif(int valeur) throws Exception { setValeur(valeur); }

public int getValeur() {return valeurEntierePositive;} public void setValeur(int val) throws Exception { if (val<0) throw new Exception("Impossible de dfinir un nombre pair positif partir dune valeur ngative."); if ((val%2)!=0) throw new Exception("Impossible de dfinir un nombre pair positif partir dune valeur impaire."); valeurEntierePositive=val; } }

2.Dclarationdunouveaucomposant
Pour quune application web puisse exploiter une classe reprsentant un nouveau type de convertisseur, cette dernire doit tre dclare explicitement dans le fichier de configuration des ressources. La dclaration se fait par lintermdiairedelabalise<converter>etdedeuxbalisesenfantsobligatoires<converter-id>et<converter-class>. Il est possible dadjoindre dautres balises enfants pour complter cette dclaration, mais elles ne sont pas indispensables : cellesci peuvent notamment servir donner un descriptif du convertisseur (balise <displayname>), ou indiquer la valeur par dfaut de certains de ses attributs (balises <attribute>, <attribute-class>, <attribute-class>et<default-value>). Le code XML suivant correspond la dclaration de la classe NombrePairConverterConverter en tant que nouveau type de convertisseur dune application web. Cette dclaration se limite la prcision du nom de la classe (converter-class),delidentifiantutilisableparlesautresressourcespourtirerprofitdececonvertisseur(converterid)etdesadescription(display-name). <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"> ... <converter> <display-name> convertisseurNombrePairPositif</display-name> <converter-id> monConvertisseurNombrePairPositif</converter-id> <converter-class> premierProjetJSF.NombrePairPositifConverter</converter-class> </converter> ... </faces-config>

ENI Editions - All rigths reserved

- 3-

PrcisonsqueladclarationdunnouveauconvertisseursefaitfacilementdanslenvironnementEclipse:aprsavoir affichlefichierdeconfigurationdesressourcesdanslazoneddition,ilfautslectionnerlongletComponentpuis activer la rubrique Converters. Le formulaire de saisie qui se prsente alors permet de mentionner tous les paramtresncessairespourassurerladclarationsouhaite.

3.Faireappelaunouveauconvertisseurdanslespagesweb
Unefoisquelaclassecorrespondantaunouveautypedeconvertisseurestdveloppeetdclaredanslefichierde configurationdesressourcesdelapplicationweb,ilestpossibledefaireusagedunouveaucomposantdepuistoutes lesautresressources. Concernant les pages JSP de lapplication, la dmarche dutilisation du nouveau convertisseur est identique celle suivie pour lexploitation des convertisseurs standards : l o sont utilises les balises de restitution <f:convertNumber> ou<f:convertDateTime>, on fait appel la balise de restitution <f:converter>pourassocierun convertisseur personnalis un composant graphique JSF. Cette balise doit obligatoirement faire mention dun attributconverterIddontlavaleurdoitcorrespondrecelledelabalise<converter-id>,indiquedanslefichierde configurationdesressources. Voici un exemple de page JSP exploitant le convertisseur personnalis didentifiant monConvertisseurNombrePairPositif.CeluiciestassociunchampdesaisiedetypeHtmlInputText.Aumomentde la validation du formulaire contenant ces deux composants, le convertisseur tentera de raliser la conversion demande en sassurant que la chane saisie par linternaute peut effectivement tre utilise pour constituer une instancedelaclasseNombrePairPositif.Lorsquecetteconversionnestpaspossible,uneexceptionestgnrepar leconvertisseuretlemotifdelchecdelaconversionestprsentlinternauteparlebaisduncomposantdetype HtmlMessage. <f:view> <h:form> <H1><u> Test dun convertisseur JSF personnalis </u></H1> <h:outputText value="Tentative de conversion en objet de type NombrePairPositif" style="color: #0000FF"> </h:outputText> <br><br> <h:message for="txtSaisie" style="color: #FF0000; background-color: #FFFF00"> </h:message> <br> <h:outputText value="Si vous tapez ici une lettre, un nombre ngatif, ou un nombre impair, une erreur de conversion se produira."> </h:outputText> <br> <h:inputText id="txtSaisie">

- 4-

ENI Editions - All rigths reserved

<f:converterconverterId="monConvertisseurNombrePairPositif"/> </h:inputText> <br> <h:commandButton value="Tester la valeur saisie" action="succesConversion"> </h:commandButton> </h:form> </f:view>

ENI Editions - All rigths reserved

- 5-

Crationdunvalidateurpersonnalis
QuatrevalidateurssontpropossenstandardparlaspcificationJSF,maisseulstroisdentreeuxpeuventtreutiliss aucoursdelaconceptiondapplicationswebaveclenvironnementdedveloppementEclipse.Cesvalidateurssontles suivants:
q

LevalidateurdetypeDoubleRangeValidator,quipermetdecomparerlavaleurduncomposantgraphiqueJSF avecdeuxvaleursminimumetmaximum.Ilprendenchargelesnombresentiers,ainsiquelesnombresdcimaux. Le validateur de type LongRangeValidator, qui effectue un traitement similaire celui entrepris par le DoubleRangeValidator,endehorsdufaitquilneprennepasencomptelesnombresdcimaux. Le validateur de type LengthValidator : il teste la longueur de la chane de caractres correspondant la valeurduncomposantJSFspcifique,enlacomparantavecdeuxlimitesmaximumetminimum. Le validateur de type MethodExpressionValidator : son rle consiste vrifier le format dun objet de type MethodExpression,ensassurantquilcorrespondbienlappeldunemthodesurunobjet.Cevalidateurnest pasdisponiblelorsdelamiseenplacedapplicationsweb.

Bienquecesvalidateursstandardspermettentderpondreungrandnombredebesoins,ilspeuventnepastre adapts certaines situations particulires. Il revient alors aux concepteurs dune application web denvisager llaboration de validateurs personnaliss, en gnral chargs de raliser des vrifications nettement plus pousses surlesvaleursdesdiffrentscomposantsJSFdisposssurlespagesweb.Ladmarchedecrationetdutilisationde validateurspersonnalissestsimilairecellequiatvoqueproposdesconvertisseurspersonnaliss:ilconvient toutdaborddeconcevoirlaclasseJavaquipermettradinstancierlenouveauvalidateur,puisdeladclarerdansle fichier de configuration des ressources de lapplication web. Il reste ensuite faire appel au validateur personnalis danslesdiffrentespagesweb,parlexploitationdunebalisederestitutionadapte.

1.Dfinitiondelaclassereprsentantlevalidateurpersonnalis
Unvalidateuresttoujoursunobjetissuduneclasseimplmentantlinterfacejavax.faces.validator.Validator.La constitutionduneclassecorrespondantunnouveautypedevalidateuramnedoncncessairementledveloppeur respectercettecontrainte,enlobligeantdclareretimplmenterunemthodevalidatedontlasignatureestla suivante: void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException LesargumentsdecettemthodeindiquentquelavalidationportesurlavaleurvalueduncomposantJSFcomponent, etquelleconcerneuneapplicationwebspcifique,identifieparlecontextecontext.Parailleurs,lasignaturedela mthode validate prcise galement que celleci est susceptible de dclencher une exception de type ValidatorException. Cela doit effectivement tre le cas dans toutes les situations o la validation de la valeur du composant est en chec. ce sujet, les raisons qui dterminent le succs ou lchec dune validation dpendent entirement du contexte dans lequel vient sinsrer lapplication web mettre en place. Ces raisons sont bien sr traduitesdanslimplmentationdelamthodevalidate. LaclasseJava,dontlecodesourceestprsentcidessous,correspondunvalidateurpersonnalispermettantde sassurerquelavaleurduncomposantJSFestunechanecaractriseparleslmentssuivants:
q

SalongueurestaumoinsgalelavaleurdelapropritminimumLength. EllecontientaumoinslundescaractresspciauxdfinisdanslapropritcaracteresSpeciaux. EllecontientunnombredecaractreschiffrsaumoinsgallavaleurdelapropritnombreChiffres.

Typiquement, un tel validateur peut tre utilis pour forcer un internaute saisir un mot de passe disposant de critresprcis.Lamthodevalidatedecetteclasseindiquelestroisvrificationssontralisessuccessivement,et quechacunedellespeutdonnerlieulagnrationduneexceptiondetypeValidatorExceptionlorsquelecritre test nest pas respect. Dans ce cas, une chane de caractres dcrivant le motif de lchec de la validation est utilispourinstancierunobjetdetypeFacesMessage.Cetobjetpeutpotentiellementtrercuprauniveaudela

ENI Editions - All rigths reserved

- 1-

pageweb,pourtreprsentlinternaute,siuncomposantdetypeHtmlMessageouHtmlMessagesyatplac. package premierProjetJSF; import import import import import javax.faces.application.FacesMessage; javax.faces.component.UIComponent; javax.faces.context.FacesContext; javax.faces.validator.Validator; javax.faces.validator.ValidatorException;

public class ValidatorPassword implements Validator { int minimumLength; char[] caracteresSpeciaux; int nombreChiffres; String message_minimumLength; String message_caracteresSpeciaux; String message_nombreChiffres; private boolean checkMinimumLength(String chaine){ //Renvoie vrai si la longueur minimale est respecte. if (chaine.length()<getMinimumLength()) return false; else return true; } private boolean checkCaracteresSpeciaux(String chaine) { //Renvoie vrai si au moins lun des caractres //spciaux est dans la chane. char[] tableau=getCaracteresSpeciaux(); char caractere; for (int i=0;i<tableau.length;i++) { for (int j=0;j<chaine.length();j++) { caractere=chaine.charAt(j); if (caractere==tableau[i]) return true; } } return false; } private boolean checkNombreChiffres(String chaine){ //Retourne vrai si la chane contient //un nombre de chiffres au moins gal au rsultat //de la mthode "getNombreChiffres()". //Retourne false dans le cas contraire. int nb=0; for (int i=0;i<chaine.length();i++) { try { Integer.parseInt((new Character(chaine.charAt(i))). toString()); nb++; } catch (NumberFormatException nfe) {} } if (nb>=getNombreChiffres()) return true; else return false; } private String getMessageMinimumLength() String chaine="Doit contenir au moins "+getMinimumLength()+" caractre(s)!"; return chaine; } private String getMessageNombreChiffres() String chaine="Doit contenir au moins "+getNombreChiffres()+" chiffre(s)!"; return chaine; } private String getMessageCaracteresSpeciaux(){ {

- 2-

ENI Editions - All rigths reserved

String chaineCarac=""; char[] tableau=getCaracteresSpeciaux(); for (int i=0;i<(tableau.length-1);i++) { chaineCarac+=tableau[i]+", "; } chaineCarac+="ou "+tableau[tableau.length-1]; String chaine="Doit contenir au moins lun des caractres suivants: "+chaineCarac; return chaine; } public ValidatorPassword() { //Dfinition des caractres spciaux par dfaut. char[] spec={#,%,&,$,=}; setCaracteresSpeciaux(spec); //Dfinition de la valeur minimale par dfaut. setMinimumLength(6); //Dfinition du nombre de chiffres utiliser par dfaut. setNombreChiffres(2); } public int getMinimumLength() {return minimumLength; }

public void setMinimumLength(int minimumLength) { //Seules les valeurs positives ou nulles sont acceptes. if (minimumLength>=0) this.minimumLength = minimumLength; } public void validate(FacesContext arg0, UIComponent arg1, Object arg2) throws ValidatorException { String pwd=arg2.toString(); if (!checkMinimumLength(pwd)) throw new ValidatorException(new FacesMessage(getMessageMinimumLength())); if (!checkCaracteresSpeciaux(pwd)) throw new ValidatorException(new FacesMessage(getMessageCaracteresSpeciaux())); if (!checkNombreChiffres(pwd)) throw new ValidatorException(new FacesMessage(getMessageNombreChiffres())); } public char[] getCaracteresSpeciaux() { return caracteresSpeciaux; } public void setCaracteresSpeciaux(char[] caracteresSpeciaux) { this.caracteresSpeciaux = caracteresSpeciaux; } public int getNombreChiffres() {return nombreChiffres;} public void setNombreChiffres(int nombreChiffres) { //Seules les valeurs positives ou nulles sont acceptes. if (nombreChiffres>=0) this.nombreChiffres = nombreChiffres; } }

2.Dclarationdunouveaucomposant
Afinderendreunnouveauvalidateurdisponiblelensembleduneapplicationweb,celuicidoittredclarcomme teldanslefichierdeconfigurationdesressources.Celasefaitparlintermdiairedunebalise<validator>disposant deplusieursbalisesenfantspermettantdeprciserlescaractristiquesduvalidateur:

ENI Editions - All rigths reserved

- 3-

<validator-id>:cettebaliseobligatoiresertindiquerparquelidentifiantlenouveauvalidateurpourratre invoquparlesdiffrentesressourcesdelapplication. <validator-class>:permetdespcifierlenomcompletdelaclassepartirdelaquellelevalidateurpourra treinstanci.Cettebaliseestbiensrobligatoire. <display-name>:permetdeprciseruntextedescriptifduvalidateur. <attribute>,<attribut-name>, <attribute-class>et<default-value>:sertdfinirlenom,laclasseetla valeurpardfautdunattributspcifiquedelabalise<f:validator>reprsentantlevalidateurpersonnalis danslapageweb.

Comptetenudecesinformations,ladclarationdelaclasseValidatorPasswordcommevalidateurpersonnalispeut treralisedanslefichierdeconfigurationdesressourcesparlecodeXMLsuivant : <validator> <display-name> Validation du mot de passe</display-name> <validator-id> monValidateurDeMotDePasse</validator-id> <validator-class> premierProjetJSF.ValidatorPassword</validator-class> <attribute> <attribute-name>param1</attribute-name> <attribute-class>java.lang.Integer</attribute-class> <default-value>4</default-value> </attribute> <attribute> <attribute-name>param2</attribute-name> <attribute-class>java.lang.Integer</attribute-class> <default-value>3</default-value> </attribute> </validator> Depuis lenvironnement Eclipse, une telle dclaration se fait simplement lorsque le fichier de configuration des ressourcesestprsentdanslazoneddition:ilfautslectionnerlongletComponent,puislarubriqueValidators, pour visualiser un formulaire de saisie spcifique aux validateurs personnaliss. Par lutilisation de celuici, le concepteurdelapplicationpeutindiquerlensembledescaractristiquesdunouveauvalidateur.

3.Faireappelaunouveauvalidateurdanslespagesweb
Lorsquelaclassecaractrisantlenouveauvalidateurestdveloppe,etquecelleciestdclaredanslefichierde configuration des ressources, le composant personnalis peut tre utilis dans les diffrentes pages web dune application. Un validateur personnalis est associ un composant JSF spcifique par utilisation dune balise <f:validator> disposantdunattributvalidatorId.Cetattributpermetdeprciserlidentifiantduvalidateur,telquilestdonndans le fichier de configuration des ressources. Dautres attributs peuvent ventuellement tre prciss pour la balise <f:validator>,conditionqueceuxciaienttprvus. LecodesourcesuivantillustrelexploitationduvalidateurpersonnalisdidentifiantmonValidateurDeMotDePasse,issu delaclasse ValidatorPassword.Cevalidateuresticiutilispourcontrlerlasaisieralisedansunchampdetype HtmlInputSecret. Au moment de la soumission du formulaire, le validateur vrifie que tous les critres requis sont respects(longueurminimale,nombredecaractresspciaux,nombredecaractreschiffrs).Silavalidationchoue, lasoumissionduformulaireestinterrompueetunmessagecorrespondantlaValidatorExceptionestprsent linternauteparlebiaisdunobjetHtmlMessage. <f:view> <h:form> <h:panelGrid border="1" columns="3"> <h:outputText value="Login:"> </h:outputText> <h:inputText value="#{loginBean.name}" id="champCodeClient"> </h:inputText> <h:message for="champCodeClient" id="messageCodeClient">

- 4-

ENI Editions - All rigths reserved

</h:message> <h:outputText value="Mot de passe"></h:outputText> <h:inputSecret value="#{loginBean.password}" id="champMotPasse"> <f:validator validatorId="monValidateurDeMotDePasse" /> </h:inputSecret> <h:message for="champMotPasse" id="messageMotPasse"> </h:message> </h:panelGrid> <h:commandButton action="#{loginBean.verificationAuthentification}" value="Validation id="btnLogin"> </h:commandButton> </h:form> </f:view>

ENI Editions - All rigths reserved

- 5-

Introduction
Ce chapitre expose la dmarche permettant de crer de nouveaux composants graphiques sappuyant sur la technologieJavaServerFaces.Ilcomporteunexempleillustrantlaconceptionduncomposantpersonnalisdestin raliserdelaffichagesimple,ainsiquunexemplemontrantcommentlaboreruncomposantpersonnalispermettant lasaisiedinformations. Laconceptionetlutilisationdunnouveaucomposantgraphiquepersonnalisrequiertplusieurstapes :
q

Conceptiondelaclassergissantlecomportementdunouveaucomposant. Dclarationducomposantdanslefichierdeconfigurationdesressources. MiseenplacedunfichierTLDcomprenantlescaractristiquesdelabalisechargedereprsenterlenouveau composantdanslespagesJSPdelapplicationweb. DfinitionduneclassefaisantofficedeTagHandlerassocilabalisereprsentantlenouveaucomposant. Si ncessaire, conception dune (ou de plusieurs) classe(s) charge(s) dassurer la restitution graphique du composantauniveaudelinterfaceweb.Lorsquecettepossibilitestexploite,ilestindispensabledemodifier lefichierdeconfigurationdesressourcespourquecetteclassederestitutionsoitexploitableparlapplication web. Association ventuelle de gestionnaires dvnements, de validateurs et de convertisseurs au nouveau composant. DveloppementdespagesJSPexploitantlecomposantgraphiquepersonnalis.

ENI Editions - All rigths reserved

- 1-

laboration des classes rgissant le comportement des nouveaux composants


Lesactionsentreprendredanscettetapevarientsensiblementcomptetenudutypedecomposantcrer(lecture seule ou saisie autorise). Des nuances sont galement clairement observes si lon considre que le nouveau composant doit grer luimme sa restitution graphique au sein des pages web, ou au contraire la dlguer un Rendererparticulier. Cependant, dans toutes les situations, la classe reprsentant un nouveau composant graphique personnalis doit imprativement driver de la classe UIComponentBase. Le nom de la classe crer peut tre choisi librement, en sachanttoutefoisquelescomposantsdestinstreaffichsdanslespageswebdoiventconventionnellementtre dfinispardesclassesdontlenomcommenceparHtml.

1.Crationduncomposantdestinlaffichagesimple(lectureseule)
Considronsunexemplesimpledanslequeluncomposantgraphiquepersonnalisestchargdeprsenterlheure courantelinternaute.

a.Silecomposantgreluimmesarestitutiongraphique
Pourquelecomposantpuisseassurersaproprerestitutiongraphique,laclassequilereprsentedoitimplmenter lune des mthodes encodeBeginet encodeEnd, dfinies dans la classe parenteUIComponentBase. Il est galement possiblededfinircesdeuxmthodessimultanment,commelemontrelecodesourceprsentcidessous. La mthode encodeBegin est invoque lors de linterprtation de la balise ouvrante reprsentant le composant, alors que la mthode encodeEnd est exploite au moment de linterprtation de la balise fermantecorrespondante.

package premierProjetJSF.composantsPersonnalises; import java.io.IOException; import java.util.Calendar; import javax.faces.component.html.HtmlOutputText; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; public class HtmlHeureCourante extends HtmlOutputText { @Override public void encodeBegin(FacesContext context) throws IOException { //Rcupration de lheure courante. Calendar calendrier=Calendar.getInstance(); String heureCourante= calendrier.get(Calendar.HOUR)+":" +calendrier.get(Calendar.MINUTE)+":"

ENI Editions - All rigths reserved

- 1-

+calendrier.get(Calendar.SECOND); //Rcupration dun rfrence au flux de sortie. ResponseWriter out=context.getResponseWriter(); String intitule="Il est actuellement "; String reponse="<b>"; reponse+=intitule+": "+heureCourante; out.write(reponse); } @Override public void encodeEnd(FacesContext context) throws IOException { //Rcupration dun rfrence au flux de sortie. ResponseWriter out=context.getResponseWriter(); String reponse="</b>"; out.write(reponse); } } Cesdeuxmthodesacceptentenparamtreunerfrenceaucontextedelapplicationweb.Grceceluici,une rfrence au flux de sortie peut tre obtenue, puis utilise pour prsenter le message attendu au niveau de linterfacegraphique.

b.SilecomposantdlguesarestitutiongraphiqueunRendererspcifique
Dans certaines situations, il peut tre intressant de ne pas fixer dfinitivement la restitution graphique dun composant personnalis : dans ce cas, la charge de la restitution doit tre confie un Renderer particulier. Le designer de lapplicationwebdisposealorsdelapossibilitdechoisirlapparenceducomposant,comptetenude lvolutiondescontraintesgraphiquesrespecter,enslectionnantunRendereradapt.Lecomposantprcdent peutparexempleprsenterlersultatattendu,souslaformeduntexteencadrcritenrougesurfondjaune:

UncomposantpersonnalispeutdlguerlarestitutiongraphiqueunRendereraumomentdelinterprtationde labalise ouvrantecorrespondantaucomposant,ouaumomentdelinterprtationdelabalisefermante,oudans les deux cas. Suivant le choix effectu, les mthodes encodeBegin et/ou encodeEnd ne doivent pas tre implmentes dans la classe reprsentant le composant : elles doivent ltre dans la classe correspondant au Renderer.Parcontre,laclassedunouveaucomposantdoitobligatoirementdfinirunemthodegetFamily,dontle rleconsisterenvoyerunechanedecaractresidentifiantlenomdelafamilleducomposant.Cenompeuttre choisi librement, mais doit permettre de slectionner un Renderer particulier : il doit donc correspondre aux informationsspcifiesdanslefichierdeconfigurationdesressources,aumomentdeladclarationdunRenderer (voir la section Constitution du rendu des composants personnaliss Dclaration du nouveau Renderer dans le fichierdeconfigurationdesressourcesdelapplicationdecechapitre). Lecodesourcesuivantillustrelacrationdun composantHtmlHeureCourante2,ralisantlammeactionquecelui prsentprcdemment.Cecomposantconservelachargedelarestitutiongraphiquedelabalisefermantequile reprsente (la classe implmente la mthode encodeEnd), mais dlgue la restitution de sa balise ouvrante un Renderer.LeRendererenquestionnestbiensrpasprcisici,puisquelintrtdecetartificetechnologiqueest depermettreaudesignerwebdechoisirlibrementceluici.Parcontre,laclasseimplmentelamthodegetFamily, qui renvoie la chane heureCourante2 identifiant la famille du nouveau composant : cette chane est utilise par limplmentationJSFpouridentifierunRendereradapt. package premierProjetJSF.composantsPersonnalises; import java.io.IOException;

- 2-

ENI Editions - All rigths reserved

import javax.faces.component.html.HtmlOutputText; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; public class HtmlHeureCourante2 extends HtmlOutputText { public void encodeEnd(FacesContext context) throws IOException { //Surcharge la mthode encodeEnd du Renderer //ventuellement associ. ResponseWriter out=context.getResponseWriter(); String reponse="</b>"; out.write(reponse); } @Override public String getFamily() { return "heureCourante2"; } }

SilesmthodesencodeBeginet/ouencodeEndsontdfiniesconjointementaveclamthodegetFamily,leur implmentationserautiliseprioritairementcelleproposedansleRendererassociaucomposant.

2.Crationduncomposantpermettantlasaisiedinformations
De manire pouvoir disposer de toutes les caractristiques lies aux champs de saisies standards de la spcificationJSF,lescomposantsdesaisiepersonnalissdoiventobligatoirementtreissusdeclassesdrivesde UIInput. CesclassesdoiventimplmenterlamthodeencodeEnd,demanireassurerlarestitutiongraphiqueducomposant, toutenpermettantlapriseenchargedeconvertisseursventuellementassocisceluici. Par ailleurs, il convient galement de permettre un accs aux paramtres passs dans la chane de requte au momentdelasoumissionduformulairedanslequelsontinsrsleschampsdesaisiepersonnaliss.Cetaccsest assurparlimplmentationdelamthodedecodedanslesclassescorrespondantauxcomposants. Imaginonsprsentlaconceptionduncomposantgraphiquepluscomplexequeceluitraitprcdemment,compos dun label, dune zone de texte et dun bouton. Ce type de composant peut par exemple servir la saisie dune adresseemaildansunformulaireweb,commelemontrelillustrationsuivante:

Lecodesourcequisuitestuneimplmentationpossiblepouruntelcomposant: package premierProjetJSF.composantsPersonnalises; import java.io.IOException; import java.util.Map; import javax.faces.component.UIInput; import javax.faces.context.ExternalContext;

ENI Editions - All rigths reserved

- 3-

import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; public class HtmlInputButton extends UIInput { private String getIdChampNom(FacesContext contexte) { return getClientId(contexte)+":email"; } private String getIdSoumission(FacesContext contexte) { return getClientId(contexte)+":soumission"; } @Override public void encodeEnd(FacesContext context) throws IOException { //Rcupration dun rfrence au flux de sortie. ResponseWriter out=context.getResponseWriter(); //Rcupration de la valeur ventuellement dj saisie //dans ce composant. String laValeur=(String)this.getValue(); //Dfinition des labels String labelChamp="Saisissez votre email: "; String labelBouton="Cliquez pour valider"; //Dfinition de la chane de caractres restituant le //composant au sein du flux de sortie //(interface web, gnralement) String reponse=labelChamp +"<input type=text name="+getIdChampNom(context) +" value="+laValeur+">"; reponse+="<input type=submit value="+labelBouton+" name="+getIdSoumission(context)+">"; //criture de la chane sur le flux de sortie. out.write(reponse); } @Override public void decode(FacesContext context) { ExternalContext externalContext =context.getExternalContext(); Map<String, String> parametresRequete =externalContext.getRequestParameterMap(); String idChampSaisie=getIdChampNom(context); //Rcupration de lid du champ de saisie //dans la requte. String champSaisiRequete =parametresRequete.get(idChampSaisie); //Mise jour de la proprit interne correspondant au //champ de saisie. setSubmittedValue(champSaisiRequete); } } LamthodeencodeEndassurelarestitutiongraphiqueducomposant,enrenvoyantverslefluxdesortieunechane de caractres correspondant lensemble des balises HTML ncessaires. Cette chane se compose donc dunlabel associ au champ de saisie, dune balise <input type=text> reprsentant le champ de saisie luimme, et du boutondesoumissioncorrespondantlabalise<input type=submit>. Cesdeuxbalisesdoiventimprativementdisposerdunattributnameafindepouvoirtreprisesenchargeaumoment delasoumissionduformulaire.Lavaleurdecesattributsdevantncessairementtreuniqueauseinduformulaire, cellecipeutsobtenirdynamiquementparappeldelamthodegetClientId.

- 4-

ENI Editions - All rigths reserved

Il est par ailleurs souhaitable que linformation saisie par linternaute puisse tre raffiche dans le composant lui mme,aprsvalidationduformulaire,danslecasouneerreurdevalidationoudeconversionsurvient:ilfautpour cela faire appel la mthode getValue, charge de renvoyer la prcdente valeur du composant. Il est toutefois ncessairedeprciserquelavaliditdecettevaleurnepeuttregarantiequesilecomposantassureeffectivement la prise en charge des informations passes dans la chane de requte. Cette prise en charge, ralise par la mthodedecodedelaclasse,consistercuprerlensembledesparamtresderequteparappeldelamthode getRequestParameterMap,puisisolerleparamtrecorrespondantauchampdesaisie:lavaleurdeceparamtreest alors utilise pour mettre jour la valeur du composant personnalis, par linvocation de la mthode setSubmittedValue.

3.Permettrelapriseenchargedesattributsdebalise
Quecesoitpourlaconceptiondecomposantspersonnalissenlectureseule,oupourcellerelativeauxcomposants permettant la saisie, il peut tre intressant de permettre lutilisation dattributs de balises pour faciliter la personnalisationdescomposantsgraphiques. Lexempleprcdentgagneraiteffectivementensouplessesiltaitpossible,notamment,depersonnaliserlelabeldu champ de saisie ainsi que celui du bouton de soumission, grce aux attributs de la balise correspondant au composant personnalis. Pour obtenir un tel rsultat, il faut lgrement modifier le code source de la mthode encodeEnd,chargederestituergraphiquementlabalisedefermetureducomposant.Lesmodificationsdoiventporter surlattributiondevaleurs,initialementfixes,auxvariableslocaleslabelChampetlabelBouton: String labelChamp= (String)getAttributes().get("labelChampSaisie"); String labelBouton= (String)getAttributes().get("labelBoutonSoumission"); Lappel de la mthode getAttributes permet de rcuprer une collection contenant toutes les proprits du composant personnalis. Lobtention dune proprit particulire est ralise par appel de la mthode get sur la collection,laquellelenomdelaproprittrouverestpassenparamtre.Danslexemplepropos,lesproprits labelChampSaisie et labelBoutonSoumission sont recherches : cellesci correspondent aux attributs de balise que lon souhaite utiliser pour dfinir respectivement le label du champ de saisie, et celui du bouton de soumission. Linstruction suivante est un exemple de balise reprsentant le composant personnalis : celleci se nomme composantInputButtonetdisposedesdeuxattributsvoqus. <composantPerso:composantInputButtonlabelChampSaisie="Saisissez votre email: " labelBoutonSoumission="Cliquez pour valider"/>

Malgrcesmodificationsdanslecodesourcedelaclassedfinissantlecomposant,lapriseenchargedes attributs de balise ne peut tre effective que si le TagHandler associ la balise du composant assure galement les oprations ncessaires leur traitement. La section Dfinition de balises de composants personnaliss Dfinition dun TagHandler associ la balise reprsentant un composant de ce chapitre montre commentralisercetteaction.

4. Dclaration des nouveaux composants dans le fichier de configuration des ressourcesdelapplication


Unefoisquelaclassecorrespondantunnouveaucomposantgraphiqueestintgralementconstitue,cellecidoit tredclareauseindufichierdeconfigurationdesressources,demanirepermettresonutilisationentantque composantpersonnalisdanslapplicationweb. Cette dclaration se fait laide dune balise <component> directement issue de la balise <faces-config>. Elle comporte deux lments essentiels : <component-type>, dont la valeur est utilise par les TagHandler souhaitant sassocier au composant en question, et <component-class>, permettant de prciser le nom complet de la classe dfinissantlecomposant. Lecodesourcesuivantestunextraitdefichierdeconfigurationdesressourcesduneapplicationexploitantlestrois composants personnaliss voqus prcdemment dans ce chapitre. Ces composants sont identifis par les types HtmlHeureCourante, monHtmlHeureCourante2, et monHtmlInputButton. Ils correspondent respectivement aux classes HtmlHeureCourante,HtmlHeureCourante2etHtmlInputButtondontlecodesourceadjtdonn. <component> <description> Description du composant personnalis </description>
ENI Editions - All rigths reserved - 5-

<display-name>Composant Heure Courante</display-name> <component-type> HtmlHeureCourante </component-type> <component-class> premierProjetJSF.composantsPersonnalises.HtmlHeureCourante </component-class> </component> <component> <description> Une partie du rendu de ce composant est dlgu un Renderer </description> <display-name> Composant Heure Courante avec Renderer spcifique</display-name> <component-type> monHtmlHeureCourante2</component-type> <component-class> premierProjetJSF.composantsPersonnalises.HtmlHeureCourante2 </component-class> </component> <component> <display-name> Composant constitu dun champ de saisie et dun bouton de soumission </display-name> <component-type> monHtmlInputButton</component-type> <component-class> premierProjetJSF.composantsPersonnalises.HtmlInputButton </component-class> </component>

- 6-

ENI Editions - All rigths reserved

Dfinitiondebalisesdecomposantspersonnaliss
LutilisationdecomposantspersonnalissdepuislespagesJSPduneapplicationwebestassuregrcedesbalises spcifiquementconues.CesbalisespersonnalisesdoiventfairelobjetdunedclarationauseindunfichierTLD,et treassociesdesclassestenuesdelesprendreencharge,lesTagHandler.

1.MiseenplacedunfichierTLD(TagLibraryDescriptor)
Un fichier TLD doit tre positionn, de prfrence, dans le sousrpertoireWEBINF/tlds de lapplication web : son contenuprsentelatotalitdesbalisesrattacheslalibrairie. Chaquebalisecomportediversesinformationspermettantnotamment:
q

dindiquer le nom de la balise, tel quil devra tre utilis dans les pages JSP pour instancier un composant particulier.Cetteinformation,obligatoire,estdonneparlintermdiairedelabalise<name>. dementionnerlenomcompletdelaclassecorrespondantaucomposantinstancier(balise<tag-class>).La prcisiondecetteinformationestimprative. de prciser si la balise peut ou non disposer dun corps (balise <body-content>). Labsence de cette informationindiquequelabalisesupporteeffectivementlaprcisionduncontenu,alorsquelattributiondela valeuremptylabalise<body-content>empchecettesituation. dementionnerlalistedetouslesattributs,obligatoiresetoptionnels,supportsparlabalisepersonnalise.

Chaque attribut de balise se dfinit laide dune balise <attribute>, capable de prendre en charge les balises enfant<name>et <required>.Lapremiredecesbalisespermetdeprciserlenomdelattribut, tel quildevratre mentionn dans les pages JSP de lapplication. Quant la balise <required>, elle sert indiquer si lattribut en questionestobligatoirementrequis. LecodesourcesuivantcorrespondaucontenudunfichierTLDnommmesPremiersTagsPersonnalises.tld.Ildfinit troisbalisespersonnalisesdestinestreassociesauxtroiscomposantspersonnalissprcdemmentvoqus. Parmi elles, on retrouve la balise composantInputButton et la prcision de ces deux attributs obligatoires labelChampSaisieetlabelBoutonSoumission. <?xml version="1.0" encoding="UTF-8" ?> <taglib version="2.0"> <tlib-version>1.0</tlib-version> <short-name>Mes composants JSF personnalises</short-name> <tag> <description> Composant affichant lheure courante </description> <name>heureCourante</name> <tag-class> premierProjetJSF.composantsPersonnalises.HtmlHeureCouranteTag </tag-class> <attribute> <name>id</name> </attribute> <attribute> <name>label</name> <required>true</required> </attribute> </tag> <tag> <description> Composant affichant lheure courante avec un renderer spcifique </description> <name>heureCouranteAvecRenderer</name>

ENI Editions - All rigths reserved

- 1-

<tag-class> premierProjetJSF.composantsPersonnalises.HtmlHeureCourante2Tag </tag-class> <body-content>empty</body-content> <attribute> <name>id</name> </attribute> <attribute> <name>label</name> <required>true</required> </attribute> </tag> <tag> <description> Composant constitu dun champ de saisie et dun bouton de soumission </description> <name>composantInputButton</name> <tag-class> premierProjetJSF.composantsPersonnalises.HtmlInputButtonTag </tag-class> <body-content>empty</body-content> <attribute> <name>id</name> </attribute> <attribute> <name>labelChampSaisie</name> <required>true</required> </attribute> <attribute> <name>labelBoutonSoumission</name> <required>true</required> </attribute> </tag> </taglib>

2.DfinitiondunTagHandlerassocilabalisereprsentantuncomposant
Lapriseenchargedune balise personnalise par limplmentationJSFestassureparlintermdiaire duneclasse spcifiquementddie.Cellecidoitobligatoirementdriverdelaclassejavax.faces.webapp.UIComponentELTag,dont ladfinitionindiquecesmthodesgetComponentTypeetgetRendererTypedoiventtreredfinies.

a.MthodesassurantlaliaisonavecuncomposantgraphiqueetunRenderer
La mthode getComponentType sert renvoyer une chane identifiant la classe correspondant au composant graphique associ la balise. La valeur de cette chane doit imprativement correspondre avec celle de la balise <component-type> dfinissant un composant personnalis dans le fichier de description des ressources de lapplication. La mthode getRendererType permet de renvoyer une chane de caractres identifiant le Renderer associer ventuellementaveclabalise.SiaucunRenderernedoittreassoci,alorscettemthodedoitrenvoyerlavaleur null. Dans le cas contraire, la valeur retourne doit correspondre avec celle de la balise <renderer-type> dfinissantunRendererpersonnalisdanslefichierdeconfigurationdesressources.

b.Mthodespermettantlapriseenchargedesattributsdebalise
Commecelaadjtprcis,lapriseenchargedesattributsdebalisenepeuttreassureuniquementdepuis la classe dfinissant un composant personnalis. En effet, chaque attribut de balise doit correspondre une proprit prive de mme nom au sein de la classe dfinissant le TagHandler. Ces proprits prives doivent imprativementtrerenduesaccessiblesencritureaumoyendunaccesseursetNomAttribut.Ainsi,unattribut de balise labelChampSaisie correspond une proprit prive de mme nom et un accesseur en criture nomm setLabelChampSaisie. Parailleurs,latransmissiondelavaleurdesattributsdebalisesentreunTagHandleretlecomposantpersonnalis

- 2-

ENI Editions - All rigths reserved

associ ne peut se faire quau travers dune mthode setProperties : celleci dispose dun argument de type UIComponentcorrespondantaucomposantenquestion. Le code source suivant correspond la classe dfinissant un TagHandler pour la balise composantInputButton, reprsentantlecomposantpersonnalisdetypeHtmlInputButton.Onconstatequelatransmissiondelavaleurdes attributslabelChampSaisieetlabelBoutonSoumissionaucomposantsefaitparappeldelamthodegetAttributes surlobjetcorrespondantcecomposant.Cettemthoderenvoielalistedesattributs,quilestpossibledemettre jourgrcelinvocationdunemthodeput,enmentionnantlenometlavaleurdesnouveauxattributs. package premierProjetJSF.composantsPersonnalises; import javax.faces.component.UIComponent; import javax.faces.webapp.UIComponentELTag; public class HtmlInputButtonTag extends UIComponentELTag { private String labelBoutonSoumission; private String labelChampSaisie; public void setLabelBoutonSoumission(String label) { //Invoqu lorsque lattribut de balise //labelBoutonSoumission est prcis. labelBoutonSoumission=label; } public void setLabelChampSaisie(String label) { //Invoqu lorsque lattribut de balise labelChampSaisie //est prcis. labelChampSaisie=label; } @Override public String getComponentType() { //Renvoie le nom du type de composant associer // cette balise. //Ce nom doit tre dclar dans le faces-config.xml. return ("monHtmlInputButton"); } @Override public String getRendererType() { //Aucun Renderer nest associ return null; }

protected void setProperties(UIComponent composant) { //Permet de mettre jour les proprits du composant, //compte tenu des attributs de balise. super.setProperties(composant); composant.getAttributes().put("labelChampSaisie", labelChampSaisie); composant.getAttributes().put("labelBoutonSoumission", labelBoutonSoumission); } } Dansunsoucidexhaustivit,voicilecodesourcedunTagHandlerassocilabalisecorrespondantaucomposant personnalis monHtmlHeureCourante2. Pour rappel, ce composant utilise unRenderer spcifique dont la description est donne dans le paragraphe suivant. La chane identifiant ce Renderer est renvoye par la mthode getRendererTypedelaclasse. package premierProjetJSF.composantsPersonnalises; import javax.faces.component.UIComponent;
ENI Editions - All rigths reserved - 3-

import javax.faces.webapp.UIComponentELTag; public class HtmlHeureCourante2Tag extends UIComponentELTag {

private String leLabel; public void setLabel(String etiquette) { //Cette mthode est invoque lorsque //lattribut de balise label est prcis. leLabel=etiquette; }

public String getComponentType() { //Renvoie le nom du type de composant associer // cette balise. //Ce nom doit tre dclar dans le faces-config.xml. return ("monHtmlHeureCourante2"); } @Override public String getRendererType() { //Renvoie le nom du type de Renderer utiliser avec //le composant associ. //Renvoie null si le composant associ doit grer //lui-mme le Rendering. return "heureAvecRenderer"; }

@Override protected void setProperties(UIComponent composant) { super.setProperties(composant); composant.getAttributes().put("label", leLabel); } }

- 4-

ENI Editions - All rigths reserved

Constitutiondurendudescomposantspersonnaliss
LobjetdeceparagrapheestdedcrireladmarchepermettantdecrerunRendererpersonnalis.Lerledecetype dlmentsestdepermettrelarestitutiongraphiquedecomposantspersonnalissquinegrentpascetteactionpar euxmmes. Lintrtdedfinirdesclassesspcifiquementchargesdelarestitutiongraphiqueestdepermettreuncomposant dtrereprsentgraphiquementdediffrentesmanires.Enoutre,unRendererparticuliernest pas spcifiquement liuntypedecomposantdonn:unefoisdfini,ilpeuttreassocinimportequeltypedecomposantgraphique rattachunefamilleparticulire.

1.DfinitionduneclassereprsentantunRendererpersonnalis
UnRendererpersonnalisestsimplementuneclassedrivedelaclassejavax.faces.render.Renderer.Lesactions assurespourrestituergraphiquementlabalisedouverturecorrespondantuncomposantsontdcritesdansune mthode encodeBegin, acceptant en paramtres la rfrence du contexte de lapplication web, ainsi que celle du composantpourlequellarestitutionestdemande.UnemthodeencodeEnd,comportantlesmmesparamtres,est chargedeprcisercequidoittrefaitpourrestituergraphiquementlabalisedefermetureassocieaucomposant. Cesmthodespeuventtreimplmentesconjointement,maisunRendererpeutgalementnecomporterquelune delles.Deplus,silecomposantgraphiquedfinitluimmeluneoulautredesmthodesencodeBeginetencodeEnd, limplmentationprcisedansleRendereresttotalementignore. package premierProjetJSF.composantsPersonnalises; import java.io.IOException; import java.util.Calendar; import import import import javax.faces.component.UIComponent; javax.faces.context.FacesContext; javax.faces.context.ResponseWriter; javax.faces.render.Renderer;

public class HeureCouranteRenderer extends Renderer { @Override public void encodeBegin(FacesContext context, UIComponent component) throws IOException { //Mthode utilise en dbut dencodage, // moins que le composant //dispose lui-mme dune mthode encodeBegin. super.encodeBegin(context, component); System.out.println("encodeBegin du Renderer pour le composant de classe "+component.getClass().toString()); Calendar calendrier=Calendar.getInstance(); String intitule= (String)component.getAttributes().get("label"); String heureCourante= calendrier.get(Calendar.HOUR)+":" +calendrier.get(Calendar.MINUTE)+":" +calendrier.get(Calendar.SECOND); ResponseWriter out=context.getResponseWriter(); out.write(" <table border=1> <tr bgcolor=yellow><td> <font color=red> "+intitule+":"+heureCourante+" </font></td></tr></table>"); } @Override public void encodeEnd(FacesContext context, UIComponent component) throws IOException { //Mthode utilise en fin dencodage,

ENI Editions - All rigths reserved

- 1-

// moins que le composant //dispose lui-mme dune mthode encodeEnd. super.encodeEnd(context, component); System.out.println("encodeEnd du Renderer pour le composant de classe "+component.getClass().toString()); } } Ce code source correspond celui dunRenderer nomm HeureCouranteRenderer. Sa mthodeencodeBegin permet dafficherlheurecourantedanslenavigateurweb.Cetteinformationestmentionnelaidedunepolicerougesur fondjaune,etsetrouvepositionneauseindunecelluledetableauHTML.

2. Dclaration du nouveau Renderer dans le fichier de configuration des ressources delapplication


Demmequepourlescomposantspersonnalisseuxmmes,lacrationduneclassedrivedeRenderernesuffit pasrendreunRendererutilisableparuneapplicationweb.Celuicidoiteneffettredclarcommetelauseindu fichierdeconfigurationdesressources. Cettedclarationdoitcomporterlesinformationssuivantes:
q

NomcompletdelaclasseimplmentantleRenderer(balise<renderer-class>). Nom de la famille de composants laquelle sadresse le Renderer (balise <component-family>). Ce nom correspondlachanedecaractresrenvoyeparlamthodegetFamilydescomposantsenquestion. Identifiant du Renderer (balise <renderer-type>). Celuici est utilis pour associer un TagHandler un Rendererdonn.

Voici un extrait de fichier de configuration des ressources permettant de dclarer un Renderer nomm heureAvecRenderer,bassurlaclasseHeureCouranteRenderer.CeRendererpeuttreutilisaveclescomposantsde la famille heureCourante2, ce qui est le cas des composants bass sur la classe HtmlHeureCourante2 prsente prcdemment. <render-kit> <renderer> <display-name> Heure courante avec Renderer</display-name> <component-family> heureCourante2</component-family> <renderer-type> heureAvecRenderer</renderer-type> <renderer-class> premierProjetJSF.composantsPersonnalises.HeureCouranteRenderer </renderer-class> </renderer> </render-kit>

- 2-

ENI Editions - All rigths reserved

Dfinitiondesvnementsassocisauxnouveauxcomposants
Pour rappel, les vnements pouvant tre produits par les composants graphiques JSF sont issus de la classe ActionEventoudelaclasseValueChangeEvent.Lespremierspeuventtregnrspardescomposantsbasssurune classeimplmentantlinterfaceActionSource,alorsquelessecondslesontdepuisdescomposantsdrivsdeUIInput. Par ailleurs, la gestion de ces vnements peut tre assure par des couteurs de type ActionListener ou ValueChangeListener.EllepeutgalementltredepuisdesimplesmthodesdeJavaBeans,acceptantobligatoirement enargumentlvnementenquestion. Unepriseenchargecorrectedesdiffrentsvnementspardescomposantspersonnalisssupposequeleconcepteur duneapplicationwebraliselesoprationssuivantes:
q

Dvelopperla/lesclasse(s)charge(s)degrerlesvnements. Dclarer dans la TLD les attributs de balises qui seront utiliss dans les pages JSP pour identifier les gestionnairesdvnements. ModifierlecodesourceduTagHandlerassocilabalisecorrespondantaunouveaucomposant,demanire permettrelapriseenchargedecesattributsdebalise.

Pour illustrer ce propos, voyons comment rendre le composant de type HtmlInputButton capable de gnrer des vnements.

1.Dveloppementdugestionnairedvnements
ComptetenudufaitquelaclasseHtmlInputButtondrivedirectementdeUIInput,lescomposantspersonnalissqui ensontissussontenmesuredtreloriginedvnementsdetypeValueChangeEvent.Laconstitutionduneclasse capable de grer ces vnements peut simplement se limiter limplmentation dune mthode acceptant un ValueChangeEvent en argument. Dans le code source cidessous, la mthode changementValeur rpond cette caractristique : son rle consiste afficher dans la console le nom du composant, ainsi que sa nouvelle valeur, chaquefoisquesurvientunValueChangeEvent. package premierProjetJSF.composantsPersonnalises; import javax.faces.component.UIInput; import javax.faces.event.ValueChangeEvent; public class GestionnaireEvenements { public void changementValeur(ValueChangeEvent event) { System.out.println( "Un changement a eu lieu dans le composant de type " +event.getComponent().getClass().getCanonicalName() +"."); //Si le composant est de type UIInput, //il est possible dafficher sa valeur. try { UIInput champ=(UIInput)event.getComponent(); System.out.println("Valeur actuelle: "+champ.getValue()); } catch (Exception exc) { System.out.println("Impossible dafficher la valeur actuelle du composant."); } } } Bien sr, pour que ce gestionnaire dvnements soit exploitable depuis les pages JSP dune application web, le fichierdeconfigurationdesressourcesdoittremisjourparladclarationdunbeanmanagcorrespondantla classeGestionnaireEvenements:

ENI Editions - All rigths reserved

- 1-

<managed-bean> <managed-bean-name> gestionnaireEvenements </managed-bean-name> <managed-bean-class> premierProjetJSF.composantsPersonnalises.GestionnaireEvenements </managed-bean-class> <managed-bean-scope> Session </managed-bean-scope> </managed-bean>

2.ModificationdelaTLD
Pour permettre au designer web de mentionner la rfrence du gestionnaire dvnementsautraversdelabalise reprsentant le composant personnalis, il est ncessaire de dfinir un attribut spcifique. Cette dclaration comporte ncessairement le nom de cet attribut, qui, compte tenu de son rle, peut conventionnellement tre valueChangeListener.Dautres informations importantes concernant cet attribut doivent galement tre prcises : son caractre obligatoire (balise <required>) et la signature de la mthode charge de grer lvnement (balise <method-signature>). <attribute> <description> Permet de spcifier un gestionnaire pour les vnements de type ValueChangeEvent. </description> <name>valueChangeListener</name> <required>false</required> <deferred-method> <method-signature> nomDeMethodeQuelconque(javax.faces.event.ValueChangeEvent) </method-signature> </deferred-method> <type>String</type> </attribute>

Notez la particularit de la signature de mthode indique par la balise <method-signature> : elle ne doit comporter aucun type, et le nom de la mthode peut tre tout fait quelconque. La seule contrainte concerne le type de largument de mthode, qui lui, doit obligatoirement correspondre celui de la mthode chargedegrerlvnement(ValueChangeEvent).

3.ModificationduTagHandler
CetteactionconsistedclarerunepropritsupplmentairedanslaclasseHtmlInputButtonTag:sonnomdoittre identiqueceluidelattributdebalise.Ilestgalementindispensabledecrerlaccesseurencriturecorrespondant, et dajouter quelques lignes la mthode setProperties pour que la valeur de la nouvelle proprit puisse tre transmiseaucomposantassociauTagHandler. tantdonnquelattributdebalisevalueChangeListenerestsusceptiblededisposerdunevaleurcorrespondant uneexpressiondemthode(parexemple#{ gestionnaireEvenements.changementValeur}),lanouvellepropritdu TagHandler doit tre de typejavax.el.MethodExpression. Naturellement, laccesseur en criture correspondant doit disposerdunargumentdemmetype: private MethodExpression valueChangeListener; public void setValueChangeListener (MethodExpression valueChangeListener) {this.valueChangeListener = valueChangeListener; } LamthodesetPropertiesdoit,quantelle,rcuprercetobjetdetypeMethodExpressionpourleconvertirenune instance de la classe MethodExpressionValueChangeListener. Cette classe, directement drive de ValueChangeListener, permet en effet de crer des objets qui peuvent ensuite tre ajouts la liste des ValueChangeListenerassocisuncomposantdonn,parappeldelamthodeaddValueChangeListenerdelaclasse

- 2-

ENI Editions - All rigths reserved

UIInput. protected void setProperties(UIComponent composant) { //... if (valueChangeListener!=null) { //Si le composant est issu de la classe UIInput, alors //un ValueChangeListener peut lui tre attribu. try { //Tentative de conversion du composant en UIInput. UIInput commande=(UIInput)composant; //Ajout du ValueChangeListener au composant. ValueChangeListener vcListener= new MethodExpressionValueChangeListener(valueChangeListener); if (vcListener!=null) {commande.addValueChangeListener(vcListener);} else { System.out.println("Attention, lexpression de mthode utilise avec lattribut valueChangeListener ne peut pas tre convertie en ValueChangeListener."); } } catch (Exception exc) { System.out.println("Le composant naccepte pas de ValueChangeListener!"); } } //... }

ENI Editions - All rigths reserved

- 3-

Permettre lutilisation des nouveaux composants dans les pages JSP duneapplication
LutilisationdenouveauxcomposantsdansunepageJSPestsimple.IlfauttoutdabordindiquerlarfrencedelaTLD dcrivant la (ou les) nouvelle(s) balise(s) par le biais dune directive taglib, puis faire usage de ces balises pour exploiterlescomposantspersonnaliss. Il faut toutefois sassurer que les balises correspondant ces composants sont bien positionnes entre les balises <f:view>et</f:view>.Enoutre,touslescomposantssusceptiblesdepermettrelasaisiedinformationsdoiventtre intgrsentredesbalisesdeformulaire<h:form>et</h:form>. Voici le contenu dune page JSP faisant usage des deux composants personnaliss de type HtmlInputButton et HtmlHeureCourante2. <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@taglib uri="/WEB-INF/tlds/mesPremiersTagsPersonnalises.tld" prefix="composantPerso" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1"> <title>Test de composants personnaliss</title> </head> <body> <f:view> <h:form> <composantPerso:composantInputButton labelChampSaisie="Saisissez votre email: " labelBoutonSoumission="Cliquez pour valider" valueChangeListener="#{gestionnaireEvenements.changementValeur}" /> <br> <composantPerso:heureCouranteAvecRenderer id="nouveau" label="Il est actuellement: " /> </h:form> </f:view></body> </html>

ENI Editions - All rigths reserved

- 1-

Mcanismesmisenuvredanslecadredumultilinguisme
Dans le domaine du dveloppement logiciel, il est aujourdhui important de pouvoir mettre en place, dans des dlais restreints,desapplicationsquipuissenttrefacilementvenduesetexploitesdansdiffrentspays.Celasuppose,pour les dveloppeurs, de prter une attention toute particulire aux mcanismes quils mettent en uvre pour permettre uneadaptationsimpleetrapideducontenudesinterfacesgraphiques:ilesteneffetparticulirementconfortable,pour unutilisateurfinal,davoirmanipulerdesinterfacesdontlescontenussontadaptslalangueemployedansson paysousargion. Pour faciliter un tel travail dinternationalisation, la technologie Java offre depuis longtemps un ensemble de classes spcifiques, qui peuvent tre exploites pour la conception dapplications logicielles bases sur AWT ou SWING, ainsi que pour les applications orientes web. Ces classes sont particulirement adaptes la prise en charge de labels spcifiques un certain nombre de pays. Cette section offre un aperu de quatre de ces classes : Locale, ResourceBundle,NumberFormat,etDateFormat.Ilprcisegalementdansquellemesurecesdiffrentesclassespeuvent tre exploites dans le cadre de la cration dapplications web, en particulier celles bases sur la technologie Java ServerFaces.

1.LaclasseLocale
a.Description
Cetteclasse,situedanslepackagejava.util, permet dinstancierdesobjetsreprsentantunelangueutilisepar les habitants dune rgion ou dun pays particulier. Compte tenu des signatures des diffrents constructeurs de la classe,plusieursinformationsdoiventtrefourniespourconstituerunobjetdetypeLocale: public Locale(String language) public Locale(String language, String country) public Locale(String language, String country, String variant)

Largument language sert indiquer le code ISO639 de la langue utilise dans la rgion que lon souhaite reprsenter. Ce code est obligatoirement constitu de deux caractres alphabtiques crits en minuscules. Parexemple,lefranaisestidentifiparlecodefr,alorsquelanglaislestparlachanedecaractresen. Pourinformation,latotalitdescodescorrespondantauxlanguespeuttreconsultesurlewebladresse http://www.loc.gov/standards/iso6392/langhome.html Largumentcountry permet de mentionner le code dunergionoudun pays. Lutilisationdeceparamtre imposelaprcisiondelalangueutilisedanslargionmentionne(argumentlanguage).Celasignifiequela crationdunobjetLocaleraliselaideduncodepayspermetdeprendreencomptelanotiondedialecte (une langue donne peut prsenter des variantes suivant les pays o elle est employe : langlais du RoyaumeUni(GB),parexemple,nestpasidentiqueceluiutilisenAfriqueduSud(ZA)).Lecodepaysdoit trefournienrfrenceunelistestandardise,rfrenceISO3166.Soncontenuestvisiblesurleweb ladresse http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm Lavaleurdelargumentcountryesttoujoursunechaneconstituededeuxcaractrescritsenmajuscules. Largumentvariant,indissociabledesdeuxautres,estintroduitpourpermettreauxditeursdelogicielsde prciseruncodequileurestspcifique(WINpourWindows,MACpourMacintosh,POSIXpourPosix).

PrcisonsenfinquelaclasseLocalefournitenstandardunensembledepropritsstatiquesfacilitantlinstanciation dobjets Locale particuliers. Ainsi, la variable Locale.FRANCE permet dobtenir simplement un objet Locale reprsentantlefranaisparlenFrance.

b.Utilisationdanslecadredelacrationdapplicationsweb
La classe Locale est systmatiquement exploite dans le cadre des applications web bases sur le langage Java (avecousanscomposantsJSF).Dsquunesessionestouvertesuruncontextedapplicationparticulier,lelangage dfini par dfaut dans le navigateur web est recherch, puis utilis pour instancier un objet Localecorrespondant aux habitudes linguistiques de linternaute. Cet objet est stock par la suite dans la session ellemme, afin de pouvoirtreexploitduranttoutelavisitedusite. Pourrappel,lelangagepardfaututilisparlenavigateursedfinitsimplementparlebiaisdesprfrences. AvecInternetExplorer,cetteoprationestralisedepuislemenu OutilsOptionsInternetetlebouton Langues.Lafentrequiseprsente(voirillustrationcidessous)indiquelenomdeslanguesdfinies,lepayso

ENI Editions - All rigths reserved

- 1-

elles sont utilises, ainsi que le code ISO correspondant. Ce dernier est lassociation entre le code langue et le code pays (frFR pour le franais utilis en France). Avec Mozilla Firefox, la mme opration peut tre ralise depuislarubriqueLanguesdumenuOutilsOptions.

Audel de la simple application du langage prvu par dfaut par le navigateur web, lobjet Locale plac dans la sessionpeuttremanipulparprogrammation.Celapermetaudveloppeur,notamment,deproposerlinternaute debasculerdunelangueuneautreparlutilisationdemenusconstitusprcismentdanscebut.Cecasdefigure particulieresttudidansledtail,enguisedillustration,danslasuitedecechapitre.

2.LaclasseResourceBundleetsesdrives
a.Description
La classe ResourceBundle est une classe abstraite, rattache au package java.util, dont les instances servent reprsenter un ensemble de ressources utilises spcifiquement pour une langue et une rgion particulires. Les ressourcesenquestionpeuventtredetypequelconque,maislaplupartdutemps,unResourceBundleestexploit pourregrouperdeschanesdecaractresutilisesparlasuitedansdiversesinterfacesgraphiques.Globalement,on peut dire que la notion de ResourceBundle se trouve au c ur des problmatiques lies la mise en uvre des processus dinternationalisation. Cest elle en effet qui rend une application particulirement adaptable de nombreuxlangages. Crationdunensemblederessources UnResourceBundlesedfinitleplussouventlaidedunidentifiantparticulier,appelnomdefamille,etdunobjet de type Locale reprsentant une langue utilise dans une rgion particulire. Lorsque lobjet Locale nest pas prcisparledveloppeurdelapplication,lesparamtreslocauxdfinissurlepostedetravaildelutilisateursont prisencompte. LaclasseResourceBundletantabstraite,sonutilisationpeutncessiterlacrationdeclassesquiendriventetqui prcisentsoncomportement.Cependant,laclassefournitunjeudetroismthodesstatiquesnommesgetBundle, dontlutilisationpermetdinstancierplussimplementunResourceBundleparticulier. public static final ResourceBundle getBundle(String baseName) public static final ResourceBundle getBundle(String baseName, Locale locale) public static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader)

- 2-

ENI Editions - All rigths reserved

lalecturedecestroisconstructeurs,onreconnatlesdeuxprincipauxcomposantsdunResourceBundle :sonnom defamille(argumentbaseName)etlalanguereprsente(argumentlocale). DclarationdesressourcesdunResourceBundle Commeindiquprcdemment,unResourceBundleestdfiniparunidentifiant,quicaractriselafamillelaquelleil estrattach.Pourtreplusprcis,unefamilleregroupeplusieursResourceBundle,quidiffrenttousparlavaleurde lobjet Locale quils portent. Par exemple, une famille nomme MesLabels peut rassembler deux ResourceBundle, intitulsMesLabels_fr_FRetMesLabels_en_GB:lepremiercontientdeslmentspropresaufranaisparlenFrance, alorsquelesecondestcomposdlmentslinguistiquespropreslanglaisutilisauRoyaumeUni. Tous les ResourceBundle dune mme famille doivent imprativement possder les mmes lments, mais la traductiondeceslmentsvariesuivantlalanguedfinieparlobjetLocaleduResourceBundle.Chaquelmentest caractris par une paire dinformations de type Cl/Valeur. Ainsi, la cl bouton1 dun lment peut possder la valeur "Se connecter" pour dans un ResourceBundle correspondant au franais. Le mme lment se retrouve obligatoirementdansunResourceBundleproprelanglais:ilestcaractrisparlammecl(bouton1),maisdontla valeurcorrespondlatraductionanglaiseduverbe"SeConnecter"(login). Les deux principales techniques mettre en uvre pour dclarer des ressources consistent utiliser les deux classes directement drives de ResourceBundle. Il sagit des classes PropertyResourceBundle et ListResourceBundle.
s

FaireunedclarationlaidedunPropertyResourceBundle.

Un PropertyResourceBundle est un objet prenant en charge un fichier de type texte dans lequel sont dclars les diffrentslmentsdunResourceBundle.Lexemplequisuitillustrelecontenuduntelfichier,valablepourlalangue franaise:chaquelignereprsenteunlmentparticulier,composdesacletdesavaleur. titre1=Bonjour, vous tes les bienvenus sur notre site! bouton1=Se connecter francais1=Version franaise anglais1=Version anglaise IlvadesoiquelesvaleursdechacunedesclsestobligatoirementdetypeString. Ilexisteuneconventiondenommagerespecterpourquedesfichierstextepuissenttreexploitsparunobjetde typePropertyResourceBundle:lenomdufichierdoitcomporterlenomdelafamillederessources,lecodeISOdela langue utilise, auquel est ventuellement joint le code ISO de la rgion. Ces trois informations sont spares les unesdesautresparlecaractreunderscore.Enfin,lenomdunfichiertexteexploitparunPropertyResourceBundle doitpossderlextension.properties.Ainsi,leslmentsdeResourceBundleprsentscidessuspeuventtrestocks dansunfichiertextenommMesLabels_fr_FR.properties.Untelnommontrequeleslmentssontmembresdela famille MesLabels, et concernent des expressions franaises utilises en France. Les lments de la mme famille, valables pour langlais parl au Royaume Uni, doivent tre dclars dans un fichier texte nomm MesLabels_en_GB.properties,dontlecontenupeuttrelesuivant: titre1=Hello, youre welcome on this web site! bouton1=Login francais1=French version anglais1=English version

FaireunedclarationlaidedunListResourceBundle.

Lusage dun PropertyResourceBundle peut savrer tre intressant, du simple fait de sa simplicit dutilisation. Cependant,lesvaleursdesdiffrentslmentsdunResourceBundledecetypesontobligatoirementdeschanesde caractres. Pour liminer cette contrainte, en offrant la possibilit de dfinir des valeurs dun type quelconque, il convientdefaireusagedelaclasseListResourceBundle. Sagissant dune classe abstraite, il est ncessaire den constituer une classe drive dont le nom respecte la convention de nommage explique prcdemment pour les PropertyResourceBundle, et dimplmenter la mthode getContentsdontvoicilasignature: protected abstract Object[][] getContents() Cettemthodedoitrenvoyeruntableaubidimensionnel,dontchaquelmentestunepairedinstancesissuesdela classeObject.Enralit,leslmentsdutableaurenvoydoiventcorrespondreauxlmentsduResourceBundle:la premiredimensiondutableauidentifielacldellment duResourceBundleetdoitdonctredetype String.La seconde dimension reprsente la valeur de llment du ResourceBundle, qui peut effectivement tre dun type quelconque. Si lon souhaite constituer le ResourceBundle nomm MesLabels_fr_FR grce un ListResourceBundle, il faut donc

ENI Editions - All rigths reserved

- 3-

dvelopperuneclassedontlenomestidentiqueceluiduResourceBundleetdontlecontenupeuttrelesuivant: package premierProjetJSF; import java.awt.Button; import java.util.ListResourceBundle; public class MesLabels_fr_FR extends ListResourceBundle { protected Object[][] getContents() { //Dfinition des lments. Object[][] lesElements= { {"titre1","Bonjour, vous tes les bienvenus sur notre site!"}, {"bouton1","Se connecter"}, {"francais1","Version franaise"}, {"anglais1","Version anglaise"}, {"bouton2",new Button("Se dconnecter")} }; return lesElements; } } Limplmentation de la mthode getContents ralise la dclaration de lensemble des lments voqus prcdemment pour ce ResourceBundle. Un nouvel lment a cependant t ajout : il dispose de la cl nomme bouton2 et possde une valeur de type java.awt.Button reprsentant un bouton dinterface base sur la couche graphiqueAWT.

b.Utilisationdanslecadredelacrationdapplicationsweb
DemmequelesapplicationswebbasessurlelangageJavaexploitenttoutesuneinstanceparticuliredelaclasse Locale, cellesci peuvent rechercher si unResourceBundle est disponible par dfaut pour le Locale utilis. Lorsque celuiciexiste,ilpeuttrestockdanslasession,demanireresterdisponibleduranttoutelavisitedusitepar linternaute. La librairie standard de balises JSP prvoit par ailleurs la balise <fmt:setBundle> permettant de surchargerleResourceBundlepardfaut,pourenproposerunautre,plusadaptauxattentes. DanslecadredesapplicationswebexploitantdescomposantsJSF,unResourceBundlepeuttreinstanciparlusage delabalise<f:loadBundle>,issuedelabibliothqueCore.IlestgalementpossiblededclarerdesResourceBundle au sein du fichier de configuration des ressources de lapplication. Ce point particulier est abord la section DclarationdeResourceBundleassocisauxfichiersdelibellsdecechapitre.

3.LaclasseNumberFormat
a.Description
LaclasseabstraiteNumberFormatestfourniedanslepackagestandardjava.text.Ellepermetdobtenirunformatage des nombres adapt une langue et une rgion gographique particulire. Plusieurs mthodes statiques peuvent tre utilises pour instancier des objets issus de cette classe abstraite. Parmi ces mthodes, les plus importantes sontdfiniesparlessignaturessuivantes: public public public public public public static static static static static static final NumberFormat getInstance() NumberFormat getInstance(Locale inLocale) final NumberFormat getCurrencyInstance() NumberFormat getCurrencyInstance(Locale inLocale) final NumberFormat getPercentInstance() NumberFormat getPercentInstance(Locale inLocale)

Cesmthodesdisposentdunrlespcifiquesuivantletypededonnesformater:getCurrencyInstancefournitun objet NumberFormat capable de soccuper du formatage des nombres correspondant des devises et monnaies getPercentInstance en instancie un autre en mesure dassurer le formatage des nombres exprimant des pourcentages.Enfin,lamthodegetInstancerenvoieunobjetNumberFormatprenantenchargelesautrestypesde donnes. Largument inLocale de type Locale, prsent dans certaines des signatures de mthodes prcdentes, sert indiquer la langue et la rgion par rapport auxquelles le formatage est demand. Lorsque cet argument nest pas

- 4-

ENI Editions - All rigths reserved

mentionn, les paramtres dfinis localement sur le poste de travail de lutilisateur sont utiliss pour assurer le formatage.

b.Utilisationdanslecadredesapplicationsweb
Leformatagedesvaleursnumriquesselonlesusageslocauxestbienvidemmentduneimportancecapitaledans lesapplicationsweb,enparticulierpourtoutescellesconcernesparleecommerce. Les deux balises <fmt:formatNumber> et <fmt:parseNumber>, issues de la bibliothque standard JSTL fmt, peuvent respectivement tre utilises dans les pages JSP pour formater et raliser une analyse syntaxique de valeurs numriquesquileursontfourniesenargumentsouslaformedunechanedecaractres. Avec la technologie Java Server Faces, le formatage des valeurs numriques se fait au travers de lusage de convertisseurs associs des composants graphiques. Ces convertisseurs sont restitus par des balises <f:convertNumber>dontlattributtypepermetdeprcisersileformatageconcernedesdevises,despourcentagesou desnombresdautrestypes.

4.LaclasseDateFormat
a.Description
La classe abstraite DateFormat, dfinie dans le package java.text, permet dinstancier des objets capables de formater des informations lies la date et aux horaires, conformment aux habitudes spcifiques dune rgion particulire. Ces objets peuvent sobtenir en constituant des classes drives de DateFormat (la spcification en dfinit une, nomme SimpleDateFormat). Il est galement possible den instancier par invocation de mthodes statiquesdisponiblesdanslaclasseDateFormat.Voicilesprincipalessignaturesdecesmthodes: public static final DateFormat getDateInstance() public static final DateFormat getDateInstance(int style) public static final DateFormat getDateInstance(int style, Locale aLocale) public static final DateFormat getDateTimeInstance() public static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle) public static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale) public static final DateFormat getTimeInstance() public static final DateFormat getTimeInstance(int style) public static final DateFormat getTimeInstance(int style, Locale aLocale) Lamthode getDateInstance sert obtenir objetDateFormat spcialis dans le formatage de la date. Elle requiert potentiellementlaprcisiondunparamtrestyleindiquantsousquelleformeladateenquestiondoittreprsente (courte, longue, ou intermdiaire). Il est galement possible de mentionner le pays et la langue pour lesquels le formatage est demand, par lutilisationdun paramtre aLocale de typeLocale. Si ce dernier paramtre nestpas fourni,lesinformationsdelocalisationdfiniespardfautsurlepostedetravaildelutilisateursontexploites. LamthodegetDateTimeInstancepermetdecrerunobjetDateFormatcapabledeformatersimultanmentladateet lheure. Elle ncessite la prcision ventuelle de deux arguments, dateStyle et timeStyle, dont la valeur permet dindiquersousquelleformeladateetlheuredoiventtreprsentes(courte,longue,ouintermdiaire).Lindication delocalisationpeutsefaireparlintermdiairedelargumentaLocale. Enfin,lamthodegetTimeInstanceprsentedesargumentsdontlesnomsetlesrlessontidentiquesceuxdcrits pour la mthode getDateInstance. La seule spcificit de getTimeInstance rside dans le fait quelle assure le formatagedelheureuniquement.

b.Utilisationdanslecadredesapplicationsweb
CommepourlesobjetsdetypeResourceBundleetNumberFormat,ilestpossibledexploiterdesinstancesdelaclasse DateFormatdepuislespagesJSPduneapplicationweb.Celapeutsefaireenutilisantcertainesbalisesdfiniesdans labibliothqueJSTLfmt:ilsagitdesbalises<fmt:formatDate>et<fmt:parseDate>.Lapremirepermetderaliserle formatage dune date fournie en paramtre, alors que la seconde assure lanalyse syntaxique dune chane de caractresreprsentantunedate. LaspcificationJSFsappuie,quantelle,surlusagedesconvertisseurspourraliserleformatagedesdatesetdes

ENI Editions - All rigths reserved

- 5-

heures. La bibliothque JSF Core contient pour cela une balise <f:convertDateTime>, dont on peut prciser le comportementparlebiaisdediffrentsattributs,notammenttypeetpattern. ReportezvousauchapitreExploitationdescomposantsstandardsJSFdecetouvragepourobtenirdeplus amplesrenseignementsconcernantlusageduconvertisseurdetypeDateTimeConverter.

- 6-

ENI Editions - All rigths reserved

Externalisationdeslibellsetdesmessagesdansuneapplicationweb
Dans le cadre de la conception dapplications web bases sur la technologie JSF, la mise en uvre de linternationalisation et de la localisation est assure par lexploitation dobjets de type PropertyResourceBundle. Les libellsetautresmessagesspcifiquesunefamilledeResourceBundlesontdoncinscritsdansunensembledefichiers detypetexte,chacundeuxtantrelatifunelangueetunergionparticulire. Cette section montre comment il est possible, sur un plan pratique, dexploiter le mcanisme dinternationalisation : il prcise la mthode de dclaration de nouveaux ResourceBundle associs des fichiers de libells, et propose une illustrationdeslectiondynamiquedulangage,selonlessouhaitsdelinternaute.

1.Dfinirplusieursfichiersdelibells
La premire tape du travail consiste laborer autant de fichiers de libells que de langues proposer aux internautes.Cesfichiersdoiventtreplacsprfrentiellementdanslesousrpertoiresrcdelapplicationweb.Chaque ligne de ces fichiers contient une paire dinformations reprsentant la cl et la valeur dun libell ou dun message particulier. Les fichiers dune mme famille de ResourceBundle prsentent tous les mmes cls, mais les valeurs de cellesci diffrent bien sr selon la langue. Il est naturellement possible de mettre en place plusieurs familles de ResourceBundledansunemmeapplicationweb. Tous les fichiers de libells ou de messages doivent respecter la convention de nommage requise. dfaut, ils ne pourrontpastreprisenchargeparlapplicationweb.Leurnomdoitdonctrecomposdelidentifiantdelafamille,de celuidelalangue,etventuellementdeceluidelargion.Ilsdoiventenoutredisposerdelextension.properties. Desexemplesdecontenudefichiersdelibellssontprsentsdanslessectionsprcdentesdecechapitre.

2.Utilisationdelalanguedfiniepardfautdanslenavigateur
LimagesuivantemontrelecontenudelavuedexplorationdeprojetsdEclipse,pouruneapplicationwebspcifique:

PlusieursfamillesdeResourceBundleysontdfinies.Lunedelles,nommeportail,permetlapriseenchargedelanglais parlauRoyaumeUnietdufranaisparlenFrance.Defait,touslesnavigateurspourlesquelslelangagepardfaut correspondlunedeceslanguesserontenmesuredeproposerlinternautedeslibellsquiluisontadapts. Quen estil pour les autres situations, dans lesquelles le navigateur nest pas configur pour exploiter les langues proposesparlapplicationweb?Ilsagiteneffetdunesituationcourante,danslamesureoleconcepteurdusiteest dans limpossibilit de dfinir autant de fichiers de libells quil ny a de dialectes dans le monde. La rponse cette problmatique consiste crer un fichier de libells par dfaut pour chaque famille de ResourceBundle. Le nom de ce fichier par dfaut est uniquement compos du nom de la famille et de lextension.properties. Lillustrationprcdente montrequelefichierdelibellspardfautdelafamilleportailesteffectivementprvu:sonnomestportail.properties.

3.Permettrelexploitationdecesfichiersdanslapplicationweb
Laseuleprsencedesmultiplesfichiersdelibellsdanslesousrpertoiresrc de lapplicationwebnesuffitpasles rendreexploitablesdanslespagesweb.Ilfauteneffetpralablementindiquerlesdialectessupportsparlapplication, et permettre linstanciation dun objet de type ResourceBundle pour chacune des familles dfinies par les fichiers de libells. Ces deux oprations peuvent tre assures par la modification du fichier de configuration des ressources de lapplicationweb.

a.Lesdialectessupports
Aprs avoir affich le fichier de configuration des ressources dans la zone ddition de lenvironnement Eclipse, la
ENI Editions - All rigths reserved - 1-

dclarationdesdialectessupportspeutsefairedepuislarubriqueLocale Configsituedanslonglet Other.Ilest possiblededfinirunelistededialectessupports,etdeprciserceluiutiliserpardfautencochantlacasequilui correspond.

Les changements sont naturellement visibles dans longlet Source prsentant le code source du fichier de configurationdesressources.Lesdialectessontdfinisparlebiaisdunebalise<locale-config>,souslmentdela balise <application>. Le dialecte par dfaut est mentionn par la valeur dun lment <default-locale>, alors que chaquedialectesupplmentaireestdfiniparunebalise<supported-locale>. <faces-config> <application> <locale-config><default-locale>fr_FR</default-locale> <supported-locale>en_GB</supported-locale> <supported-locale>de_DE</supported-locale> </locale-config> </application> ... </faces-config>

b.DclarationdeResourceBundleassocisauxfichiersdelibells
DeuxmoyenssontproposspourdclareretutiliserdenouveauxResourceBundleassocisdesfichiersdelibells: ladclarationauseindespagesweb,etladclarationentantquenouvellesressourcesdelapplicationweb. Dclarationauseindespagesweb Dans cette situation, les ResourceBundle sont instancis directement dans les pages web par le bais dune balise <f:loadBundle>:ilsdisposentalorsduneportedetyperequest.Siuntelmodedutilisationpeutconvenirdansle cadre dapplications web limites, il prsente une contrainte importante pour les applications plus lourdes, dans la mesureolabalise<f:loadBundle>doittresystmatiquementrptedanslensembledespageswebquiexploite unResourceBundleparticulier. LecodesourcesuivantillustreladclarationetlutilisationdunResourceBundleauseindunepageJSPreprsentant unformulairedauthentification: <f:view> <f:loadBundle basename="premierProjetJSF.messages" var="mesMessagesPerso"/> <h:form> <h:panelGrid border="1" columns="3">

- 2-

ENI Editions - All rigths reserved

<h:outputText value="#{mesMessagesPerso.clientcode}"> </h:outputText> <h:inputText id="champCodeClient"></h:inputText> <h:message for="champCodeClient" id="messageCodeClient"> </h:message> <h:outputText value="#{mesMessagesPerso.password}"> </h:outputText> <h:inputSecret id="champMotPasse"> <f:validator validatorId="monValidateurDeMotDePasse" /> </h:inputSecret> <h:message for="champMotPasse" id="messageMotPasse"> </h:message> </h:panelGrid> <h:commandButton id="btnLogin" action="#{loginBean.verificationAuthentification}" value="#{mesMessagesPerso.login}> </h:commandButton> </h:form> </f:view> Labalise<f:loadBundle>prsenteunattributbasenamepermettantdeprciserlenomdefamilleduResourceBundle instancier.Quantlattributvardelammebalise,ilsertattribuerunidentifiantceResourceBundle,pourlerendre disponibledanslerestedelapageweb. Lestiquettesassociesauxdeuxchampsdesaisieetauboutondesoumissionsontrcupresdanslefichierde libells correspondant au ResourceBundlenomm mesMessagesPerso, pour la langue et la rgion dfinies par dfaut dans le navigateur web. Le fichier en question possde au moins trois lments dont les cls sont nommes clientcode, passwordet login. Voici un contenu possible pour ce fichier, ainsi quune illustration du rsultat obtenu lorsdelexcutiondelapage: name=Nom password=Mot de passe clientcode=Code client welcome=Bienvenue! submit=Validez login=Se connecter

Dclarationentantquenouvelleressourcedelapplication Par ce second moyen, les ResourceBundle associs aux fichiers de libells disposent dune porte plus importante (session,application):ilspeuventalorstreutilissdanslatotalitdespageswebdelapplicationparlintermdiaire dunidentifiantunique,sansquilsoitncessairedavoirrecourslabalise<f:loadBundle>. Lorsquelefichierdeconfigurationdesressourcesestprsentdanslazoneddition,onconstatequilnexistepas deformulairepermettantdedclarerspcifiquementdenouveauxResourceBundle:ilestdoncncessairedemodifier directement le code source du fichier facesconfig.xml pour y ajouter les balises indispensables ce type de dclaration.UnResourceBundlesecaractrisepardeuxinformations:sonnomdefamilleetsonidentifiantunique. <faces-config> <application> <resource-bundle><base-name>premierProjetJSF.portail</base-name> <var>portail_web</var> </resource-bundle> ... </application> ...

ENI Editions - All rigths reserved

- 3-

</faces-config> Comme prsent dans le code cidessus, un ResourceBundle se dclare laide dune balise <resource-bundle> prsentant deux souslments <base-name> et <var> : le premier permet de mentionner le nom de famille du ResourceBundle,alorsquelesecondsertindiquerlidentifiantuniquedecetobjet.Danslexemplepropos,lenom defamilleestportail:ilcorresponddesfichiersdelibellssitusdanslesousrpertoiresrc/premierProjetJSFde lapplicationweb.Lidentifiantportail_webpourratreutilisdanslespageswebdelapplicationpourfairerfrence ceResourceBundleparticulier.

4.Permettrelutilisateurdeslectionnerdynamiquementunlangage
Une application intressante de linternationalisation consiste permettre linternaute de slectionner dynamiquementlalanguedanslalaquelleilsouhaitevisualiserlesinformationsproposesparlapplicationweb.Voyons commentobteniruntelrsultat,autraversdunexemplesimple. Ladmarchesuivrepeuttrelasuivante:
q

crirelecontenudesfichiersdelibellspourchacunedeslanguessupportesparlapplication. Construire une page JSP charge dafficher les informations et prsentant un ou plusieurs composants JSF permettantdechoisirlalangueutiliser. Dvelopper un bean manag dont lune des mthodes est charge de modifier dynamiquement la langue utiliserdanslecontextedelapplicationweb.

a.Contenudesfichiersdelibells
Cetaspectdutravailneposeaucunproblme.LasectionMcanismesmisen uvredanslecadredumultilinguisme La classe ResourceBundle et ses drives de ce chapitre prsente les contenus de deux fichiers nomms MesLabels_fr_FR.propertiesetMesLabels_en_GB.properties:ceuxcisontparfaitementadaptsaucasdefigure dvelopperici.

b.ConstruirelapageJSP
Voici un exemple de page web contenant des composants JSF faisant rfrence un RessourceBundle nomm portailWeb,dclardanslefichierdeconfigurationdesressourcesdelapplication. <f:view> <h:form> <h:outputText value="#{portailWeb.titre1}"> </h:outputText><br> <h:commandButton value="#{portailWeb.francais1}" id="fr_FR" actionListener="#{beanInternationalisation.choixLangue}"> </h:commandButton> <h:commandButton value="#{portailWeb.anglais1}"id="en_GB"actionListener="#{beanInternationalisation.choixLangue}"> </h:commandButton> </h:form> </f:view>

Cette page comporte un champ de type HtmlOutputText dont la valeur correspond la cl titre1 dun lment de

- 4-

ENI Editions - All rigths reserved

portailWeb. De mme, les labels affichs sur les deux boutons correspondent aux cls franais1 et anglais1 de ce ResourceBundle. Deux points importants sont noter propos de ces boutons : tout dabord, les balises qui les reprsentent possdentunattribut iddontlavaleuridentifieunelangueetunergionparticulires,selonlacodificationISO.De plus,cesbalisesprsententgalementunattribut actionListener,dontlavaleurrfrencelamthodechoixLangue dunbeanmanagnommbeanInternationalisation:cettemthodeestdoncinvoquelorsdunclicsurlesboutons. Celleciapourbutdemodifierlelangageutilispourlaffichagedesinformations.

c.Dfiniruneclassecontenantunemthodechargedemodifierlelangagepardfaut
La dernire tape de la dmarche consiste prcisment dvelopper le bean manag contenant la mthode choixLangue.CettemthodedoitnaturellementaccepterunobjetdetypeActionEventenargumentafindepouvoir prendreenchargeleclicsurdescomposantsdetypeHtmlCommandButton. package premierProjetJSF; import java.util.Locale; import javax.faces.context.FacesContext; import javax.faces.event.ActionEvent; public class BeanInternationalisation { public void choixLangue(ActionEvent actionEvent) { Locale locale; String idComposant=actionEvent.getComponent().getId(); //Si lidentifiant du composant est constitu //de la langue et du pays, //ces deux informations sont spares. int index=idComposant.indexOf("_"); if (index>0) { String langue=idComposant.substring(0,index); String pays=idComposant.substring(index+1); locale=new Locale(langue,pays); } else { locale=new Locale(idComposant); } FacesContext.getCurrentInstance().getViewRoot().setLocale(locale); } } Ces instructions illustrent la cration dune instance de la classeLocale partir de lidentifiant du composant JSF lorigineduclic.Cetteinstanceestfinalementutilisepourmettrejourlalocalisationdanslapplicationweb. lexcution,onconstatebienunbasculemententrelesdeuxlangues(anglaisetfranais)parlutilisationdubouton adapt.

ENI Editions - All rigths reserved

- 5-

Formatagedesnombresetdesdates
Comme prcis prcdemment dans ce chapitre, le formatage des nombres et des dates, selon les conventions propres une langue ou une rgion, est assur par les composants JSF de type NumberConverter et DateTimeConverter.Cescomposantsdoiventtreassocisdautrescomposantsgraphiques,etsontutilisablesdans lespageswebgrcelexploitationdesbalises<f:convertNumber>et<f:convertDateTime>. Les sections Conversion des valeurs numriques et Conversion de la date et de lheure du titre Exploitation des convertisseurs standards du chapitre Exploitation des composants standards JSF de cet ouvrage prsentent dans le dtaillemodedefonctionnementdecesconvertisseurs,etproposentdesexemplespouvanttenirlieudillustrations danslecadredelinternationalisation.Lelecteurintressparcettethmatiquepeutdoncserfrercessections pourobtenirlesrenseignementsquilrecherche.

ENI Editions - All rigths reserved

- 1-