You are on page 1of 33

JSF2 et EJB3 Session Ce document est composé de 2 tutoriaux.

Le premier montre comment concevoir et développer le use case ‘Créer son profil’ avec JSF. A ce stade l'objectif est de comprendre JSF dans ce u'il ! a de commun " toute version# ue ce soit la version $.2 ou la version 2. %ne seconde partie aborde les apports de la version 2 de JSF Le second tutorial expose les &J'( session " partir de l'application )etstore et explicite l'injection de dépendance. *n montre notamment comment implémenter un &J'( stateful avec JSF. +a fin du document définit les étapes pour confi,urer l'application )etstore sous Jboss-..$./.0A.

J. HILDEBRAND

1/33

Première p rtie ! Petstore en JSF2 I. Les " ses de JSF # p rtir d$ $se c se %&r'er son pro(i)% 1. E xpr e s s ion de s be soin s +es internautes doivent saisir leurs informations 1 lo,in# identité# adresse et carte bancaire pour 2tre connus du s!st3me et passer leurs commandes en li,ne.
<<extend>> Créer son profil Internaute Commander en ligne

2/33

1.1 *se c se &r'er son pro(i)
Nom R's$m' Créer son profil )ermet " un internaute de créer son lo,in puis de saisir ses informations personnelles pour 2tre connu du s!st3me et pouvoir passer commande sur le catalo,ue )etstore. 4nternaute 1. +'internaute rempli les in(orm tions de )o,in 1 Customer id 567 )ass8ord 567 )ass8ord 59epeat7 567 2. :3s u'il valide ces données# le s!st3me contr;le la conformité de la saisie# puis rediri,e le user sur le formulaire des in(orm tions personne))es 1 First <ame 567 +ast <ame 567 =elep>one &mail Street $ Street 2 Cit! State ?ipcode Countr! Credit Card <umber Credit Card =!pe

Acte$r Pr'+conditions Description

3/33

BDC Si le format de la date d'expériation de la carte de crédit n'est pas respecté une exception CheckException est levée.é au s!st3me et peut remplir son cad! en consultant le catalo. – les liens 'Account' 5pour mise " jour du compte par l'internaute7 et 'Cart' 5pour visualiser le contenu du cad!7 sont accessibles sur la pa. E-ceptions B$C %ne exception de validation CheckException est levée si l'un des c>amps obli./33 .atoires est man uant.Credit Card &xpir! :ate 1 le format de cette date est @@AAA.e.atoires. Post+conditions +e profil de l’internaute est créé.ue 1 – la pa. B2C Si le customer id existe déj" dans le s!st3me une exception createException est levée.ue est personnalisée en mentionnant le prénom et le nom de l'internaute.e du catalo. . 4l est lo. B(C Si les deux mots de passe ne sont pas identi ues# une exception CheckException est levée. +es c>amps 567 sont obli.

1.2 Ecr ns d$ $se c se //33 .

0/33 .

Post+condition ! redirection s$r )e c t )o.$e 1/33 .

4/33 . C on c eption 2odè)e o"3ets +es écrans sont constitués de composants . <<boundary>> newsignon +<inputText customerId> +<inputSecret password> +<inputSecret password2> +<commandButton createNewCustomer>() <<boundary>> createcustomer +<outputText id> +<inputText firstname> +<inputText astname> +<inputText emai > +<inputText te ep!one> +<inputText street"> +<inputText street2> +<inputText city> +<inputText #ipcode> +<se ect$ne%istbox country> +<se ect$ne%istbox state> +<se ect$ne%istbox creditCardType> +<inputText creditCardNumber> +<inputText creditCard&xpiry'ate> +<se ectItems istState>() +<se ectItems istCountry>() +<se ectItems istCreditCardType>() +<commandButton submit>() Seuls sont représentés les composants ui participent " la création du profil par le s!st3me 1 mise en évidence de l'essentiel du s!st3me " modéliser.rap>i ues JSF.2.

5/33 .

Couche présentation <<boundary>> new signon +<inputText customerId> +<inputSecret password> +<inputSecret password2> +<commandButton createNewCustomer>() <<mana(edBean>> LoginControllor +customerId +password +password2 +create() )error*essa(e() +settters() +(etters() <<boundary>> createcustomer +<outputText id> +<inputText firstname> +<inputText astname> +<inputText emai > +<inputText te ep!one> +<inputText street"> +<inputText street2> +<inputText city> +<inputText #ipcode> +<se ect$ne%istbox country> +<se ect$ne%istbox state> +<se ect$ne%istbox creditCardType> +<inputText creditCardNumber> +<inputText creditCard&xpiry'ate> +<se ectItems istState>() +<se ectItems istCountry>() +<se ectItems istCreditCardType>() +<commandButton submit>() <<mana(edBean>> CustomerControllor +Customer + istState + istCountry + istCreditCardType +create() )error*essa(e() +setters() +(etters() 16/33 .+es valeurs des c>amps ou les attributs 'action' sont mappés sur les beans .érés par JSF.

rap>i ues sont reliés au s!st3me " un instant donné. Couche présentation Couche service Couche métier <<boundary>> newsignon +<inputText customerId> +<inputSecret password> +<inputSecret password2> +<commandButton createNewCustomer>() <<mana(edBean>> LoginControllor +customerId +password +password2 +create() )error*essa(e() +settters() +(etters() <<contro >> CustomerServiceLocal +createCustomer() +id +firstname + astname +password +emai +te ep!one ++ddress +CreditCard <<entity>> Customer <<contro >> CustomerServiceBean +createCustomer() <<boundary>> createcustomer +<outputText id> +<inputText firstname> +<inputText astname> +<inputText emai > +<inputText te ep!one> +<inputText street"> +<inputText street2> +<inputText city> +<inputText #ipcode> +<se ect$ne%istbox country> +<se ect$ne%istbox state> +<se ect$ne%istbox creditCardType> +<inputText creditCardNumber> +<inputText creditCard&xpiry'ate> +<se ectItems istState>() +<se ectItems istCountry>() +<se ectItems istCreditCardType>() +<commandButton submit>() <<mana(edBean>> CustomerControllor +Customer + istState + istCountry + istCreditCardType +create() )error*essa(e() +setters() +(etters() <<entity>> States +e ements() <<entity>> Countries +e ements() <<entity>> CreditCardTypes +e ements() 11/33 .4ndépendance couc>e présentation et couc>e métier 1 une modification de l'4E@ 5utilisation d'un command+inF au lieu d'un command'utton7 n'induit pas une modification des objets métier. +es composants .

rap>i ues avec le rendu >tml.e par défaut de la version 2 de JSF..com/jsf/core" xmlns:h="http://java. &lle ne .e Js( &n JSF2 une pa. </h:form> </f:view> </html> -7tm) est le lan..com/jsf/html" > <f:view> <h:form i ="createcustomer!orm"> .sun. Htm) est une bibliot>3 ue de composants .sun. 4l combine le xml et le >tml D. 12/33 .e suit le s uelette ci-apr3s 1 <html xmlns="http://www.org/1999/xhtml" xmlns:f="http://java.3. L p .a.w3.3re pas le rendu. &ore est une bibliot>3 ue de JSF de composants et fonctionnalités.

list(tate'" /> </h:select)ne#ist*ox> .9/< </h:form> </f:view> </html> 13/33 ..state'" > <f:select+tems value="%&customercontrollor.w3...sun. <h:comman .cre te.lastname'"/> .sun.utton value="(u*mit" ction89%:c$stomercontro))or.org/1999/xhtml" xmlns:f="http://java. <h:output"ext value="(tate :" /> <h:select)ne#ist*ox i ="state" value="%&customercontrollor.com/jsf/core" xmlns:h="http://java.<html xmlns="http://www.com/jsf/html" > <f:view> <h:form i ="createcustomer!orm"> <h:output"ext value="#astname$ :"/> <h:input"ext value="%&customercontrollor.customer..customer.

")/ private (elect+tem01 list(tate / private (elect+tem01 list-ountr2 / private (elect+tem01 list-re it-ar "2pe / 345.")/ ' pu*lic voi set-ustomer..") = customer./33 .é a au minimum un constructeur sans ar.ument et des accesseurs.") customer.")/ ' ...") get-ustomer.' %n bean mana. Le "e n m n .") customer.ean/ Les ccesse$rs permettent la mise " jour des attributs 1 // UPDATE MODELE pu*lic -ustomer..")6-ustomer.")7 & this.. Les ttri"$ts du bean sont mappés sur les valeurs " saisir de la pa.")67 & return customer.ean/remote"7 -ustomer(ervice8emote customer. 4l est associé 5bindé7 " une ou plusieurs pa.customer. 6name ="petstore/-ustomer(ervice. 1.es x>tml.e 1 private -ustomer.

get(imple9ame67 alrea 2 exists.get-lass67.ean. 1//33 .<+=.")7/ // 9.get-ause67 instanceof ."7/ ' else & errorBessage6e.e AA 4<G*H& A))+4CA=4*< pu*lic (tring create67& (tring response =null/ final (tring mname = "create"/ "race.48 84(@)9(4 response ="in ex"/ + ' catch 64xception e7 & // 849.get-lass67.getBessage677/ ' ' return response/ ' C " : (ign )n again.L m't7ode cre te correspond " l'attribut action du command'utton de la pa.entering6this.48 84(@)9(4 if 6e.create-ustomer6customer.") =customer.get(imple9ame67: mname7/ tr2 & // -reates the customer customer."+)9 8>#4 ? 849.uplicateAe24xception7 & errorBessage6e.get-ause67.

. ic e < < e n tity > > C u s to m e r 0 & S T $ 0 &3 I & 8 + ./. $ N S & . ' + T &* $ ' & % & 2 -c u s to m e r -s e t7 i r s tn a m e ( ) --.r mme de s'=$ences + +e code du bean suit le c!cle de vit d'une re u2te JSF. Di . % /0 & 1 2 & S T3 + % 2 & S . e r to r ss o n te x 9 c u t9 sp o u rc o n tr :e ro ufo r m a tte re s. u ee s tr e c o n s tr u i tp a r e7 r o n tC o n tr oo r T o u te se s. ae u r sd e a. ae u r sd e sc ! a m p s - 2 . -c u s to m e r -s e t% a s tn a m e ( ) I N 3 $ 4 &+ . % I C + T I $ N < -" -c r e a te c u s to m e r ( c u s to m e r ) < -" -" -c r e a te c u s to m e r ( ) in d e x < -2 -o u tc o m e = > in d e x > ( ) N + 5 I 5 + T I $ N0 2 % & 10/33 ? -a ffi c ! e ( ) 0 & N ' & 00 & S . S é q u e n c e ss u i t eàu nc l i q u es u rl eb o u t t o nS u b m i t c r e a te c u s to m e r C u s to m e r C o n tr oe r C u s to m e r ' ee ( a te C u s to m e r S e r . 0 $ C & S S3 + % I ' + T I $ N S % 6a r b r ed e sc o m p o s a n tsd e a. u es o n tr 9 c u p 9 r 9 e s - % e s. . aid a to r so uc o n .

in.jsf.customer. A l'instanciation de CustomerControllor# la propriété customer:=* est valuée d3s l'ouverture de la pa.és par JSF et définit les r3.ation.-ustomer-ontrollor </manage ?*ean?class> <manage ?*ean?scope>session</manage ?*ean?scope> <propert2?name>customer.we*.les de navi.e.we*. L e fi chi er fa c e s-c onfig.")'</value> </manage ?propert2> </manage ?*ean> 11/33 .2aps.#ogin-ontrollor </manage ?*ean?class> <manage ?*ean?scope>session</manage ?*ean?scope> </manage ?*ean> <manage ?*ean> < escription>customercontrollor</ escription> <manage ?*ean?name>customercontrollor</manage ?*ean?name> <manage ?*ean?class> com. &lle est issue du lo.2aps.6.xml :éclare les beans mana. <manage ?*ean> < escription>login</ escription> <manage ?*ean?name>login</manage ?*ean?name> <manage ?*ean?class> com.petstore.jsf.petstore.")</propert2?name> <value>%&login.

+es ( ce)ets sont tout " la fois un mod3le de conception et une tec>nolo.ners peuvent visualiser les pa. ● ● 14/33 . &xemple de la pa.ners.ns pattern ui sont des mod3les objets .ner et le développeur JSF 1 les desi.II..i=$e o"3et dans la conception des interfaces . Avec les facelets# JSF2 place au coeur de son frame8orF ) )o.n pattern composite+>ie?.x>tml Fra. )ermettent de travailler avec Dre m?e >er et de visualiser les composants JSF en de>ors de tout serveur d'application. Des )o. 1.ners. C'est le desi. 4l est associé " la tec>ni ue du temp) tin. %tilisent des desi.es en de>ors d'un serveur =omcat.menter )es >$es pour en faire des compos nts r'$ti)is ")es.icie)s d'di's $.ie.e createcustomerIvie8Idesi. Motivation s ● )ermettre la s'p r tion des m'tiers entre le desi. Les pports de JSF2 Adoption des ( ce)ets comme st nd rd de JSF2.desi.rap>i ues avec pour objectifs la réutilisabilité pour faciliter les évolutions.rap>i ues.

ment de vue est automati uement répercuté sur c>a ue vue composite ui l'utilise. 15/33 . Les >$es 3s( de Petstore sont or.ement sur un fra.n pattern composite-vie8 une tec>nolo.ie ui compile les ta. *ne ( ce)et est une section de pa.spects un frame8orF ui s'appuient sur le desi. +e template centralise tout le looF and feel de l'application.2.anisées en ( répertoires 1 composition template facelets %ne vue est une composition 5répertoire composition7 de fra. L e s fa c el et s De$..le le looF and feel de ses vues subalternes " partir du template.es 5répertoire facelets7.n p ttern composite+>ie? *ne >$e composite est une vue utilisant des fra.ments de pa.s sont proposés 1 le composant# la composition# la décoration . +e looF and feel de l'ensemble est assuré " partir d'un template. :e plus# une vue composite contr. Po$r imp)'menter le desi. 5Sun java 'lueprints7. %n c>an.e réutilisable ou un ensemble de composants dans l'arbre JSF ui peut elle m2me 2tre constituée d'autres facelets etAou inversement 2tre utilisée par une facelet parent.ments de vues réutilisables.1 %n (r me?or@ ui s'appuient sur le desi.n-patern composite-vie8# di(('rents t ..s des vues de faJon plus efficace 2.

+e prosessus de compilation des facelets est plus rapide ue celui des jsp# car il n'! a pas de b!te code java " .énérer et compiler lors de toute initialisation de pa. +es facelets remp) cent )e st nd rd JSP dans JSF2.2. &lle construit dans un objet Facelet l'arbre des ta. A ce sta.rammaire des balises. 26/33 .e. :ans un premier temps# une facelet utilise un compi) te$r BHC2L.ie ui compi)e )es t .2 %ne tec7no)o.e x>tml vérifie la .s des vues de ( Aon p)$s e((ic ce.s de la vue. :ans un second temps# une facelet $ti)ise SAB pour compiler les différents éléments de la vue.

énéral# lors de la survenue d'une erreur# dans une série de mises-"-jour etAou contr. +es "e ns mana.Seconde p rtie ! Petstore en EJB3 session +e tutorial expose les &J'( session " partir de l'application )etstore et explicite l'injection de dépendance.estion des transactions par le container.les. +'arc>itecture en couc>es est mise en évidence 1 +es EJB3 session 5couc>e service7 utilisent une data source confi.uée au niveau 5supérieur7 des mét>odes des services de l'&J' pour déclenc>er un rollbacF . 21/33 .és de JSF 5couc>e cliente7 utilisent l'injection de dépendance pour accéder aux &J' session.urée dans Jboss pour autoriser une fonctionnalité des &J' 1 la .3rent pas les transactions 1 cette fonctionnalité est délé. +es DAD 5couc>e métier7 ne .

Session'ean.ejb.it d'un ejb stateless.&J'*bject.e par le conteneur pour utiliser les fonctionnalités des &J'(.P 2. K=ransaction@ana.estion des tr ns ctions est prise en c>ar.. EJB st te)ess $. L . K=ransactionAttribute5value L =ransactionAttribute=!pe.ejb.REQUIRED7 p$")ic Customer:=* createCustomer5(in ) Customer:=* customer:=*7 t7ro?s Create&xception# C>ecF&xception O. +es mét>odes n'ont plus " spécifier 't>ro8 9emote&xception' issu de l'interface javax. +e bean n'a plus " implémenter les mét>odes &J' CallbacF spécifier dans l'interface javax.érée par le conteneur.CONTAINER7 A condition de définir $ne d t so$rce .I.uration de l'ejb sont " supprimer. C>a ue mét>ode délimite la liste des actions " réaliser au sein d'une transaction. Sur )e "e n 5couc>e service7 CustomerService'ean +'annotation ESt te)ess indi ue au conteneur u'il s'a.it de l'interface..ement5valueL=ransaction@ana. Sur )%inter( ce dist nte CustomerService9emote +'annotation K9emote indi ue au conteneur u'il s'a. +es fic>iers de confi. K9esource5nameLM)etstore:SM# mapped<ameLMjava1)etstore:SM7 pri> te :ataSource dsN +a politi ue transactionnelle se définit $ ni>e $ des m't7odes de ) co$c7e ser>ice. 22/33 .ement=!pe.

E-pression des "esoins +'internaute rempli son cadd! d'articles en consultant le catalo.ue. 23/33 . EJB st te($) 1. :3s u'il appuie sur le lien C>ecF *ut# la commande est validée.II.

+es fic>iers de déploiement de l'ejb stateful sont " supprimer. 2./33 .

ateur.2. &n &J'(# un looFup sur le contexte est suffisant 1 la mét>ode 'create' de l'&J'Eome n'est pas invo uée. $ 8EfErence e lDej* stateful. 2 utilisateurs ouvrant 2 navi.ateurs 5et 2 sessions distinctes7 auront des cadd! distincts. +es c>oix de l'internaute sont mémorisés pendant la durée de vie de la session.& rtLoc tor /$$ #ocator e lDej* stateful. +'ejb stateful est injecté 5instancié7 par JSF " c>a ue fois u'un utilisateur ouvre un navi.'e p r JSF >ec $ne port'e session. pour 2tre m n . &) sse S7oppin. Cette classe est déclarée dans le fic>ier faces-confi. $ #a valeur est injectEe par 5(! $ $/ private (hopping-art shopping-ar >ser=getShoppingCart67/ pu*lic (hopping-art get(hopping-ar >ser67 & return shopping-ar >ser/ 2//33 .& rtLoc tor a pour objet de récupérer une référence distante 5ShoppingCart7 sur l'ejb stateful 5ShoppingCartBean7.ean managE par 5(! pu*lic class (hopping-art#ocator & e portEe session $/ /$$ @ropriEtE managE. . In3ection de d'pend nce +a classe S7oppin.

throwing6"(hopping-art.' pu*lic voi set(hopping-ar >ser6(hopping-art shopping-ar >ser7 & this.elegate": mname: e7/ ' return shopping-art8emote/ ' ' 20/33 .shopping-ar >ser = shopping-ar >ser/ ' pu*lic static (hopping-art get(hopping-art67 & final (tring mname = "get(hopping-art"/ (hopping-art shopping-art8emote =null/ tr2 & // #ooFs up for the remote interface -ontext context = new +nitial-ontext67/ shopping-art8emote = 6(hopping-art7context.ean/remote"7/ ' catch 64xception e7 & "race.looFup6"petstore/(hopping-art.

-a 2-ontrollor </manage ?*ean?class> <manage ?*ean?scope>session</manage ?*ean?scope> <manage ?propert2> <propert2?name>customer.petstore.Fic7ier ( ces+con(i.customer.2aps.petstore.")'</value> </manage ?propert2> <manage ?propert2> <propert2?name>shopping-ar >ser</propert2?name> <value>%&shopping-ar .shopping-ar >ser'</value> </manage ?propert2> </manage ?*ean> 21/33 .jsf.common.")</propert2?name> <value>%&login.(hopping-art#ocator </manage ?*ean?class> <manage ?*ean?scope>session</manage ?*ean?scope> </manage ?*ean> <manage ?*ean> < escription>ca 2</ escription> <manage ?*ean?name>ca 2</manage ?*ean?name> <manage ?*ean?class> com.we*.2aps.locator. <manage ?*ean> < escription>shopping-ar </ escription> <manage ?*ean?name>shopping-ar </manage ?*ean?name> <manage ?*ean?class> com.

.. 2 u user. the total of the shopping cart an total = shopping-ar >ser. shopping-ar >ser.. // 8EfErence sur lDej* stateful (hopping-ar .get"otal67/ ' .get+tems67/ // ..3.jsp7 récup3re l'ejb 5s>oppin. 24/33 .remove+tem6item+ 7/ // =ets the content of the (hopping -art an cart+tems..é CaddyControllor 5associé " la pa.") = shopping-ar >ser.ean 5(! associE G la page cart. /$$ $ .ean (hopping-art shopping-ar >ser / pu*lic (tring remove67 & . 4l n'est plus nécessaire dans le code d'utiliser ShoppingCartLocator. &)ient JSF + &) sse & ddF&ontro))or +e bean mana.e cart.getShoppingCart() pour créé l'ejb..Card%ser7# initialement instancié par JSF...jsp : affiche et met G jour le ca $/ pu*lic class -a 2-ontrollor exten s -ontrollor & .

+es jars se trouvent sous le répertoire lib du projet.$..#$ 1 %& cl ar er le s librairie s s ou s e clip s e *uvrir le projet sous eclipse 1 )rojet# Java 'uild )at># Add &xternal JA9s Ajouter la liste de librairies.In st allation s ou s bo s s !.0AQclient.". 2 Cr & er le r&pertoire pet store s ou s " partir d'une copie du répertoire standard. )our faire tourner les tests Junit sous eclipse# ajouter dans les librairies du projet les fic>iers jars du répertoire C1Q*utilQjboss./. 'os s 25/33 .1.

( %& cl ar er le s librairie s s ou s bo s s Ajouter la )i"r irie de mFs=) dans le répertoire lib de petstore 1 ). 36/33 . C opier dan s le r&pertoire deplo* de pet store le fichier m* s+l-d s. xml +ui d&finit la data s our c e .

31/33 .

! %&plo*er le pro-et s ou s bo s s en utilisant le fic>ier build.ateur# . 32/33 . fermer le navi. supprimer les répertoires tmp et 8orF de petstore sous Jboss# ..ateur +a classe MyPha eLi tener permet de lo.xml. vider les cac>es du navi. )our déplo!er une nouvelle version de jsf# il est souvent nécessaire de 1 .er les p>ases du c!cle de vie d'une re u2te jsf.

%& cl ar er le be an m an ag & dan s le fichier fa c e s-c onfig %&finir le s r2gle s de natigation %&plo*er le pro-et 33/33 . / 1( Impl&m enter l0e-b s t atel e s s C u s tomer 1 e rvi c e ' e an. • • Spécifier la politi ue transactionnelle du bean# des mét>odes# la data source utilisée. %tiliser la classe Junit CustomerService =est# pour vérifier les services de l'ejb. C ompl&ter la c l a s s e C u s tomer Controllor.. C ompl&ter le s fa c el et s c r e at e cu s tomer et update cu stomer .