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

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

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:

laidedesparamtresderequtes.Touteslespropritsdubeansontspcifiesgrceauxinformations
fournies:

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

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:

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-

- 2-

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

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-

- 4-

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

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:

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
LesspcificationsJSP2.0delatechnologieJavaServerPagesproposentunlangagedvaluation 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:

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:

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:

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:

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:

crationduneinstancedelaFacesServlet

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

spcificationdelanavigationauseindelapplicationweb

dveloppementdesbeansncessairesaubonfonctionnementdelapplication.

LundesintrtsdelatechnologieJavaServerFacesestquellepermetunerpartitiondestchesdedveloppement
entretroistypesdintervenants.Enloccurrence:

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:

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:

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:

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:

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:

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.
Elle correspond un champ permettant de saisir une valeur boolenne. Le plus souvent, ce champ est reprsent
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:

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:

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:

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

Classe(s)decomposant(s)implmentantlinterface

ActionSource,ActionSource2

UICommand

EditableValueHolder

UIInput,UISelectBoolean,UISelectMany,UISelectOne

NamingContainer

UIData,UIForm

StateHolder

UIColumn,UICommand,UIData,UIForm,UIGraphic,UIInput,
UIMessage,UIMessages,UIOutput,UIPanel,UISelectBoolean,
UISelectItem,UISelectItems,UISelectMany,UISelectOne,UIViewRoot

ValueHolder

UIInput,UIOutput,UISelectBoolean,UISelectMany,UISelectOne

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:

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

Rle

Restituecomme

column

Reprsenteunecolonnededonnesdans Unecolonneduntableau
uncomposantdetypeUIData.
HTML.

commandButton

Sertsoumettrelesdonnesdun
formulaireweb.

Unebalise<input>dont
lattributtypepeutprendreles
valeurssuivantes:submit,
resetouimage.
Prsentesouslaformedun

ENI Editions - All rigths reserved

- 1-

bouton.
commandLink

Constitueunlienversuneressource
interneouexternelapplicationweb.

Unebalise<a href>.

Sonutilisationprovoquelagnration
dunjavax.faces.event.ActionEvent.
dataTable

Permetdereprsenteruntableaude
donnes.

Unebalise<table>.Ilsagit
duntableauHTMLdontle
contenupeutvoluer
dynamiquement.

form

Reprsenteunformulairedesaisiedont
Unebalise<form>.
tousleslmentspermettent
lutilisateurdesoumettredesinformations
lapplicationweb.

graphicImage

Afficheuneimagedanslenavigateur.

Unebalise<img>.

inputHidden

Permetdintroduireunchampcachau
seindunformulaireweb.

Unebalise<input>detype
hidden.

inputSecret

Permetdeplacerunchampdemotde
passedansunformulaire.Lescaractres
saisisnesontpasvisualisables.

Unebalise<input>detype
password.

inputText

Reprsenteunezonedesaisiedetype
texte.

Unebalise<input>detype
text.

inputTextArea

Permetlinternautedesaisirunechane
decaractresmultilignes.

Unebalise<textarea>.

message

Afficheunmessagedanslenavigateur.

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.

outputLink

Constitueunlienversuneressource
interneouexternelapplicationweb.

Unebalise<a href>.

ladiffrencedelabalisecommandLink,
sonutilisationneprovoquepasla
gnrationdun
javax.faces.event.ActionEvent.
outputText

- 2-

Afficheunelignedetexte.

ENI Editions - All rigths reserved

Unesimplechanede
caractres.

panelGrid

Afficheuntableaudanslenavigateur.

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

panelGroup

Sertregrouperauseindunconteneur
unensembledautrescomposants.

Unelignedetableau.

selectBooleanCheckbox

Permetlutilisateurdeslectionnerune
valeurboolenne.

Unebalise<input>detype
checkbox.

selectItem

Reprsenteunlmentparticulierdun
ensembledlmentsdunezonedeliste
(instancedelaclasseUISelectOne).

Unebalise<option>.

selectItems

Reprsenteunensembledlments
Unensembledebalises
appartenantunezonedeliste(instance <option>.
delaclasseUISelectOne).

selectManyCheckbox

Prsentelutilisateurunensemblede
casescocher.

selectManyListBox

Permetlutilisateurdefaireuneslection Unebalise<select>disposant
multipleparmiunensembledlments.
dunattributmultiple.

selectOneListbox

Permetlutilisateurdefaireuneslection Unebalise<select>.
uniqueparmiunensembledlments.

selectOneRadio

Permetlutilisateurdefaireuneslection Unebalise<input>detype
uniqueparmiunensembledlments.
radio.

Unensembledebalises
<input>detypecheckbox.

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:

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:

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:

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:

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:

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:

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:

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:

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:

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 :

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

TextInput

HtmlInputSecret

<h:inputSecret>

Zonedemotdepasse

SecretInput

HtmlInputHidden

<h:inputHidden>

Champcach

HiddenInput

HtmlInputTextArea

<h:inputTextarea>

Zonedetextemultilignes TextareaInput

ENI Editions - All rigths reserved

- 1-

HtmlOutputLabel

<h:outputLabel>

tiquetteassocieun
autrecomposant

OutputLabel

HtmlOutputFormat

<h:outputFormat>

Affichagedunensemble
demessagesselonun
formatspcifique

OutputFormat

HtmlOutputLink

<h:outputLink>

Hyperliendont
Nonreprsent
lutilisationneprovoque
pasdvnementdetype
ActionEvent
(contrairementau
composantdetype
HtmlCommandLink)

HtmlOutputText

<h:outputText>

Textesimple.Peuttre
associdautres
composants,telsque
HtmlCommandLink.

HtmlSelectBooleanCheckbox

<h:selectBooleanCheckbox> Casecocher

SelectBoolean
Checkbox

HtmlSelectManyCheckbox

<h:selectManyCheckbox>

Ensembledecases
cocher

SelectMany
Checkbox

HtmlSelectOneMenu

<h:selectOneMenu>

Zonedelistedroulante SelectOneMenu
choixunique

HtmlSelectManyMenu

<h:selectManyMenu>

Zonedelistechoix
SelectManyMenu
multiple(unseullment
visible)

HtmlSelectOneListBox

<h:selectOneListbox>

Zonedelistechoix
unique.Plusieurs
lmentsvisibles.

SelectOneListbox

HtmlSelectManyListBox

<h:selectManyListbox>

Zonedelistechoix
multiples.Plusieurs
lmentsvisibles.

SelectManyListbox

HtmlSelectOneRadio

<h:selectOneRadio>

Boutonradio

SelectOneRadio

OutputText

Catgorie:composantsdetype"Commande"
HtmlCommandButton

<h:commandButton>

Bouton

CommandButton

HtmlCommandLink

<h:commandLink>

Hyperliendont
lutilisationprovoquela
gnrationdun
vnementdetype
ActionEvent.

CommandLink

Catgorie:composantsdetype"Tableaudedonnes"
HtmlDataTable

<h:dataTable>

Tableaudedonnesde
NlignesetMcolonnes

DataTable

HtmlColumn

<h:column>

Colonnedetableaude
donnes.

Column

Catgorie:composantsde
type"Prsentation"

- 2-

ENI Editions - All rigths reserved

HtmlPanelGrid

<h:panelGrid>

Grilledeprsentationde PanelGrid
NlignesetMcolonnes

HtmlPanelGroup

<h:panelGroup>

Conteneurde
composants

PanelGroup

Catgorie:composantsdetype"Messages"
HtmlMessage

<h:message>

Texteaffichantles
messagesderreur
gnrsparlutilisation
delundescomposants
delapage.

Message

HtmlMessages

<h:messages>

Texteaffichanttousles
messages.

Messages

<h:graphicImage>

Image

GraphicImage

<h:form>

Formulairedesaisie.

Form

Catgorie:composantdetype"Images"
HtmlGraphicImage
Catgorie:composantdetype
"Formulaire"
HtmlForm

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 :

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:

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:

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)

Rle

LengthValidator

<f:validateLength>

validateLength

Contrledelalongueur
dunechanede
caractres.

LongRangeValidator

<f:validateLongRange>

validateLongRange

Permetdecontrlerune
valeurnumriqueentire.

DoubleRangeValidator

<f:validateDoubleRange> validateDoubleRange

Permetdecontrlerune
valeurnumrique
dcimale.

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.

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.

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:

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:

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:

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:

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.

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:

- 4-

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.

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:

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:

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.

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:

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:

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:

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 :

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:

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:

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:

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.

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:

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-

Vous aimerez peut-être aussi