Struts - FR Essential - V1.0

download Struts - FR Essential - V1.0

of 57

Transcript of Struts - FR Essential - V1.0

http://www.labo-sun.com [email protected]

FrameworkStrutsModleMVC

Auteur:HlneSemereJouiCyrilVersionn0.1DfvrierYYYY Nombredepages:57

EcoleSuprieuredInformatiquedeParis 23.rueChteauLandon75010PARIS

www.supinfo.com

FrameworkStrutsModleMVC

2/57

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

3/57

Tabledesmatires 1.INTRODUCTION ..................................................................................................................................... 6 1.1.PRSENTATIONDELAPLATEFORMEJ2EE ..................................................................................................... 6 1.2.QUELQUESRAPPELS .................................................................................................................................. 6 1.2.1.DesServletsauxJSP ..................................................................................................................... 6 1.2.2.DanslaJSP :JavaBeansetTagLib .............................................................................................. 7 1.2.3.Dfinitionetintrtsdunframeworkdeprsentation .................................................................. 7 2.DESIGNPATTERNMVC ....................................................................................................................... 9 2.1.MODLEMVC(MODELVIEWCONTROLLER) .............................................................................................. 9 2.2.MODLEMVC2 .................................................................................................................................... 10 3.QUESTCEQUESTRUTS ? ................................................................................................................ 11 3.1.PRSENTATION ........................................................................................................................................ 11 3.2.ARCHITECTURE ....................................................................................................................................... 11 3.2.1.Cycledeviedunerequtehttp ................................................................................................... 11 3.2.2.Vuedensembleduneapplicationstruts ..................................................................................... 12 3.2.3.Packagesprincipaux ................................................................................................................... 12 3.2.4.Librairiesdpendantes ................................................................................................................ 12 3.3.LESMODLES MODLISATIONMTIER : ........................................................................................................ 13 3.3.1.Classemtier ............................................................................................................................... 13 3.3.2.ExempledecomposantModle ................................................................................................... 13 3.4.LESVUES .............................................................................................................................................. 14 3.4.1.LesTaglibStruts ........................................................................................................................ 14 3.4.1.1.StrutsHtml ......................................................................................................................................... 15 ...... 3.4.1.2.StrutsLogic ............................................................................................................................................ .. 15 3.4.1.3.StrutsBean ......................................................................................................................................... 16 ...... 3.4.1.4.StrutsNested ...................................................................................................................................... 17 ......

3.5.LECONTRLEUR ..................................................................................................................................... 17 3.5.1.ServletGnrique :ClassesdactionStruts ................................................................................ 17 3.6.LINTERNATIONALISATION ......................................................................................................................... 19 3.6.1.Lesfichiers Properties ........................................................................................................... 19 3.6.2.OutilsStruts ................................................................................................................................ 19 3.7.LETRAITEMENTDESERREURS .................................................................................................................... 20 3.8.FICHIERDECONFIGURATION ...................................................................................................................... 20 3.8.1.Assemblagedel'application ........................................................................................................ 21 3.8.2.Datasources ................................................................................................................................ 21 3.8.2.1.Exemple ................................................................................................................................................... 22 . 3.8.2.2.Utilisationdanslapplication ................................................................................................................. .. 23 3.8.3.1.Exemple ................................................................................................................................................... 24 . 3.8.4.1.Exemple ................................................................................................................................................... 24 . 3.8.5.1.Exemple ................................................................................................................................................... 25 . 3.8.6.1.Exemple ................................................................................................................................................... 26 . 3.8.7.1.Exemple ................................................................................................................................................... 28 .

3.8.3.FormBeans .................................................................................................................................. 23 3.8.4.Exceptions ................................................................................................................................... 24 3.8.5.GlobalForwards ......................................................................................................................... 25 3.8.6.Actionmappings .......................................................................................................................... 25 3.8.7.Controller .................................................................................................................................... 27 3.8.8.Messageresources ...................................................................................................................... 28 http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

4/57

3.8.8.1.Exemple ................................................................................................................................................... 28 .

3.8.9.Plugin ........................................................................................................................................ 28

3.8.9.1.Exemple ................................................................................................................................................... 29 .

3.9.INTGRATIONAVECLAPPLICATIONWEB ..................................................................................................... 29 4.LESTILES ............................................................................................................................................... 31 4.1.PRSENTATION ........................................................................................................................................ 31 4.2.ARCHITECTURE ....................................................................................................................................... 31 4.3.INSTALLATION ........................................................................................................................................ 32 4.4.FICHIERDECONFIGURATION ...................................................................................................................... 32 4.4.1.Baliseracine ............................................................................................................................... 32 4.4.2.Balisedefinition .......................................................................................................................... 33 4.4.3.Baliseput .................................................................................................................................... 33 4.4.4.BaliseputList ............................................................................................................................... 34 4.4.5.Baliseitem ................................................................................................................................... 34 4.4.6.Balisebean .................................................................................................................................. 35 4.4.7.Balisesetproperty ...................................................................................................................... 35 4.5.LAYOUTS ............................................................................................................................................... 36 4.5.1.Lefichierdestructure ................................................................................................................. 36 4.6.TILES .................................................................................................................................................... 38 4.7.EXEMPLEDARCHITECTUREDEDFINITIONS .................................................................................................. 38 5.VALIDATOR&FORMULAIRES ....................................................................................................... 40 5.1.PRSENTATIONETARCHITECTURE ............................................................................................................... 40 5.2.FICHIERSDECONFIGURATION ..................................................................................................................... 40 5.2.1.Danslefichierstrutsconfig.xml ................................................................................................. 40 5.2.2.Lefichiervalidatorrules.xml : ................................................................................................... 41 5.2.3.Lefichiervalidation.xml : .......................................................................................................... 42 5.3.DYNAFORMS .......................................................................................................................................... 46 5.4.RSUMDELACONFIGURATIONDESVALIDATORS ........................................................................................ 49 6.INTGRATIONAVECXDOCLET ..................................................................................................... 50 6.1.STRUTSCONFIG.XML ................................................................................................................................ 50 6.1.1.Tags@Struts ............................................................................................................................... 50 6.1.2.Exemples ..................................................................................................................................... 52 6.1.3.IntgrationavecAnt .................................................................................................................... 53 7.CASCONCRET(ARCHITECTURE) .................................................................................................. 55 7.1.PRSENTATION ........................................................................................................................................ 55 7.2.ARCHITECTURE ....................................................................................................................................... 55 7.3.COUCHEMTIER ...................................................................................................................................... 55 7.3.1.Couchedaccsauxdonnes(DAO) ........................................................................................... 55 7.3.2.Coucheservice ............................................................................................................................ 55 7.4.COUCHEAPPLICATION .............................................................................................................................. 55 7.4.1.Action .......................................................................................................................................... 55 7.4.1.1.ActionForm .................................................................................................................................. ............ 55

7.4.2.Forwards ..................................................................................................................................... 56 7.4.3.Exceptions ................................................................................................................................... 56 7.5.COUCHEPRSENTATION ............................................................................................................................ 56 7.5.1.Tiles ............................................................................................................................................. 56 7.5.1.1.Dfinitions ........................................................................................................................................... 56 ..... 7.5.1.2.Jsp(layoutsettiles) ........................................................................................................... ...................... 56

7.5.2.Formulaires ................................................................................................................................. 56 http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

5/57

7.5.3.Messagesderreur(MessageApplication) ................................................................................... 56 8.LAVENIRDESTRUTS ........................................................................................................................ 57 8.1.INTGRATIONAVECJSTL ........................................................................................................................ 57 8.2.INTGRATIONAVECJSF ........................................................................................................................... 57 8.3.ADOPTIONGNRALISEDESTRUTS ........................................................................................................... 57

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

6/57

1.Introduction1.1.PrsentationdelaplateformeJ2EEJ2EE(Java2EnterpriseEdition)estunensembled'APIsvisantledveloppementd'applications orientesentreprise. Parmis ces APIs, certaines existent dj dans la version "standard" de Java (Java 2 Standart Edition),tandisquedautresnesontprsentesquedanslaversionorienteentreprise.Ainsiona lesAPIsEJBs(EnterpriseJavaBeans)ouJMS(JavaMessageService)quisontspcifiquesaujdk J2EE,linversedesAPIsJDBCouRMIquiexistentaussidanslejdkJ2SE. LaplateformeJ2EEprsenteunesolutionoptimalepourdvelopperdesapplicationsrobustes, scurisesetvolutives.Eneffet,choisircettetechnologie,cestsuivreuncertainnombrede rgles.Lebutesteneffetdespareraumaximumlapplicationencouches. Ce que lon va justement dtailler dans ce cours est de quelle manire on va dcouper les diffrentescouches,quelmodleutiliser,etavecquelsoutilslefaire.

1.2.QuelquesrappelsAvantdecommencercecours,quelquesrappelssurlesJSP/Servlets,lesJavaBeansainsique lesTagLib:

1.2.1.DesServletsauxJSPLorsquelonvadvelopperunsiteWeblaidedestechnologiesJ2EE,onpeutdifficilement passerctdesServlets. Une Servlet est une classe java chargeune seule et premire fois par le moteur de Servlet (exemple:Tomcat)lorsdesonpremierappel. Parlasuite,onferatoujoursappellamme instancedecetteServlet. ChaquefoisquelonvacreruneServlet,oncrerauneclasseimplmentantlinterfaceServletet doncredfinirquelquesmthodesdontlesmthodes publicvoidinit(ServletConfigcfg)quiseraappelelorsdupremierappeldelaServlet, lorsdesoninstanciation. publicvoidservice(ServletRequestreq,ServletResponseres)quiseraappelechaque appeldelaServletinstancie. publicvoiddestroy()quiseraappelejusteavantladestructiondelaServlet.

Ainsi,cestdanslamthodeservice() quevasetrouverlecodejavadontlersultat,envoyau browser,permettralaffichagesurunepageWeb.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

7/57

Leproblmeestquesilonsuitceprincipe,lapartietraitementdenotrecodeestmlelapartie prsentationalorsque,commeillatprcisprcdemment,lesbasesmmeduneapplication utilisantlestechnologiesJ2EEestledcoupageencouches. Poursparerclairementlapartietraitementdelapartieprsentationdenotreapplication,onva doncutiliserlespagesJSP. UnepageJSPressembleunepageHTMLpouvantcontenirdesbalisesJSPet/ouducodeJava. Ellevadoncnouspermettredafficherlesrsultatsdestraitementseffectusenarrireplandans desclassesJava.Danscecas,lapageJSPvatreconvertieenServletpuisleprocessusvatrele mmequepouruneServletclassique.

1.2.2.DanslaJSP:JavaBeansetTagLibDansnotrepageJSP,onvapouvoirutiliserdiffrentscomposantspourafficherlesdiffrents rsultatsdestraitementseffectusdanslescouchesinfrieures. LesJavaBeanssontdescomposantsquivontpermettredinstancieretmanipulerdiffrentsobjets Java(portedelapage,derequte,desessionoudelapplication)laidedebalisesJSP. Lavantageestquelorsquilvarencontrerunebalise,leserveurvaautomatiquementdtectersi linstancedelobjetexistedjounon.Sicestlecas,ilreprendlinstanceexistantesinonilen creunenouvelle.Celavapermettredutiliserunmmeobjetsurplusieurspages,voiretoutle longdelapplication. LesTagLibs,toutcommelesJavaBeanssontdescomposantsquivontpermettredinstancieret manipulerdiffrentsobjetsJavalaidedebalisesJSP.Cependant,ilsnepourrontavoirquune portelimitelapagecourante.Onnepourradoncpasrutiliserunemmeinstancedunobjet surplusieurspages.Pourchaquepagedelapplication,onaurauneinstancediffrente. LesTagLibs,balisespersonnalises,vontpermettre,entreautresdecrersespropresbalisesdela plussimplelapluscomplexeetainsidafficherlesrsultatsdesdiffrentstraitementsen quelqueslignes. Pourplusdinformationssurcescomposants,nhsitezpasconsulterlecourssurles Servlets/JSP.

1.2.3.DfinitionetintrtsdunframeworkdeprsentationOnadoncpuvoirquelesJSPoffrentunesolutionidalepourafficherlesrsultatsdes traitementseffectusenamont.Ilsreprsententlapartieprsentationdenotreapplication.Ona aussivuquelonpouvaitutiliserlesJavaBeansoulesTagLibspourviterdavoirducodeJava dansnospagesJSP. Cependant,lobjectifpremierdundveloppeurestdviterderefairechaquefoislamme chose. Pourcela,onvautiliserunframeworkquiimposeunemthodededveloppementsimpleet efficace.http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

8/57

Onvaalorsobteniruneapplicationrespectantlesobjectifsderutilisabilitquevisela programmationorienteobjet. Concrtement,unframeworkestlesqueletteduneapplication.Celavapermettrelacration rapidedactions/vnementsclassiques,parexemple,unformulaire(tenantcomptedelascurit, delavalidit,etc). Quelsquesoientlesoutilsutilissdanslescouchesinfrieures,leframeworkdeprsentation choisiestcompltementindpendant.Ilnouspermetdoncdatteindrelobjectifattendu;des couchescompltementindpendanteslesunesdesautres.Onpeutalorschangerlunedesdelles sansmodifierlesautres.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

9/57

2.DesignpatternMVC2.1.ModleMVC(ModelViewController)

LepatternModleVueContrleurestlundesmodleslesplusconnusetleplusclbredetous. IlattoutdabordlaborparXeroxlorsdeleurpremiersystmefentretplusparticulirement pourgrerlesinteractionsaveclutilisateur. LeproblmequersoutlemodleMVCestceluidelasimplificationdetroisgrandesfonctions communesdenombreusesapplications: Lamaintenancedesdonnesdansunstockagedebackendousurunsystmedistant. Laconstructiondelacoucheprsentationdestinelutilisateurfinal. La gestion de la logique conditionnelle qui dcide des crans qui sont prsents lutilisateur,decequisepasselorsquuneerreursurvientetdelafaonetdumoment exactsolessystmesdistantssontmisjour.

Ilestdoncpossibledecombinerlensembledecesmodulesetdavoiraufinalunsystmequi fonctionne.Cependantlesproblmesseposentlorsquevoussouhaitezmaintenirlecode.Eneffet danslecasdesJSP,lesconcepteursHTMLchargsdulookendfeeletceuxquimaintiennentle codedetraitementsontdiffrents. MVCtraiteceproblmeensparantlecodeentroispartiesdistinctes: LescomposantsModle,quimaintiennentlesdonnesdanslestockage. LescomposantsVue,quiconstituentlacoucheprsentationdestinelutilisateurfinal.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

10/57

LescomposantsContrleur,quigrentlalogiqueconditionnelle.Cestellequidcidedes cransquisontprsentslutilisateur,quigreleserreursetlamisejourdessystmes distants.

MVCsimplifiedonclamaintenancedelapplicationetempchentlestroistypesdelogiquesdese mlanger.Ilpermetgalementdemasquerlesdtailsdimplmentationdechaquedomaineaux deuxautresetrduitainsilesdpendancesdecodageentreeux.Decefait,MVCpermetdedfinir une frontire naturelle entre lesconcepteurs web qui maintiennent le code html et la couche prsentation. Undesavantagesconsidrabledansledveloppementdapplicationweb(jsp,servlet)estquele modleMVCfacilitegrandementlagestiondesexceptions(carellessonttoutesgresviale contrleur). Dautresavantagessappliquenttouteslesformesdetraitementconditionnel.Voiciquelques exemples: SidiffrentesVuessontncessairesenfonctiondesdonnesquisontextraitesdunebase dedonnesoudunsystmedistant,leContrleurpeutdciderdelapageprsenter. Sivotreapplicationchangeenfonctiondelheureet/ouladatedelajourne,leContrleur peutgrercelafacilement. Si un processus de saisie de donnes ncessite plusieurs pages, dont certaines sont facultatives.

CependantlepatternMVCestclairementdfinit,pourquoiparletonparfoisdeMVC1,MVC2?

2.2.ModleMVC2LemodleMVC2nariendeplusquelemodleMVC.LoriginedecenomvientdufaitqueSun, lorsdelasortiedesspcificationsJSP,indiquaitdansunesectionPageAccessModel(ou modledaccsJSP)unmodle1etunmodle2. Lemodle1dcrivaitletraitementJSPdelafaondontiltaitcourammentutilislpoque. C'estdirelarequteHTTPestdirectementenvoyeversunfichierjsp.Toutletraitementse faisaitalorsdanslapageJSP,etlarponsevenaitdecemmefichier. Lemodle2taitbiendiffrent.Ilindiquaitquectaitlaservletquidevaitrecevoirlarequte HTTP. Celleci pouvait alors effectuer les tches ncessaires au traitement de cette requte (mmoriserdesinformationsdanslebeantransmis)ettransmettrelesinformationsunepagejsp afinquecellecignrelarponseHTTP. AucunnomdetypeMVCnintervientdanscesmodles,cependantlemodle2seninspire troitement.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

11/57

3.QuestcequeStruts?3.1.PrsentationStrutsestunframeworkpourlesapplicationsweb. Un framework est une structure permettant de soutenir ou de contenir quelque chose, en particulierunsquelettepouvantservirdebaseuneconstruction(cf.dictionnaireanglais). Struts est en une collection de programmes Java conue pour vous aider construire des applicationsrobustesengagnantdutemps.Ilfournitlacharpenteetlegrosuvredebase.Ilvous restealorsplusquvousconsacrerlagencementetladcorationdespices! Outre que Struts vous permet de vous faire gagner du temps, il vous permet de voir des applicationscomplexescommeunesuitedecomposantsdebase:Vues,Actions,Modles. Ilvousfournitunensembledebonnespratiquesetunebasesolidementrflchie.Deplusrienne sertderinventerlaroue,Strutsvouspermetdepartirdunebasesolide,idalpourlesdbutants! Cependant Struts est principalement vou tre utilis pour les applications web mais est compltement conforme la spcification Servlet (actuellement 2.3) qui fait partie de la spcificationpluslargedeJ2EE. LundesautresavantagesetqueStrutsestunesolutionOpenSourcedontungrandnombrede dveloppeurscontribuentactivement.

3.2.Architecture3.2.1.CycledeviedunerequtehttpNavigateur del utilisateur 1 Composant Contr leur 4 5 Composant Vue 2 Composant Mod le

3

Stockage Persistant ousyst me distant

1. Leclientenvoieunerequtelapplication 2. LecomposantContrleurreoitlarequte.Ilcommencealorsprendredesdcisionssur lafaondecontinuer,enfonctiondesrglesdegestiondelapplication. 3. LescomposantsModleagissentaveclesstockagesdedonnespersistant.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

12/57

4. SuivantlesdonnesretournesparleModle,lecontrleurdterminelaVueutiliser pourlaffichagedesdonnesetluitransfertlesdonnes. 5. LecomposantVuechoisignrelarponselademandeduclient.

3.2.2.VuedensembleduneapplicationstrutsTroispartiesprincipalesconstituentuneapplicationutilisantStruts: LalibrairieStrutsetsesdpendances LesclassesJava:actions,formulaires,exceptions Lefichierdeconfigurationstrutsconfig.xml:assemblagedelapplication(liaisonsurl, classes,formulaires,sourcesdedonnes)

3.2.3.PackagesprincipauxVoiciunedescriptiongnraledesprincipauxpackagesdelapplication: org.apache.struts:packageroot org.apache.struts.action:packagenoyaudesclassesdebasniveaupourlesContrleur org.apache.struts.config: packagereprsentantleslmentsde configuration (quelon retrouvegalementdansstrutsconfig.xml) org.apache.struts.taglib:packagerootdelensembledestaglibStruts org.apache.struts.taglib.bean:packagequiregroupelesclassesdetagdelalibrairieBean org.apache.struts.taglib.html:packagequiregroupelesclassesdetagdelalibrairieHtml org.apache.struts.taglib.logic:packagequiregroupelesclassesdetagdelalibrairieLogic org.apache.struts.taglib.nested: package qui regroupe les classes de tag de la librairie Nested org.apache.struts.tiles:packageduplugintiles org.apache.struts.upload:packagedesclassessimplifiantluploadavecStruts org.apache.struts.util:packagedesclassesutilitairesdeStruts org.apache.struts.validator:packagedupluginvalidator

3.2.4.LibrairiesdpendantesVoicilensembledeslibrairiesquilfautintgrervotreapplicationwebafindepouvoirutiliser Struts:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

13/57

struts.jar:jarcontenantleframeworkStruts(Actions,forms) commonsbeanutils.jar;outilspourlutilisationdesBeans commonsdigester.jar:mappingxml>objetjava commonsvalidator.jar:utilispourlagestiondelavalidation(Validatorplugin) commonslogging.jar:permetdefairedeslogsdansvosapplications commonsfileupload.jar:utilispourfacilitluploaddefichier struts(bean/logic/nested/html).tld:fichierdedescriptiondeslibrairiesdetaglib Struts

3.3.Lesmodles:modlisationmtierUn composant modle reprsente gnralement un objet mtier ou un systme de backend physique.Parexemple,unsystmequipermetdesutilisateursdeseconnecteretdegrerdes informationspersonnellespeutcomprendreuncomposantModlequireprsenteunUtilisateur.

3.3.1.ClassemtierLaclassemtierfournitdesmthodesquipermettentdaccderauxinformationslilobjet(par exemplepourlutilisateur:nom,prnom,motdepasse).Cependantlesconceptsdebasesont lessuivants: Lesclassesmodlesserventaccderauxinformationsmmorisesdansdesbasesde donnesousurdessystmesdistantspourlesprsenterauxutilisateurs. Ellesdoiventtreconuesdemanirecacherlesdtailsdimplmentationdelaccs linformation(utilisationdinterface).

3.3.2.ExempledecomposantModleDans le cas dune application construite sur un conteneur de servlet (Tomcat), le composant ModlepeutselimiterunsimplebeanJavafournissantunevuemtierunelogiqueJDBCqui maintientlesinformationsdanslabasededonnes.Lerestedelapplicationinteragitavecle ModlepourlireetcrirelesinformationsetseulleModleinteragitaveclabasededonnes. DansuneapplicationconstruiteavecunsystmefrontalutilisantJSPetunsystmedorsalauquel onaccdeviadesWebServices,lescomposantsModlesserventfournirunereprsentation mtier du systme dorsal. Le reste de lapplication continue accder aux informations par lintermdiaireduModle,maisseulceluiciaccdeauxWebServices. CelaestdemmeavecunsystmeutilisantlesEJB(cf.EntrepriseJavaBean).LeModleassure laccsauxEJB.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

14/57

Celapermetdoncunegrandeflexibilitpourlvolutiondelapplicationmaisgalementune extrmepuissanceetsouplessepourlesdveloppeurs.

3.4.LesvuesDanslepatternMVC,lecomposantVueseconcernesuruneseulechose:lacrationdelacouche prsentationquevoitlutilisateur.Cecomposantnedoitcontenirquunstrictminimumdelogique mtieretdanalysecomplexe. LescomposantsVuessontleplussouventceuxassocislarponsedelarequteHTTP.Dansle casdeStrutscesontlesJSPquireprsenteleplussouventcettevue.Eneffet,cesfichiersgnrent leHTMLquiseraenvoyauclient. UndesavantagesdesJSPestquelonpeuttoutaussibienintgrerduHTML,desbalisesJSPou encoredes scriptlets Javadansunmmefichier.Cependantlinconvnientestquelatchedes concepteurs web en est alors complexifie pour le maintient du look and feel! De plus un dveloppeurJavaesttropfacilementattirparlatendanceabuserdes scriplets etinclurela logiquemtier(ouinstructionsconditionnelles)directementdanslaJSP! AveclepatternMVC,ceproblmeestrsolutcarilisolelemodle,lestraitementsetla/lesvues. De plus Struts fournit un ensemble de balises JSP personnalises servant construire les composantsdelaVue.Onretrouvedesbalisestelsque:,quidonnent auxdveloppeursJavaetauxconcepteursweblapossibilitdeconstruiredesfonctionnalitssans utiliserdescripletJava.

3.4.1.LesTaglibStrutsLesbalisespersonnalisesduframeworkStrutsconstituentunepartimportante.Eneffet,elle simplifiegrandementledveloppementdepageJSP(composantVue)etlesrelientauxautres composants. Ces balises vous permettront de dbugger plus rapidement vos applications car leur nom et descriptionsontunavantageconsidrablecontrairementauxscriplets. LesbalisesStrutssontregroupesenquatregroupes: Html:grelensembledesbaliseshtml(champstexte,file) Logic:grelalogiquedevosVue(itration,condition) Bean:grelaccsaux bean (etleurproprits)devotreapplication(page,request, session) Nested:regroupehtml,logic,beanenajoutantunearborescencepourlaccsaubean

Touslesdescripteursdecesbibliothquessontinclusdansleframeworksouslenomde:struts .tld.Parexemple:strutshtml.tldreprsenteledescripteurdelabibliothquehtml.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

15/57

3.4.1.1.StrutsHtml Cette bibliothque est principalement utilise pour la gestion des formulaires dans Struts. CependantellecouvrelamajoritdesbalisesdebaseduHTML. Voiciletableaurcapitulatifdestagsdisponibles: AffichelabaliseHTML Afficheunbouton Afficheunboutondecancel Afficheunecheckbox Affichelensembledeserrorsdetraitementdelarequte(champsnonvalides) Afficheunchampfichier Dfinitunebalise AfficheuneframeHTML Afficheunchampcach Afficheuntaghtml Afficheunchampimage(formulaire) Afficheunebaliseimg Affichelecontenujavascriptpermettantdeffectuerunevalidationctclientdun javascript formulaire(utilisationaveclepluginValidator) link AfficheuneancreHTML messages Affichelensembledesmessagesaccumulslorsdelexcutiondelarequte multibox Afficheunecheckbox option AfficheunchampOption options AfficheunecollectiondoptionsdansuntagSelect optionsCollection AfficheunecollectiondoptionsdansuntagSelect password Afficheunchampmotdepasse radio Afficheunboutonradio reset Afficheunboutondereset rewrite Afficheuneurlliaucontextencours select AfficheunchampSelect submit Afficheunboutonenvoyer text Afficheunchamptexte textarea Afficheunchamptextarea(zonedetexte) xhtml AfficheuntagXHTML TagName base button cancel checkbox errors file form frame hidden html image img Description

3.4.1.2.StrutsLogic Cettebibliothquecontientunensembledetagsutiliss dans la gestion de condition, itration suivantdesobjets,etgestiondefluxdelapplication.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

16/57

Description Evaluelecontenuducorpsdelabalisesilavariableestnullouvide. Evaluesilecontenuducorpsdelabalisesilavariableestgalelavaleur equal spcifie. forward TransfertlecontrlelapagespcifiedanslentreActionForward. Evaluelecontenuducorpsdelabalisesilavariableestplusgrandeougalela greaterEqual valeurspcifie. Evaluelecontenuducorpsdelabalisesilavariableeststrictementplusgrande greaterThan quelavaleurspcifie. iterate Rptelecontenuducorpsdelabalisesuivantlacollectionspcifie. Evaluelecontenuducorpsdelabalisesilavariableestinfrieureougalela lessEqual valeurspcifie. Evaluelecontenuducorpsdelabalisesilavariableeststrictementinfrieurela lessThan valeurspcifie. Evaluelecontenuducorpsdelabalisesilavaleurspcifieestunesouschaine match appropriedelavariable. Gnrelecontenuducorpsdelabaliselemessagespcifiquenestpasprsent messagesNotPresent danslarequte. Gnrelecontenuducorpsdelabaliselemessagespcifiqueestprsentdansla messagesPresent requte. Evaluelecontenuducorpsdelabalisesilavariableestninullounivideniune notEmpty collectionvide(testeparisEmpty()delinterfaceCollection). Evaluesilecontenuducorpsdelabalisesilavariablenestpasgalelavaleur notEqual spcifie. Evaluelecontenuducorpsdelabalisesilavaleurspcifienestpasunesous notMatch chaineappropriedelavariable. Gnrelecontenuducorpsdelabaliselavaleurspcifiquenestpasprsentedans notPresent larequte. Gnrelecontenuducorpsdelabaliselavaleurspcifiqueestprsentedansla present requte. redirect EcritunheaderHTTPRedirectdanslarponse.

TagName empty

3.4.1.3.StrutsBean Cettebibliothqueestutilisepourlireetcrirelesdonnescontenuesdansdesbeans,voirmme lesbeaneuxmmes,ouencoredfinirdenouveauxbeans. TagName Description cookie Dfinitunevariabledescriptbasesurlavaleurducookiespcifi. define Dfinitunevariabledescriptbasesurlavaleurdubeanspcifi. header Dfinitunevariabledescriptbasesurlavaleurduheaderspcifi. Chargelarponsedepuisuneapplicationdynamiqueetinclutcellecidansunbean(type include String).http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

17/57

TagName Description message Affichelecontenudunmessageinternationnalis)danslarponse. page Exposeunspcifiqueobjetducontextdelapageunbean. parameter Dfinitunevariabledescriptbasesurlavaleurduparamtre(requte)spcifi. resource Chargeuneressourcedemandeetinclutcellecidansunbean(typeStringouInputStream). size DfinitunevariabledescriptbasesurlatailleduneCollectionouMapspcifi. struts Exposelobjetdeconfigurationstrutsunbean. write Affichelecontenudunepropritdunbeandanslapage(out).

3.4.1.4.StrutsNested Cette bibliothque est unpeu spcialecar elleregroupe lestroisprcdentes. Cependant elle permetdestructurervostagssuivantlarborescencedevosbeans. Voicilestroistagssupplmentaires: TagName Description nest Dfinitunnouveauniveauquelestagfilspourrontutiliser. writeNesting Dfinitunevariabledescriptbasesurleniveaucourant. root Dmarreuneracinedunehirarchie.

3.5.LecontrleurCesontlescomposantsquimnentlaction!Chaquefoisquunutilisateursoumetunformulaire, cestlecontrleurquiletraite.Silutilisateurdemandeuneautrepage,cestluiquidcidedece quiseraaffich.CestgalementluiquicollectelesinformationsauprsdescomposantsModle pourquelescomposantsVuesaientlesinformationsafficher. VoiciunrcapitulatifdesactionseffectuesparleContrleur: Validerlesdonnessaisiesparlutilisateur. Prendre des dcisions concernant les composants Modle auxquels il faut accder ou mettrejour. RcuprerlesdonnespourlecomposantVue. Prendredesdcisionsconcernantlafaondetraitertelleoutelleerreursurvenuedurantle traitementdelarponse DciderdelaVueafficher

3.5.1.ServletGnrique:ClassesdactionStrutsLecontrleurestimplmentendeuxparties:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

18/57

Java:classedaction Struts:configurationxml

Lactionreoitlessaisiesutilisateur,coordonnelaccsaustockagepersistantousystmesdistants metenuvrelalogiquedelapplicationetdcideducomposantVuequiseraaffichensuite lutilisateur. Uneclassedactiondoit: Etendrelaclasse:org.apache.struts.action.Actionouuneclassedrive Surchargerlamthode:publicActionForwardexecute()afindeffectuerletraitement spcifiquelaction NecomporteraucunlienavecunepageJSPdirectement(celienesteffectudansle fichierdeconfiguration)

Cetteclassedactionpeuttretrssimplecommetrscomplexe.Parexemplevouspouvezcrer un lien qui dirige vers une classe daction affichant un formulaire de cration dun nouveau compteutilisateur.Laclassedactionsapparenteracela:packagecom.labosun.lessons.struts.action; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.apache.struts.action.Action; importorg.apache.struts.action.ActionForm; importorg.apache.struts.action.ActionForward; importorg.apache.struts.action.ActionMapping; publicclassNewAccountActionextendsAction{ publicActionForwardexecute(ActionMappingmappings,ActionFormform, HttpServletRequestrequest,HttpServletResponseresponse) throwsException{ returnmappings.findForward("newUserForm"); } }

Aucunerfrenceaufichierjspnestfaite.Laconfigurationdecetteactionressemblera(cf.3.8) :

Cependantlamajoritdesactionsestbienpluscomplexequecelleci.Ellesfontdestraitements daccsauxdonnes,misejour VoicilensembledesmthodeslesplusutilisesdelaclasseAction:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

19/57

addErrors(javax.servlet.http.HttpServletRequestrequest,ActionMessageserrors):ajoute une erreur la requte. Lensemble des erreurs ajoutes pourra tre affich par lintermdiairedelabalise: addMessages(javax.servlet.http.HttpServletRequest request,ActionMessages messages): ajouteunmessagelarequte.Lensembledesmessagesajoutspourratreaffichpar lintermdiairedelabalise: execute(ActionMapping mapping, ActionForm form, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response):mthodesurchargerafindeffectuerletraitementspcifiquepourlactionen cours. Retourne unobjet de typeActionForwardindiquantlavue (ouautreaction) laquelleonsouhaitepasserlarequte. setLocale(javax.servlet.http.HttpServletRequest request,java.util.Locale locale): permet dercuprerlalocaledelutilisateur(utilepoursavoirlepays/languedeceluici).

3.6.LinternationalisationStrutsmetdispositionunensembledoutilspermettantdegrerfacilementlinternationalisation dansvosapplicationsweb. Vouspouveztoutaussibienutiliserlinternationalisationpourgrerlesmessagesderreurdevos formulairesquepourvosmessagesdunepageJSP. DansStruts,onparledebundledemessagespourindiquerungroupedemessagedynamique.Un bundleestreprsentparunfichierProperties(bienconnudanslemondeJava).

3.6.1.LesfichiersPropertiesQuestcequunfichierProperties?Enjava,ilexisteuneclasse:java.util.Propertiesquipermet delireunfichierstandardistrssimplement(unfichierproperties). Cefichierprendgnralementlextension.propertiesetregroupedesgroupesbinaires(cl=> valeur).Pourchaquevaleurdynamiqueonassocieunecluniqueindpendantedulangagecequi permetderelierplusieursvaleursunemmeclselonlelangageencours. VoiciunexempledefichierProperties:cle1=valeur1 cle2=valeur2 cle3=valeur3

3.6.2.OutilsStrutsStruts utilise un bundle par dfaut qui est li au fichier: ApplicationRessources.properties. Cependantvouspouveztoutfaitpersonnaliserlaccscefichierdanslefichierdeconfiguration

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

20/57

deStruts.Vouspouvezgalementscindervospropritsenplusieursfichiersetdoncplusieurs bundle. LutilisationprincipaleseferadansvosJSPparlintermdiairedelabalise: Ou

Vouspouvezgalementrcuprerlavaleurdunmessagedirectementdansuneaction:getResources(request).getMessage("cle");

3.7.LetraitementdeserreursStrutsvous permetde centraliserla gestiondes exceptions liesau Contrleur.Vous pouvez dfinirdesliaisonsentreletypedexceptionetunepagejsp(pourafficherunmessage).Vous pouvez galement ajouter une classe handler qui est automatiquement appele lorsquune exceptionestjete. Voiciunschmareprsentantlefonctionnementenglobalit:ClassesAction (Contr leur) 1 2 Fichier Config. Exception

3 Classe Handler h ritantde ExceptionHandler

4

JSPpageerreur

1. Uneclassedactionjetteuneexceptiondetype:TypeException 2. Strutsdtecteuneconfigurationpourcetteexceptiondanslefichierdeconfiguration 3. Suivantcetteconfiguration,StrutsappellelaclasseHandlerpourcetteexception 4. Strutsredirigeverslapagejspderreurconfigure

3.8.FichierdeconfigurationLefichierdeconfigurationestlepointcentraldetouteapplicationStruts.Eneffet,ilregroupe lensembledesobjetsetdeleurconfiguration.Onpeutconnatrelensembledelalogiquede lapplication (navigation) avec ce fichier. Malgr la lourdeur dutilisation de xml dans une applicationwebcomplexe(suivantlenombredefonctionnalits),lesoutilsquionttmisen uvrepouraiderledveloppeurdansleparamtragedecefichiersontmaintenantstableset robustes.http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

21/57

3.8.1.Assemblagedel'applicationLefichierdeconfiguration:strutsconfig.xml(leplussouventnommainsi)estchargdindiquer Strutsquelssontlesformulaires,lesactionsdisponiblesetpermetgalementdajouteruncertain nombredemodlesenfichablesaupackageStrutsdebase. NoustudieronsicilensembledesbalisesdebasesutilisesdansuneapplicationStrutsgrcela DTD fournit par Struts ladresse suivante: http://jakarta.apache.org/struts/dtds/struts_config_1_2.dtd(DTDdelaversion1.2). Lapremirebalisequelonretrouvedanslefichierdeconfigurationest:strutsconfig.Ladtd correspondanteestcelleci:

Onlappellelabaliseroot,c'estdirelaracinedetouteslesautres.Onnepeuttrouverquune seuledecettebalisedansunmmefichier.Ilestaisdevoirquelleaccepte(danssoncorps)les balises: displayname:nomdelapplicationlieaufichierdeconfigurationencours description:descriptiondufichierdeconfiguration datasources:lensembledessourcesdedonnes(1instanceaccepte) formbeans:lensembledesformbean(1instanceaccepte) globalexceptions:lensembledeshandlerdexception(1instanceaccepte) globalforwards:lensembledespointsderetourdetypeglobal(1instanceaccepte) actionmappings:lensembledesmappingsdaction(1instanceaccepte) controller: paramtrage dun contrleur spcifique (dit RequestController) (1 instance accepte) messageresources:dfinitiondunbundledemessages(multiplesinstancesacceptes) plugin: dfinition dun package (extrieur) connect: plugin (multiples instances acceptes)

3.8.2.DatasourcesVosobjetsmodlesontpeuttrebesoindtabliruneconnexionavecunebasededonnes.Dans cecas,vouspouvezutilisezStrutspourinitialiserunpooldeconnexionpluttquedepasser directement par votre serveur dapplication. Lintrt premier est que vous naurez pas toucher la configuration de votre serveur dapplication lors du dploiement de votre application.Celasimplifiedoncgrandementledploiementdecelleci. VoicilapartiedeDTDcorrespondanteauxDataSource:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

22/57

Labalisedatasourcesregroupelensembledesdatasourceconfigurpourlapplication.Elle contientdoncde0nbalisesdatasource. Chaquebalisedatasourcedfinitprcismentlesparamtresdeconfigurationdesconnexions unesourcededonnes(etplusprcismentdesobjetsJDBC2.0DataSource).Voiciles diffrentesbalisesquellepeutcontenir: className:cettebaliseestoptionnelle.Elledfinitlaclasseservantconfigurerlasource dedonnesetdoitdonccontenirtouteslesdonnesncessairespourinstancierune DataSourcedutyperequis.Autrementdit,elledoitgrerlensembledesproprits spcifiesdanslesclausessetproperty(cf.plusbas)delabalise.Sicettebaliseestomise, Strutsutiliselaclassepardfaut:org.apache.struts.config.Configpourgrerles proprits. key:estuneclquipermetlapplicationdaccderlobjetdatasourcecrparStruts. Parexempledanslecasdunecl:stockdb,lapplicationpourrayaccdervia: org.apache.struts.action.DATA_SOURCE/stockdb(siaucunprfixedemodule nexiste:prfixe="") type:spcifielenomdelaclassedelaDataSourcequidoitimplmenter java.sql.DataSource.CetteclasseestutiliseparStrutspourcreruneinstancedela datasource,elleconfigurvialaclassedfinitdanslattributeclassName. setproperty:cettebalisepermetdattribuerunecletunevaleur.Ellesservent principalementconfigurerlesparamtresdeconnexionlasourcededonnes(login, password,paramtresdelabase) VoicilaDTDcorrespondante:

property:reprsentelacl(proprit) value:reprsentelavaleurlielacl

3.8.2.1.Exemple VoiciunexempleXMLdelaclausedatasources:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

23/57

3.8.2.2.Utilisationdanslapplication VouspouvezaccderlobjetDataSourcedepuisuneActionvialecodesuivant:DataSourceds= servlet.getServletContext().getAttribute(org.apache.struts.action.DATA_SOURCE/ stockdb);

Apartirdel,vouspourrezrcupreruneconnexionvotresourcededonneseteffectuertous lestraitementsquevousdsirer.

3.8.3.FormBeansLesbalisesformbeans et formbean indiquentStrutsquelidentifiantuniqueestassociune classeActionForm.EllesserventgalementinitialiserlesDynaForms(cf.5.3). VoicilapartiedeDTDcorrespondante:

Voiciunedescriptiondechacunedesbalises: formbeans:encapsulelalistedesbeansformulairesdfinis.Lattributtypeatdclass. formbean:dfinitunformulaireunique. o o o className:sertdfinirunbeandeconfigurationpourceformulaire(comme pourlesDataSource)cependantcelaestnestpascommun. dynamic:atdclass name: reprsente lidentifiant unique qui permet daccder au formulaire et dassociultrieurementleformulaireuneaction.Remarqueimportante:sila porte de votre formulaire est celle de la session, vous pouvez accder au formulairevialamthodegetAttribute()delobjetsession.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

24/57

o

type: doit indiquer une classe ActionForm valide. Cest cette classe qui sera instanciepourcrerleformulaire.

Siletypedrive(ouest):org.apache.struts.action.DynaActionForm,lesbalisesformproperty sontgalementinspectesparStruts.Chacunedellesdfinitunevaleurinitiale,unnometuntype (parexemplejava.lang.String)pourchaquepropritduformulaire(cf.5.3) 3.8.3.1.Exemple

3.8.4.ExceptionsLabaliseglobalexceptionsregroupelensembledesexceptionsquevotreapplicationgreauplus basniveaudurantletraitementdunerequte.Vouspouvezgrerautantdetypedexceptionque vouslesouhaitez.Nouspouvonsassimilercettepartiedeconfigurationau trycatch dansle langageJava.Eneffetvousdclarezunbloccatchviaunebaliseexception. Voiciunedescriptiondesattributsquadmetcettebalise: bundle:spcifielenomdubundlederessourcesquicontiendralesmessagespourcette exception. handler: spcifie la classe appele lorsque lexception se produit. Elle doit imprativementdrivedelaclasseorg.apache.struts.action.ExceptionHandleroudune classedrive. key:dsignelacldumessagederreurquiseragnretquiserarecherchdansle bundledemessages. path:dfinitlURLlaquellelecontrleesttransfrlorsquelexceptionsurvient. scope: indique Struts sil doit mmoriser les ActionError cres par la gestion de lexceptiondanslaportedelasessionoularequte. type:nommelexceptionquiseraintercepteparcegestionnaire. 3.8.4.1.Exemple

Siuneexceptionestlancedurantletraitement,lemodledatabase.errorestrecherchdansle bundlederessourcespardfaut(ApplicationResources.properties),unenouvelleActionErrorest crelaidedumodle,puiselleestplacedanslesattributsdelarequteetlecontrleest transmislapagederreurstandard.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

25/57

3.8.5.GlobalForwardsLes transfertsglobaux servent dfinirdes cheminsdaccs utilisablespar touteslesactions dfiniesdanslaconfiguration.Siparexempleuncertainsnombredactionsdoiventtransfrerle contrleuncrandeconnexion,vouspouvezdfinircetransferticiaulieudelefairedans chaqueaction. VoicilapartiedelaDTDcorrespondante:

Voiciladescriptiondelensembledesattributs: contextRelative:indiquesipathestrelatifaumoduleduneapplicationmodulaire(si faux)oudelapplicationweb(sivraie) name:reprsentelidentifiantuniqueduforward.Ilpermetderetrouverceforwarddans uneactionaveclamthodefindForward() redirect:sipositionntruelecontrleesttransmislapageavecuneredirectionplutt quuntransfert.Unenouvellerequteestdonccre

Nousnutilisonsgnralementpaslesbalisessetpropertypourlesforward.Cependantcellesci peuventvoustreutilessivoussouhaitezcrervospropresclassesdeforward(drivantdela classedebase).Danscecaslvousdevrezgalementindiquerlenomcompletdelaclassedans lattribut:className. 3.8.5.1.Exemple Voiciunexemplesimpledutilisationdeglobalforwards:

3.8.6.ActionmappingsCettepartieestsansdoutelapluscomplexe.Ellerelielesactions,lesformulairesetlestransferts. VoicilapartiedelaDTDcorrespondante:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

26/57

Voiciunedescriptiondechacunedesbalises: attribute:spcifieunIDuniquepermettantdemmoriserlActionFormdanslaportede larequteoulasessionsinonnameestutilis forward/include:permettentdetransfrerlecontrleunnouveaucheminaulieude traiterlaction input:indiquelapageouactionquiagnrleformulaireservantentrerlesdonnes parameter:permetdetransmettreunautreparamtrelaction,cependantilestalors prfrabledutiliserlabaliseplusgnrale:setproperty path:sertrelierlarequtelactioncedoittrelechemindelactionsansaucun suffixe.Siparexemplevousavezspcifi/admin/add.dodanslactiondevotre formulairealorsvousindiquerez/admin/adddanslepath prefix/suffixe:spcifientrespectivementunprfixeetunsuffixequiserontajoutsaux nomsdepropritsdubeanActionFormavantdelesassocierauxnomsdeparamtredela requte roles:permetderestreindrelaccslactionenindiquantunensemblederlespare parunevirgule. type:spcifielaclassedelAction. validate:sicetteattributestpositionnfalse,lecontrleurnexcutepaslamthode validate()delActionForm 3.8.6.1.Exemple

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

27/57

3.8.7.ControllerCettebalisenestpassouventutilise.SeuleslespersonnessouhaitantmodifierlenoyaudeStruts senserviront!

Voiciladescriptiondechacundesattributs: bufferSize: permet de modifier la taille du tampon dentre lors du traitement de chargementdefichiers maxFileSize:dfinitlataillemaximaledufichierpouvanttrechargetpeuttresuivi dunK(kilo),dunM(mga)oudunG(giga) contenType:permetdedfinirunautretypedecontenupardfautquetext/html debug:activeledbuggagesilavaleurestsuprieure0 forwardPattern:permetdemodifierlafaondontlecheminduneapplicationestliune URLrelativeaucontextelaidedeforwardPattern.Lavaleurde$Aestexpanseen prfixedelapplication(/applicationContextparexemple)etcellede$Pdanslechemin requis.Pardfautlavaleurest$A$P inputForward:positionntrue,lesparamtresdesattributsinputdesbalisesactionsont traitscommedestransfertsetnoncommedeschemins.C'estdirequilssontcompars auxbalisesforwarddfiniesglobalementetlocalementaulieurdtretraitscommedes URI locale:mmoriseunlocaledanslasessiondelutilisateursicenestpasdjfait.(lorsque cetattributestpositionntrue) nocache:unerequtededsactivationdelamiseencachedescontenusestenvoyeau navigateurclientavecchaquerponseHTTP pagePattern:indiqueStrutscommentrelierlespageslURLsousjacente,dunefaon assezsemblableforwardPattern processorClass:remplacelaclasseprocessorderequtepardfautdeStrutsparune personnalise.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

28/57

3.8.7.1.Exemple Voiciunexempledebalisepouvanttreutilise:

3.8.8.MessageresourcesCettebalisevouspermetdedfinirunbundlederessourcespourvotreapplication.Vouspouvez, bienentendu,endfinirplusieurssibesoinest.

Voiciunedescriptiondechacundesattributs: factory:permetdespcifierdoproviennentlesdonnesdelaressourcedemessages. Pardfaut,ilestconfigurpourliredesfichiersproperties key:dfinituneclpouraccderaubundle. null: permet de spcifier ce quil faut faire lorsquun message nest pas trouv. Si lattributestpositionntrue,ilretournenull.Positionnfalse,ilretourneunmessage derreuraveclaclrrone. parameter:permetdetransmettreunparamtrelafabriquelorsquelebundleestcr. Pourlesfabriquesbasedefichiersdeproprits,cestlechemindufichier. 3.8.8.1.Exemple Voiciunexempledeconfigurationdunbundle:

VousdevezavoirunfichierMainMessages.propertiesdansvotrepackage:com.labosun

3.8.9.PluginCedernierlmentvouspermetdechargerdynamiquementdesfonctionnalitssupplmentaires dansleframeworkStruts.

Voiciunedescriptiondechacundesattributs:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

29/57

className:spcifielaclassequichargeleplugin. setproperty: permet de transfrer au plugin les arguments ncessaires son fonctionnement

3.8.9.1.Exemple Voiciunexempledeconfigurationdupluginvalidator:

3.9.IntgrationaveclapplicationWebNousavonsvu,jusquprsent,lefonctionnementdeStrutsindpendammentduneapplication webbasesurunmoteurdeservlet. SilonnepeutpasintgrerStrutsavecnotreapplicationweb,alorsceframeworkestinutilisable! Bienentenduunesolutionexiste,nousallonsredirigerunensembledurl(grceaumappingparun pattern)uneservletduframeworkStruts. Nous utiliserons : org.apache.struts.action.ActionServlet. Cette servlet va nous permettre dindiquerlefichierdeconfigurationutiliser,letypededebuggageprendreencompte Nousnavonsplus,ensuite,qumappinguntypedurlcetteservlet. Voiciunexempledecodeincluredanslefichierdedescriptiondevotreapplicationweb: web.xml:

actionstruts org.apache.struts.action.ActionServlet config /WEBINF/strutsconfig.xml debug 2 detail 2 2

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

30/57

actionstruts *.do

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

31/57

4.Lestiles4.1.PrsentationLorsquondveloppeuneapplicationWeb,onremarquegnralementquelensembledespages possde un lment central variable entour dlments plus ou moins statiques (barre de navigation,entte,pieddepage) LabibliothqueTiles,quiestunpluginintgrableStruts,permetdecrerdesmodlesdepage rutilisablespourlensembledevotreapplicationlaidedundocumentXMLcentral. CettelibrairiepeutsutiliseraussibienindpendammentdeStrutsoueninterne.Nousverronsici lutilisationintgreStruts(cequinouspermetdavoirtoutelapuissancedeStrutscombine aveccelledestiles).

4.2.ArchitectureVoiciunschmarcapitulatifdelarchitectureetutilisationdeTiles:Dfinitions (tilesdef.xml) mainLayout (1dfinition) Actionmapping index (extendsmainLayout) Actionmapping document (extendsmainLayout) Strutsconfiguration strutsconfig.xml

body.jsp (contenu)

header.jsp (contenu) footer.jsp (contenu)

layout1.jsp (structure)

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

32/57

Cettearchitectureprservelasparation:structuredespagescontenusdespages.Eneffet,vous pouvezcrerautantdelayoutsquevouslesouhaitiez;pouraffecterunlayoutunepageilsuffit queladfinitiondecettepage(danslefichierdeconfiguration)hritedulayoutconcern.Nous pouvonsdoncremarquerquelacoucheapplicationnintervientpasdirectementsurlespagesjsps maispasseparlacouchedestructuration(lestiles).

4.3.InstallationAfindepouvoirutiliserlabibliothqueTiles,vousdevezladclarerauprsdelaconfiguration Struts. Tilestantunpluginstrutsvousavezjusteinsrercesquelqueslignesdansvotrefichierde configurationStruts:

Tilestantunpluginvousdevezavoirleslibrairiesdansvotreclasspath(toutcommevousavezles librariesdeStrutsdedans).Depuislaversion1.2deStruts,TilesestintgrdansStruts(struts.jar). Sivousutilisezuneversionantrieure(cequinestpasrecommand)vousdevrezajouterla librairieTilesmanuellement(voustrouverezcettelibrairieici:http://).Pardfaut,leplugin initialiselapplicationaveclefichier:tilesdef.xmldudossierWEBINF.

4.4.FichierdeconfigurationLefichierdeconfiguration,commepourStruts,estlepointcentraldegestiondeTilesdansvotre application.Cestdanscefichierquevousdevrezdfinirlensembledesdfinitionsdevotre application.Voiciunedescriptiondelensembledesbalisespouvanttrescontenusdanscefichier. Comme pour tout fichier xml bien form, il suffit de se baser sur la DTD pour connatre lensembledelastructureappliquernotrefichierxml.VoicilelienverslaDTDdufichierde configurationdesTiles:http://jakarta.apache.org/struts/dtds/tilesconfig_1_1.dtd.

4.4.1.BaliseracineLa premire balise rencontre est la balise parente. En effet, cest elle qui va contenir lensembledesbalisesenfantesdeconfigurationdesTiles.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

33/57

Cettebalisenepeutcontenirquedesbalisesdetype:definition.Ellenesertqu regrouperlensembledesdfinitions. 4.4.2.Balisedefinition Cestlabaliselaplusimportant.Eneffet,ellepermetdedfinirunedfinitiondetile, cestdireunestructuredepagepouvanttreinsrdansunepageoudirectement utiliseentantqueforwarddanslaconfigurationStruts.Cettebalisecontientbienplus dattributquelaprcdentecarellepermetdegrerlensembledescasdestructuredune page(layoutoucontenudepage).VoicilapartiedeDTDcorrespondante:

controllerClass:lenomcompletdelaclassespcifiqueutiliserentantque contrleur(sionnesouhaitepasutilisercellepardfaut) extends:utiliserpourfairedriverladfinitionencoursdunedfinitionmre (celapermetdesurdfinirlesvaleursdesattributsdeladfinitionmre) name:nomuniquedeladfinition path(oupage):dfinitlapageutiliserpourlastructuredecettetile(layout).La ressourceestalorscharge(ouincluseencasdepagejsp) role:dfinitunrolepourlagestiondelascurit(dfinitiondutypedaccsla dfinition) template:mmechosequepath.Utilispourlacompatibilitaveclalibrairie: Template

UnedfinitionpeutgalementcontenirdesbalisesputetputListquipermettededfinir desattributs(put)etdeslistes(putList). 4.4.3.BaliseputLabaliseputpermetdedfinirunattribut(cl=>valeur)dansunedfinition. VoicilaDTDcorrespondate:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

34/57

name:lidentifiantuniquepourlattribut(lacl) type:dfinitletypedelavaleur(string,page,template,definition) direct:mmechoseque:type="string"(compatibilitavecTemplate) value(oucontent):lavaleurassocilacl(dfinitaveclattributname) content:mmechosequevalue(compatiblitavecTemplate)

4.4.4.BaliseputList LabaliseputListpermetdedfinirunelistedansunedfinition. VoicilaDTDcorrespondante:

Leseulattributestlenomdelaliste(name).Cependantlalistepeutcontenirdiffrents lments: add:mmechosequunlmentput item:lmentspcifiquedelaliste(cf.cidessous) bean:lmentdetypeJavaBean(cf.cidessous) putList:autreliste 4.4.5.Baliseitem Labaliseitemestutilisepourdfinirunlmentdansuneliste.Cetlmentpeutcontenir diffrentesproprits(valeur,icne,lien,messagedinformat on). i VoicilapartieDTDcorrespondante:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

35/57

classtype:nomcompletdelaclasseutiliser(pardfaut: org.apache.struts.tiles.beans.MenuItem) icon:valeurdelapropriticon link:valeurdelapropritlink tooltip:valeurdelaproprittooltip value:valeurdelapropritvalue 4.4.6.Balisebean

Labalisebeanpermetdedfinirunlmentdetype:JavaBeandansuneliste.Celapermetde personnalitlensembledespropritsdisponibles.Chacunedesespropritstantinitialisevia unebalise:setproperty(descriptioncidessous). VoicilapartiedeDTDcorrespondante:

Vouspouvezremarquerquelattributprincipalest:classtypequipermetdedfinirlenom completdelaclasseutiliserpourleJavaBean.

4.4.7.BalisesetpropertyLa balise setproperty se retrouve trs souvent dans les fichiers de configuration (cf. balise DatasourcefichierdeconfigurationStruts).EllepermetdinitialiserunepropritdunBeanen indiquantlenomdecellecietlavaleurassocie. VoicilaDTDcorrespondante:

property:dsignelenomdepropritinitialiser value:dsignelavaleurassocierlaproprit

Voicilamajoritdesbalises/attributsutilissdansledveloppementaveclepluginTiles. Vouspouvezremarquerquilnyaaucunmoyendediffrenciervostemplates(oulayout)devos pagesrellementutilisables.EneffetTilesvousfournitlesimplefaitdecrerdesdfinitionsetde fairedelhritageentreelles.Cestdoncaudveloppeurdegrer(viaunenorme,convention) ladiffrenciationentrelayoutetpages.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

36/57

4.5.LayoutsLeslayoutdfinissent(unpeucommedanslalibrairieSWING)lastructuredunepage,cest direlesdiffrentslmentsdunmodleetlepositionnementdeceuxl. Vouspouvezcrerdesmodlespour: lespages descomposants(liste,formulaire) desvuesspciales

Enthorie,vousnutiliserezjamaisdirectementunedfinitiontypelayoutdansunepagejsp (saufcasspcifiques)maisvouslesutiliserezcommedfinitionsparentes. Voiciunexemplededfinitionquireprsenteunmodledepage:

Cettedfinitiondclareunmodledepagequicontient: untitre:title unbandeauentte:header unmenuhorizontal:hmenu unmenuvertical:vmenu uncontenuprincipale:cbody uncontenusecondaire:rbody unpieddepage:footer Unepagejspdestructureestassociecettedfinition(viapath="")afinquonpuissedfinirle positionnementdechacundeslments. Danscettedfinitionleslmentssontdclarsetinitialisspardesvaleurspardfaut. Cettedfinitionatcriteafindtreutilispardesdfinitionsdepagerelle.

4.5.1.LefichierdestructureNousvenonsdevoircommentdclarerunedfinition,cependantdanslecasdunmodle(layout) nousdevonsutiliserunepageJSPafindindiquercommentplacerleslments.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

37/57

DansvotrepageJSP,vouspouvezalorsutiliserlesvaleursdechacundesattributspourlesinsrer dansvotrepagemodle. Votreattributpeutpointerversdiffrentechose: Unechanedecaractre Unedfinition UnepageJSPouautre

Ilvousfaudrautiliserlalibrairietiles(taglib)dansvotrepagemodleafindinsrerlesdiffrents lments. Voiciunedescriptiondelensembledecettelibrairie: //TODO //TABLEAU Voiciunexempledepagemodeledebase:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

38/57

Cefichierpermetdedfinirlemplacementdescomposants.Chaquedfinitiondepagequihritera dulayoututilisantcettepageverrasescomposantsplacsdecettemanire:

Header M E N U Body Footer4.6.TilesLes Tiles sont galement des dfinitions. Cependant elles sont utilisables rellement car elle dfinissentdespagesfinales.Unetileestleplussouventunedfinitionhritantduneautre(de typelayout)etquisurdfinitlensembledesattributsspcifiquelatile. Parexemple,sivousutilisezlemodledcritprcdemmentvouspouvezjusteavoirbesoinde redfinirletitredelapageetlecontenuprincipale(voirgalementsecondaire).Danscecasl, vousgardezlebandeau,lesmenus,lefooterpardfauts. Celavitelaredondancedinformationetsivoussouhaitezchangerdebandeau,ilvoussuffirade modifierladfinitiondumodleprincipal.

4.7.ExempledarchitecturededfinitionsVoiciunschmarcapitulatifduneutilisationdelalibrairieTiles:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

39/57

Layouts

Page

Form

List

pub.login Dfinitionrelles pub.index pub.ress

form.user form.login

list.ress list.users

Nousavonsdonc3layouts: Page:structureglobaledunepage Form:modlepourlesformulaires List:modlepourleslistes

Ensuite les dfinitions (tiles) hritent du layout utiliser et redfinissent les lments personnaliser.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

40/57

5.Validator&Formulaires5.1.PrsentationetarchitectureStrutspermetdecrerfacilementdesformulaireslaidedediffrentesbalisespersonnalises.La questionmaintenantest:commentgrerlavalidationdecesformulaires? Pourcela,ilexisteleframeworkValidator(inclusdansleProjetCommonsdApache),dvelopp par David Winterfeldt. Il tait au dpart une tierce partie ajoute au framework Struts. Aujourdhui,cestunframeworkindpendantpouvanttreutilisavecousansStruts. Ceframeworkcontientdiffrentsoutilsquivontnousviterdedevoirrcrirenospropresclasses devalidation.Ainsi,pourvrifierquedeschampssontbienremplisoubiendansuncertain format,onaungaindetempsnonngligeable. Leprincipeestlesuivant: DanslalistedesfichiersdeconfigurationdeStruts,quevoustrouverezdanslerpertoire ~/WEBINF/, setrouvent lesfichiers validation.xml etvalidatorrules.xmlquivont permettre entreautreslemappingentrelesbalisesdesformulairesetlesclassesdevalidations. Danslerpertoire~/WEBINF/lib,setrouvent2fichiersjar,commonsvalidator.jaret jakartaoro.jarquicontiennentcesclassesdevalidations. Chaquefoisquelonsouhaitefaireunevrificationsurunchampdunformulaire,onvamapper cechamplamthodedelaclassecorrespondante.Celapeutparatreflouaudpart,maisnous verronsdansleschapitressuivants,lamarchesuivrequiestenfaittrssimple.

5.2.Fichiersdeconfiguration5.2.1.Danslefichierstrutsconfig.xmlCeframeworkdevalidationncessitedonclutilisationdedeuxfichiersdeconfigurationquelon vadclarer,telsdesplugins,danslefichierstrutsconfig.xml.Pourcelaonvautiliserlabalise etluiindiquerlescheminsversnosdeuxfichiersXML:

Dfinitiondelabalise: plugin lmentracinedeladfinition.Onaunebalisepluginpourchaque

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

41/57

"plugin"ajout. className:attributdelabaliseplugin,ilpermetdedfinirlechemindela classeinstancier,interneouexterneStruts.Celasignifiequelonpeut parfaitementcrersonpropreframeworkdevalidationvoireunframework dunetouteautreutilit. o setproperty Silaclasseinstancie(className)prenddesargumentsenparamtre,ils serontdfinisdanscettebalise.Onadoncunebalisesetpropertypour chacundesarguments. property:attributdelabalisesetproperty,ilpermetdespcifierlenomde largument. values:attributdelabalisesetproperty,ilpermetdespcifierlavaleurde largumentdfinidansproperty. Nousvenonsdoncdespcifierunenouvellebaliseplugin,toutcommeonlafaitpourlesTiles prcdemment,etdeuxnouveauxfichiers. Voyonsdoncplusendtailcequesontcesfichiersetquoiilsvontnousservir.

5.2.2.Lefichiervalidatorrules.xml:Fourniavecleplugin,cefichierXMLdfinilesrglesquelonpourrautiliserpourtesterles valeursdeschamps.Ilpermetdeffectuerlelienentreletypedevalidation(champrequis,champ email)etlecheminverslamthodeetlaclassecorrespondantequipermettrontdeffectuer loprationdevrificationdesdonnes(valeurduchamps). Debase,StrutsValidatorgreleschampsvides,lesformatsdemailoudedateinvalides,les longueursdechampsminimumoumaximum,etbiendautresencore. Vous trouverez la description de toutes ces validations sur le site de la fondation Apache: http://struts.apache.org/userGuide/dev_validator.html dans la section "Standard Built In Validations". Dfinitiondesbalisesdufichiervalidatorrules.xml: formvalidation o global validator lmentracinedufichier. Tous les lments inclus dans la balise global seront accessibles par lensembledesformulaires(sortedeconstantes) Dfinitchaquetypedevalidationetlelielamthodecorrespondante. Attributsdelabalisevalidator: name:dfinitlenomlogiquedelavalidation. classname: dfinit le chemin vers la classe contenant la mthode de validationcorrespondante.http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

42/57

method:dfinitlenomdelamthodedevalidationcorrespondante. methodParams:typedesargumentspasssenparamtre. msg:dfinitlemessagederreurafficherencasdenonvalidationdu champ. depends:dfinitsilavalidationestobligatoireounon. jsFunctionName:dfinitlenomdelafonctionjavascriptcorrespondante quisexecuteractclient javascript Dfinitlecodedelafonctionjavascriptquisexcuteractclient.

Nousallonsvoiruneexplicationdelundes"validator"fournipardfautdanslefichiervalidator rulesdebase.

Ilsagiticiduvalidatorvrifiantquunchampestrequis,cestdirequilvrifiequelechamp nestpasvide.Onpeutdoncvoirquilatnomm"required",quilestrattachlamthode validateRequireddelaclasseFieldChecks. Encasdenonvalidationduchampmappce validator,lemessagederreursetrouvantunpeuplushautdanslefichiervalidatorrules.xmlsera affich:

Danslecasprsent,onauraitlemessagearg0isrequired.

5.2.3.Lefichiervalidation.xml:Unefoislesdiffrentstypesdevalidationdfinis,cestdanslefichiervalidation.xmlquivanous serviramapperleschampsdenosformulairesauxvalidationsdfiniesdansvalidatorrules.xml. Dfinitiondesbalisesdufichiervalidation.xml: formvalidation o global lmentracinedufichier. Entrecesbalisesvonttredfiniesdesinformationsqui serontaccessibles,visiblesparlensembledesformulaires denotrefichier(constantes).

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

43/57

constant constantname constantvalue

Achaqueconstantecorrespondunebaliseconstant. Cettebalisepermetdedfinirlenomdelaconstante Cettebalisepermetdedfinirlavaleurdelaconstante.On va pouvoir par exemple dfinir lexpression rgulire dfinissantlavaleurdecetteconstante Cette balise va englober tous les mappings de nos diffrentsformulaires.

o

formset form

chaqueformulairecorrespondunebaliseform. name: attributdelabalise form, ilpermetdedfinirle nomduformulaireconcern.Cenomcorrespondcelui dfinidanslefichierstrutsconfig.xml(attributnamedela baliseformbean).

field

chaquechampduformulairencessitantunevalidation correspondunebalisefield. property:attributdelabalisefield,cesticiquelonva spcifierlenomdelaproprit(champ)quelonvalier laoulesvalidationsdfinie(s)dansvalidatorrules.xml.Ce nomdepropritestceluidfinidansleFormBean. depends:attributdelabalisefield,ilpermetdespcifier lesnomsdesvalidationsassociesauchampproperty. argn: baliseinternelabalise field, ellepermetde spcifier largument donner au message derreur correspondant. var:baliseinternedelabalisefield,ellevapermettre de prciser(si besoin est) une contrainte dintgrit pourlesvalidationsspcifiesdanslattributdepends. o varname: baliseinternedelabalise var, onva spcifier le nom de la validation dont on veut donnerlacontraintedintgrit. varvalue: baliseinternedelabalise var, onva spcifier la contrainte dintgrit (exemple: expressionrgulire,...).

o

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

44/57

Jusqumaintenantnousavonsunfichiervalidatorrules.xmlquidfinitunelistedevalidations dontlesclasses(etdoncmthodes)setrouventdanslesfichierscommonsvalidator.jaretjakarta oro.jar. On a par ailleurs un formulaire dinscription(InscripForm) avec les champs nom(obligatoire), password(obligatoire,tailleminimumde4caractres)etemail(obligatoire,formatdemail). Nous souhaitons donc vrifier la validit de ces champs. Ceci va tre fait dans le fichier validation.xml.Cesteneffeticiquelonvalierchacundenoschampsauxtypesdevalidations dclaresdansvalidatorrules.xml. DaprslesrglesdelavalidationdfiniescidessuspourleformulaireInscripForm,onpeutvoir quelonvautiliserlesvalidatorssuivants(prsentsdanslefichiervalidatorrules.xmldebase): required,emailetminlength. Voici donc comment se prsentera notre fichier validation.xml pour la partie concernant InscripForm:

Voyonslexplicationdufichierligneparligne: o Toutesnosdfinitionssontenglobesdanslabaliseracineformvalidation. Dansunpremiertemps,nousdfinissonsuneconstante minPass.Elledfinitlalongueur minimumdumotdepasse.Onlenglobedansunebalise,cequisignifiequellesera visiblepartouteslesdfinitionsdeformulairequivontsuivre. NousavonsbesoinduchamppassworddansleformulaireInscripForm,ettantsusceptible dtrerutilisdansunautreformulaire,onachoisidedclarercetteconstanteminPassavechttp://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

45/57

uneporteglobale.Sachantquelechamppassworddevraavoirunelongueursuprieure4, lavaleurdeminPassestinitialise4.

o

Labalisecontientlensembledesvalidationsdesdiffrentsformulaires.Cela signifiequelonauraunebalisepourchaquedfinitiondeformulaire.Dansnotre cas,nousnavonsqueInscripForm,nousavonsdoncuneseulebalise.

Nousouvronsdonclabaliseetindiquonsdanslattributname,lidentifiantdenotre formulaireindiqudanslefichierstrutsconfig.xml,"inscripForm". Lepremierchampdontnousdevonsvrifierlavaliditestlechamp nom,ilesteneffet obligatoire.Lobjetquenousallonscrericiestunobjetclient.Danslabaliseestdonc indiqulenomdelapropritconcerne,cestdire nom.tantunchampobligatoire,on ajoutelevalidatorrequired(cf:valitorrules.xml)pourlattributdepends. Onvientdoncdelierlechampnomduformulaireauvalidatorrequired. Encasderreurdevalidation,lemessagearg0isrequiredseraaffich(chapitresurvalidator rules.xml).Afindespcifierjustementlenomquiseraaffichpourarg0,onutiliselabalise avec0pourlavaleurden.Lavaleurdearg0estdfinidanslattributkey,ilsagitde lavaleurdeclient.form.require.nomdufichierdeproperties. Onvientmaintenantdedfinirplusprcismentlemessagederreur.

o

Nousallonsagirdelammemanirequepourlechampnomaveclechamppassword. Cechampestobligatoireetdoittredunelongueurminimumde4caractres.Lattribut dependsadoncpourvaleursrequiredetminlength.

Afindespcifierlavaleurdeminlength,onutiliselabalise.nouspermet despcifierlenomduvalidatorconcernet,lavaleur,justementquelonva affectercevalidator. Prcdemment,nousavonsspcifierquelaconstante minPass atinitialiseendbutde fichier,avecuneporteglobale.Nousrutilisonsdonccetteconstanteafindelaffecter minlength.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

46/57

o

Lesvalidatorspourleschampsnometpasswordviennentdoncdtredfinis.Ilnereste quelechampemaildontladmarcheestlamme.Simplementlesvalidatorsconcerns sontrequiredetemail(toujoursdufichiervalidatorrules.xml).

Nousvenonsdoncde: initialiserlepluginValidatordanslefichierstrutsconfig.xmletfaitlesliensaveclesfichiers validation.xmletvalidatorrules.xml. dfinirlesdiffrentesvalidationsdanslefichiervalidatorrules.xmlenfaisantlesliensavecles classesconcernes. dfinirlesvalidationsfairesurleschampsdenotreformulaireenfaisantlesliensentreces champsetlesvalidators(dfinisdansvalidatorrules.xml),danslefichiervalidation.xml.

Cependant,nousnavonspasparldesFormbeans;eneffet,laclasseassocienotreformulaire InscripFormdoittendrelaclasseDynaActionForm,classefilledelaclasseActionForm.

5.3.DynaFormsOnavujusquemaintenantcommentlierleschampsdenosformulaires,maisaucunmomentla dfinitiondelaclasseFormBeancorrespondante. Eneffet,silonutiliseStruts,ilfautncessairementlierchaqueformulaireunbean;cestdire uneclasseJavarespectantcertainesrgles: unattributpourchaquepropritduformulaireaveclemmenom ungetteretunsetterpourchaqueattributdubean

Parailleurscetteclassedoittendre ActionForm.Laclasse ActionForm possdeeneffetune mthodevalidate()quivajustementpermettrededfinirlecodevalidantounonleschampsdu formulaire. Silonsuitcetteindication,notreclasseInscripFormestdfiniecommesuit:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

47/57

CetteclassecontientdesattributscorrespondantsauxpropritsdenotreformulaireInscripForm ainsiquedesgettersetdessetterspourchacundeux. Ellesurdfinitparailleurslamthode validate() de la classe ActionForm afin de faire les validations des diffrents champs du formulaire. Rappelons que client.form.require.nom fait rfrence la cl se trouvant dans le fichier de properties(cf.3.6.1)quonauradfinienamont.Lelienaveccefichiersefaitdanslefichierde configurationstrutsconfig.xmllaidedelabalise(cf.3.8.1). AprsavoircrnotreFormBean,revoyonslefichierstrutsconfig.xml:

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

48/57

Lefaitestque,sinousavonschoisidutiliserleframeworkValidator,cestjustementdanslebut dviter dcrire les codes de validations pour chaque formulaire puisquils risquent dtre redondants.Cestpourquoiunensembledevalidationsstandardssontregroupsdanslefichier struts.jar.Deplus,cestpourcelaquenousavonsregrouptouteslesdfinitionsdesvalidationsde champsdanslefichiervalidation.xml. Cequelonveut,cestseservirdecesdfinitionsetlesmappernotreFormBean. NousallonsdonctendrelaclasseValidatorForm,sousclassedelaclasseActionForm.Cette classeestinclusedansleframeworkValidator(onpourraletrouverdanslefichierstruts.jar,dans lepackageorg.apache.struts.validator).VoyonslanouvelleclasseInscripForm:

Sadfinitiondanslefichierstrutsconfig.xmlnechangepas:

Simplement,lesvalidationsdeschampsvontsefaireparrapportaufichiervalidation.xml.Lenom dfini dans lattribut name est lidentifiant qui permettra, de lier les champs du formulaire InscripFormauxvalidatorsrequis. Nousavonsdjgagnuntempsnonngligeable,puisquepourchaqueformulaire,ilnoussuffitde crerunFormBeancontenantdesattributsainsiqueleursaccesseurs.Maisnousallonsencore simplifierlachose.Eneffet,chaquefoisredfinirtoutescesmthodespourchaquechampest assezfastidieux.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

49/57

Pour cela, nous nallons plus crer de Form Bean pour chaque formulaire mais utiliser les DynaForms,cestdiredfinirnosbalisesdelamaniresuivante:

Aveccettenouvelledfinition,StrutsvasoccuperluimmedecrerleFormBean.Nousne devonsquespcifierlespropritsduformulaireainsiqueleurstypes. OnadoncdeuxpropritsvaliderpourceformulaireinscripForm,detypesStringetinitialises vide.

5.4.RsumdelaconfigurationdesValidatorsRsumonslesdiffrentestapesraliserpourgrerlavalidationdunformulaire: 1. InstancierlaclasseValidatorPluginlaidedelabaliseafindedonnerlaccs auxfonctionnalitsduframeworkValidatorStruts. 2. Configurerlesdeuxfichiersdeconfigurationvalidatorrules.xml(dontlaconfigurationpar dfautetamplementsuffisante)etvalidation.xml. 3. CrerunFormBeanquitendlaclasseActionForm. IlestdoncassezrapidedegrerlavalidationdesformulaireslaideduframeworkValidator.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

50/57

6.IntgrationavecXDocletxDocletestunoutiltrsintressantpourlagnrationautomatiquedecodeoudescripteursde dploiementouautresfichiersutiles. Nousallonstudier,danscettepartie,lintgrationdeXDocletpourlagnrationdesfichiersde configurationstruts(strutsconfig.xml,validation.xml). AfindebiencomprendreleprincipeXDoclet,ilfautsavoirlutiliseretconnatreAnt(cf.Essentiel Ant).

6.1.Strutsconfig.xmlLagnrationdufichierstrutsconfig.xmlestautomatisableavecXDoclet. GrceXDocletvousallezpouvoirdfinirdirectementdansvotrecodejava: Lesactionmapping Lesactionexception Lesactionforward Lesactionform Lesactiondynaform

CesdfinitionsvontsefairepartirdestagsXDoclet@Strutsquevouspouvezretrouver ladresse:http://xdoclet.sourceforge.net/xdoclet/tags/apachetags.html Nousallonsdtaillerlesplusimportantsdanscettesection.

6.1.1.Tags@StrutsVoiciunedescriptionnonexhaustivedestagslesplusutilissavecStruts: @struts.action:dfinitunmappingpouruneclassedactionetlesdiffrentsattributslis o o name:nomdelaction(doittreuniquedanslensembledelapplicationstruts) type:typedelaclasseutiliser(pardfaut,laclasseencours).Ilestpossiblede surcharger cette valeur dans certains cas (par exemple avec lutilisation de frameworkexternetelqueSpring) path:chemindelaction(url) scope: domaine dans lequel laction va exister (request, session, application; requestpardfaut) input:chemindinputpourlaction

o o o

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

51/57

o o o

roles:rle(s)autoris(s)accdercetteaction validate:indiquesistrutsdoitvaliderlesentrsduformulaire(true|false,true pardfaut) parameter:paramtredoptiondelaction(ilfautmettreaction). key:cldelapropritutiliserpourretrouverletextedelerreur type:nomabsoludelaclassedexceptionquiseraintercept handler:nomabsoludelaclasseutilisercommeHandlerdelexception path:cheminverslaressourcequipermettradeterminerlarequte scope:domainedanslequellobjetActionErrorserautilis. name:nomduforwardquiserautilisdanslaction path:cheminverslaressourceutiliser redirect:indiquesilfauteffectueruneredirectionounon(true|false,falsepar dfaut) name:nomduformbeanquipermettradelerfrencer

struts.actionexception:dfinitunhandlersuruntypedexception(lielaction) o o o o o

struts.actionforward:dfinitunforwardlocalpourlaction o o o

strutsform:dfinitunformbeanetsesattributs o

OnretrouvegalementlestagslisaupluginValidator: struts.validator:dfinitlavalidationeffectuersurunchampduformulaire o type: dfinit le type de validation effectuer sur le champ (required par exemple) arg0value arg1value arg2value arg3value name:nomdelavariable value:valeurdelavariable

struts.validatorargs:dfinitunargumentappliquerlavalidation o o o o

struts.validatorvar:dclareunevariablepourlevalidator o o

Dautresattributspeuventtreutilissdanscertainscas.Nousnelesavonspasdtaillafinde simplifiercetteprsentation.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

52/57

6.1.2.ExemplesVoiciquelquesexemplesdutilisationdecestagsdanslecodejava.

ExempledeclassAction:/** * *@struts.actionpath="/admin/comment/add/display"name="commentForm" *scope="request"validate="false"parameter="action" * *@struts.actionforwardname="success"path="admin.comment.add.display" */ publicclassDisplayCommentFormActionextendsAction{ protectedActionForwarddelegateExecute(ActionMappingmappings, ActionFormform,HttpServletRequestrequest, HttpServletResponseresponse)throwsApplicationException{ .... returnmappings.findForward("success"); } }

UtilisationaveclesActionForm:/** *LoginFormclass. * *@struts.formname="loginForm" */ publicclassLoginFormextendsBaseForm{ //Membres privateStringloginTxt; privateStringpassword; /** *Defaultconstructor. * */ publicLoginForm(){ } /** *@returnReturnsthelogin.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

53/57

*@struts.validatortype="required" *@struts.validatorargsarg0value="key.form.login.required.login" */ publicStringgetLoginTxt(){ returnloginTxt; } /** *@paramlogin *Thelogintoset. */ publicvoidsetLoginTxt(Stringlogin){ this.loginTxt=login; } /** *@returnReturnsthepassword. *@struts.validatortype="required" *@struts.validatorargsarg0value="key.form.login.required.password" */ publicStringgetPassword(){ returnpassword; } /** *@parampassword *Thepasswordtoset. */ publicvoidsetPassword(Stringpassword){ this.password=password; } }

6.1.3.IntgrationavecAntXDocletsintgreavecAntafindepouvoirautomatisersonexcutionauseindunscript.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

54/57

Ilfaut: Dclarer la tche webdoclet via taskdef, en lui spcifiant la classe: xdoclet.modules.web.WebDocletTaskutiliser.Vousdevezdoncspcifierunclasspath validecontenantlaclasseprcdente(inclusedanslesjarsXDoclet). Appeler la tche webdoclet en lui spcifiant le rpertoire de destination (destdir), les fichiers parser (via un fileset), et la soustche strutsconfigxml qui permet de gnrerlefichierstrutsconfig.xml.

Vouspouvezgalementutiliserlessoustchessuivantes: strutsdynaformvalidationxml:pourlagnrationdesparamtragesdevosdynaform. strutsvalidationxml:pourlagnrationdufichiervalidation.xml

Vouspouvezavoirplusdedtailssurlutilisationdechacunedecestchesladressesuivante: http://xdoclet.sourceforge.net/xdoclet/ant/xdoclet/modules/web/WebDocletTask.html.

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

55/57

7.Casconcret(architecture)7.1.PrsentationNousallonsprsentprendreuncasconcretdapplicationetvoirlesdiffrentestapesauniveau delamodlisationdelapplication.Nousallonsprendrelexempledunegestiondunportefeuille dactions Casdutilisation????

7.2.Architecture

7.3.Couchemtier

7.3.1.Couchedaccsauxdonnes(DAO)

7.3.2.Coucheservice

7.4.Coucheapplication

7.4.1.Action

7.4.1.1.ActionForm

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

56/57

7.4.2.Forwards

7.4.3.Exceptions

7.5.Coucheprsentation

7.5.1.Tiles

7.5.1.1.Dfinitions

7.5.1.2.Jsp(layoutsettiles)

7.5.2.Formulaires

7.5.3.Messagesderreur(MessageApplication)

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs

FrameworkStrutsModleMVC

57/57

8.LavenirdeStruts8.1.IntgrationavecJSTLEnadoptantJSP1.2,lesdiffrentsserveursdapplicationspeuventexploitertoutelefficacitde JSTL(JavaStandardTagLibrary).LeprincipaleffetsurStrutsseradefournirunesolutionde rechange la bibliothque de balises de Struts beaucoup plus puissante et capable dinteroprabilitaveclesplatesformesnonStruts. Enconsquence,onpeutsattendreprogressivementunedvalorisationdesbalisesStruts.

8.2.IntgrationavecJSFLauteurdeStruts:CraigMcClanahanestfortementimpliqudanslesspcificationsdesJSF (JavaServerFaces).StrutsetJSFserontdoncprobablementbientttroitementlis. UnefoisdepluslintrtpourlesbalisesStrutssestomperapourcelledeJSF(toujoursdanslebut davoirunstandard).

8.3.AdoptiongnralisedeStrutsStrutsestdevenurapidementtrspopulairedanslacommunautdedveloppementJavaJ2EE. IBM,OraclesontdebonsexemplesdeleaderayantchoisitStrutsdansleuroutildedveloppement dapplicationWeb. Findudocument

http://www.labosun.com CedocumentestlapropritdeSupinfoetestsoumisauxrglesdedroitsdauteurs