[PDF] [PDF] Formation Esup-Commons V2 - Exercices et - ESUP-Portail

8 Clique droit sur le projet web-‐jsf-‐servlet > Run As > Maven build 8 Saisir d'utiliser différents mécanismes de log (standard Java, Log4j, etc ) Ceci sera corrigé dans la prochaine version d'esup-‐commons et notemment d'esup-‐



Previous PDF Next PDF





[PDF] Exercices sur Servlets/JSP - Cnam

Indiquer où se trouve la servlet générée associée à cette JSP (traduction de cette JSP) Page 8 XVII-8 JMF Exercices servlets/JSP Le langage Java



[PDF] Applications Web - miageprojet2

Pour le développement Servlet/JSP ⇨ Conteneur de Servlet Classe java : chargée dynamiquement, elle étend les fonctionnalités Servlet : Exercices 1



[PDF] Java - Servlets - TECFA

17 jan 2001 · Module technique précédent: java-jsp Module d'exercices: act-servlets Objectifs http://java sun com/docs/books/tutorial/servlets/index html



[PDF] Travaux Pratiques Une belle servlet - Hippopotamus

29 oct 2006 · Le corrigé des exercices 1 à 6 est disponible Exercice 1 votre servlet Le fichier à lier est C:\Program files\Java\Sun\lib\j2ee jar 2 Une fois 



[PDF] IN328 : Servlets - Corrigé

IN328 : Servlets - Corrigé SI Ce TP va vous permettre de manipuler des servlets en utilisant le web container fonctionne bien en exécutant java -jar TP4 jar



[PDF] Développer des sites Web avec Java EE - Orsys

exercices à réaliser (50 à 70 du temps) corrigés des exercices pour Créer une Servlet, les inclusions, les Java - leçon 70' + quiz de 10 questions



[PDF] Examen 2017 corrigé - LIPN

Java Servlet POJO Java Server Lesquels de ces beans sont bien des technos java: Exercice 3 On veut écrire une appli qui distribue des pubs Il doit y avoir 



[PDF] Java, développement de servlets et JSP - ORSYS formation

corrigés des exercices pour Java, développement de servlets et JSP solutions sur les différents serveurs d'applications Java EE du marché comme JBoss 



[PDF] Formation Esup-Commons V2 - Exercices et - ESUP-Portail

8 Clique droit sur le projet web-‐jsf-‐servlet > Run As > Maven build 8 Saisir d'utiliser différents mécanismes de log (standard Java, Log4j, etc ) Ceci sera corrigé dans la prochaine version d'esup-‐commons et notemment d'esup-‐

[PDF] exercices corrigés soncas

[PDF] exercices corrigés spectroscopie d'absorption atomique

[PDF] exercices corrigés spectroscopie infrarouge

[PDF] exercices corrigés spectroscopie rmn

[PDF] exercices corrigés spectroscopie uv visible pdf

[PDF] exercices corrigés spss

[PDF] exercices corrigés stabilité des systèmes asservis

[PDF] exercices corrigés statique du solide

[PDF] exercices corrigés statistiques covariance

[PDF] exercices corrigés step 7 pdf

[PDF] exercices corrigés structure des molécules 1ere s

[PDF] exercices corrigés structures de données langage c

[PDF] exercices corrigés suites 1ere es

[PDF] exercices corrigés suites 1ere s

[PDF] exercices corrigés suites arithmético géométriques terminale es

Formation

Esup -Commons V2

FormationEsup-CommonsV2-ManipulationsPage2sur101 Introduction Lebutdecetteformationestdeparvenirréaliseruneapplicationdeboutenboutàl'aideduframeworkesup-commons.Ceciinclutlamaîtrisede l'environnementdedéveloppementetdesméthodologiespréconiséesparesup-commons.Pourcela,nousallonsréaliseruneapplicationsimplifiéedegestiondetâchesdetypetodo-list.Avant

comm nc r...Toutaulongdecedocumentvousrencontrerezcesicônes:& Vousindiquelesréférencesàladocumentationesup-commonsenligne8 Vousindiqueoùcliquer! Vousindiquelesastucesquivouspermettrontdegagnerdutempsdurantlaformation.Parexemple,lesélémentsdecorrectionsàcopier/collerplutôtquederetaper(enrisquantdesfautesdefrappe).Enfin,seulsleschapitresetexercicesindiquésparuneétoileserontabordésetobligatoiresdurantlasession.Cecidanslebutdepasserenrevuelespartieslesplusimportantesetcomplexesdelaformation.Lesexercicesrestantpourrontêtrefaitdemanièreautonome.Fonctionn m ntfinalatt n

u

l'applicationUneapplicationwebautonomequiproposera;• Unepaged'accueil publique,unepagede gestiond estâches etune pagedegestiondesutilisateurs.• Lapaged'accueillisteralestâchespubliquesetoffriraunboutondeconnexion• Lapagedegestiondestâchesafficheralestâchesquiappartiennentouquisontassignéesàl'utilisateur.• Unefoisl'utilisateurauthentifiéilpourraprocéderàlagestiondestâches(ajout,édition,modificationetsuppressiondetâches).• Onpourraafficherledétaild'unetâcheetl'applicationfourniraunliendirectverscettetâcheetoffriralapossibilitéd'envoyerledescriptifdelatâchepare-mail.• Lapagedegestiondesutilisateursproposeradesoptionsd'administrationetnotemmentl'ajoutd'utilisateursenbaseaprèsrecherchedansunannuaireLDAP.• Unwebserviceexposeraentreautreuneméthodepermettantderécupérerlalistedes10dernièrestâchesd'unutilisateur.Uneportletd'accrochequiinterrogeralewebserviceetn'afficheraquelalistedesndernièrestâchesdel'utilisateurconnectéauportail.

labas onné sBoncourageJ!

FormationEsup-CommonsV2-ManipulationsPage4sur101 Sommaire INTRODUCTION2SOMMAIRE4INDEXDESEXERCICES7PRISEENMAINDEL'ENVIRONNEMENT91LAMACHINEVIRTUELLE91.1PRESENTATION91.2INSTALLATIONDELAMACHINEVIRTUELLE91.3DEMARRAGE92L'ENVIRONNEMENTDEDEVELOPPEMENTECLIPSE103DECOUVERTEAVECESUP-EXAMPLE103.1CHECKOUTDEPUISSVN103.2ORGANISATIONDESFICHIERS113.3FONCTIONNEMENTENMODULESMAVEN113.4DEMARRAGE14CREATIOND'UNPROJET171CREATIOND'UNPROJETMAVENAPARTIRDEESUP-BLANK171.1VIAECLIPSE171.2ENLIGNEDECOMMANDE182UNCOUPDEMENAGE...202.1PREMIERLANCEMENT202.2MENAGEDANSLESLIBRAIRIESJSF222.3MENAGEDESMODULESINUTILES23BEANSSPRING241LEFICHIERDECONFIGURATIONPRINCIPAL242L'INJECTION243ACCESAUXPARAMETRESDECONFIGURATION27GESTIONDESLOGSETTESTSUNITAIRES291GESTIONDESLOGS291.1UTILISATIONDANSLECODEJAVA291.2ACTIVATIONDUMECANISMEDELOG292LESTESTUNITAIRES292.1EXECUTIONDESTESTSUNITAIRESVIAMAVEN302.2EXECUTIONDESTESTSUNITAIRESDANSECLIPSE34ACCESAUXDONNEES351L'OBJETMETIER352LACOUCHEDAO353LACOUCHESERVICES374PREMIERSTESTSD'ECRITUREETLECTUREENBASE39LESVUES431JSFETSESLIBRAIRIES432FACELET433PAGESETNAVIGATION44

FormationEsup-CommonsV2-ManipulationsPage7sur101 Index des exercices EXERCICEN°1:RECUPERATIOND'UNPROJETDEPUISSVN10EXERCICEN°2:LANCEMENTD'UNEAPPLICATIONMAVEN14EXERCICEN°3:CREATIOND'UNPROJETAPARTIRD'UNARCHETYPEMAVEN17EXERCICEN°4:INSTANCIATIOND'UNBEANSIMPLE25EXERCICEN°5:PERSONNALISATIONDESCONFIGURATIONSGRACEAL'INJECTION27EXERCICEN°6:TESTUNITAIRESIMPLE30EXERCICEN°7:TESTUNITAIREAVANCE32EXERCICEN°8:CREATIOND'UNOBJETMETIERSIMPLE.35EXERCICEN°9:CREATIOND'UNERELATIONENTREOBJETSMETIERS41EXERCICEN°10:TESTDELACOUCHE-OMAINDANSUNTESTUNITAIRE41EXERCICEN°11:AJOUTD'UNMENUVIAUNTEMPLATEFACELET44EXERCICEN°12:AJOUTD'UNENOUVELLEPAGEAVECREGLEDENAVIGATION44EXERCICEN°13:PARCOURSD'UNTABLEAU45EXERCICEN°14:DECLARATIONETUTILISATIONDESENTREES49EXERCICEN°15:SURCHARGED'UNBUNDLE50EXERCICEN°16:AJOUTD'UNLANGAGE51EXERCICEN°17:CREATIOND'UNFORMULAIREDESAISIESIMPLE52EXERCICEN°18:UTILISATIOND'UNCONVERTISSEURPREDEFINI53EXERCICEN°19:CREATIOND'UNCONVERTISSEUR54EXERCICEN°20:VALIDATIONDESCHAMPSGRACEAUNVALIDATEUR55EXERCICEN°21:VALIDATIONDESCHAMPSGRACEAJSR30356EXERCICEN°22:AMELIORATIONDUFORMULAIRE:EDITIONETSUPPRESSION56EXERCICEN°23:AJOUTDEFONCTIONSAJAXPOURL'ERGONOMIE57EXERCICEN°24:L'AFFICHAGEDESEXCEPTIONS58EXERCICEN°25:AJOUTDESFONCTIONNALITESD'E-MAIL61EXERCICEN°26:METTREENPLACEUNEAUTHENTIFICATIONAS63EXERCICEN°27:CREATIONDEBOUTONSDECONNEXIONETDECONNEXION65

FormationEsup-CommonsV2-ManipulationsPage9sur101 Prise en main de l'environnement 1 Lamac inevirtuelle1.1 PrésentationPourl'ensembledecetteformationnousutiliseronsunemachinevirtuelleautonomesurlaquellesontinstallés:• Java6(JDK)• Maven• UnserveurdebasededonnéesMySQL• UnannuaireLDAP• UnserveurCAS• UnPortailEsupv3.21.2 Installationdelamac inevirtuelleCréerunemachinevirtuelledansVirtualBox• Système:Linux/Version:Ubuntu• Affecterauminimum1024Modemémoire• Utiliserundisquedurexistanto Nouveauxsupportsvirtuelso Pointerverslefichieresup-commons-formation.vdi• TerminerActiverlesVirtualisationsdeprocesseur(sivotrematériellepermet)1.3 DémarrageLancerlamachinevirtuelle.• Login/motdepasse:esup/esup

FormationEsup-CommonsV2-ManipulationsPage10sur1012 L'environnementdedéveloppementEclipseEclipseestdéjàinstallésurlamachinevirtuelle.& Guidedudéveloppeur>Priseenmain>Installationdel'environnementdedéveloppementhttp://www.esup-portail.org/x/iwAABgPluginsinstallés:• SpringIDE• Checkstyle• Maven• Subclipse• ResourceBundleEditor8 DémarrerEclips (raccourcisurlebureau)3 Découverteavecesup-exampleNousallonscommencerparnousfamiliariseravecmavenetlastructured'unprojetesup-commonsgrâceàl'applicationesup-example.& Guidedudéveloppe ur>Pri seenmain>Découverteavecesup-examplehttp://www.esup-portail.org/x/hwIABg3.1 C eckoutdepuisSVNExerciceN°1: Récupérationd'unprojetdepuisSVNRécupérerleprojetesup-exampledepuislerépertoiretrunkdudépôtSVNdeesup-commons.PasserenperspectiveSVNRepositoryExploringdansEclipse8 Windows>OpenPerspective>Other...

FormationEsup-CommonsV2-ManipulationsPage11sur101Ajouterledépôthttps://subversion.cru.fr/esup-commons.Faireuncheckoutsur/trunk/esup-example3.2 Organisationdesfic iersPasserenperspectiveJavaEE.3.3 FonctionnementenmodulesMaven& Guidedudéveloppeur>Priseenmain>Méthodologiededéveloppementhttp://www.esup-portail.org/x/jQAABg

FormationEsup-CommonsV2-ManipulationsPage12sur101Activerlagestiondesdépendancesmavensurleprojet8 Cliquedroit>Maven>EnableDependencyManagment

FormationEsup-CommonsV2-ManipulationsPage13sur101Puisconstruireleprojet:8 Cliquedroit>Runas...>MaveninstallOnobserveradanslaconsoleJava:13/10/11 16:01:57 CEST: /home/esup/workspace/esup-example 13/10/11 16:01:57 CEST: mvn -B install Ceciprenduncertaintempssileslibrairiesnefigurentpasdansvotrerépertoire.m2 [INFO] ------------------------------------------------------------- [INFO] Reactor Summary: [INFO] ------------------------------------------------------------- [INFO] esup-example .......................................... SUCCESS [43.472s] [INFO] example-domain-beans .................................. SUCCESS [1:12.760s] [INFO] example-dao ........................................... SUCCESS [20.388s] [INFO] example-domain-services ............................... SUCCESS [1:40.356s] [INFO] example-utils ......................................... SUCCESS [0.115s] [INFO] example-web-jsf-shared ................................ SUCCESS [44.605s] [INFO] example-web-jsf-servlet ............................... SUCCESS [19.458s] [INFO] Unnamed - org.esupportail:example-web-jsf-mixed:war:1.0-SNAPSHOT SUCCESS [1:12.226s] [INFO] example-web-jsf-mobile ................................ SUCCESS [4.589s] [INFO] example-web-jsf-portlet ............................... SUCCESS [37.499s] [INFO] ------------------------------------------------------------- [INFO] ------------------------------------------------------------- [INFO] BUILD SUCCESSFUL

FormationEsup-CommonsV2-ManipulationsPage14sur101[INFO] ------------------------------------------------------------- [INFO] Total time: 7 minutes 1 second [INFO] Finished at: Thu Oct 13 16:08:59 CEST 2011 [INFO] Final Memory: 56M/169M [INFO] ------------------------------------------------------------- 3.4 DémarrageExerciceN°2: Lancementd'uneapplicationMavenNousallons commencernospremierst estssurun eapplicationdetypeservlettraditionnelle.Surlemoduleweb-jsf-servlet.mvn jetty:run 8 Cliquedroitsurleprojetweb-jsf-servlet>RunAs>Mavenbuild...8 Saisirunnomdetâcheetgoals:jetty:run

FormationEsup-CommonsV2-ManipulationsPage15sur101OnobserveradanslaconsoleJava:13/10/11 16:28:41 CEST: /home/esup/workspace/esup-example/example-web-jsf-servlet 13/10/11 16:28:41 CEST: mvn -B jetty:run L'executiondoitseterminerparlesmessagessuivantsdanslaconsole:[...] 2011-10-13 16:29:53.395:INFO::Started SelectChannelConnector@0.0.0.0:8080 [INFO] Started Jetty Server Démarrerunnavigateuretserendresurhttp://localhost:8080Testerlesdifférentesoptionsdumenu

FormationEsup-CommonsV2-ManipulationsPage17sur101 Création d'un projet & Guidedudéveloppeur>Priseenmain>Créationd'unprojetàpartird'unarchetypeblankhttp://www.esup-portail.org/x/lAAABgExerciceN°3: Créationd'unprojetàpartird'unarc etypemavenEsup-commonsproposeunarchéty pequip ermetdecréerautomatiquementt outel'arborescenced'unprojetvidequirespecteralespréconisationsduconsortiumpourledéveloppementd'uneapplication.1 Créationd'unprojetmavenàpartirdeesup-blankLadocumentation:F http://www.esup-portail.org/pages/viewpage.action?pageId=100663444Lastructureduprojetvaêtreconstruiteàpartird'unarchétypemavendontvoicilesparamètres:• archetypeRepository=https://mvn.esup-portail.org/content/repositories/releases• archetypeGroupId=org.esupportail.blank• archetypeArtifactId=esup-blank-archetype• archetypeVersion=0.2.8• groupId=org.esupportail.formation• artifactId=esup-formation• package=org.esupportail.formation• version=0.0.1-SNAPSHOT1.1 ViaEclipse8 File>new>project>Project...>Maven>Mavenproject

FormationEsup-CommonsV2-ManipulationsPage18sur1018 AddArchetype8 Créationduprojet1.2 EnlignedecommandeNousallonslancerl'équivalentenlignedecommande.Pourcela,ouvrirunterminal(raccourcisurlebureau).! Pourvoussimpli fierlatâch e,récupéreretplacerlescript create-project.shdans/esup/workspaceetlelancer.Dansesup/workspace lescriptvafaireunmvn archetype:generate -B -DarchetypeRepository=https://mvn.esup-portail.org/content/repositories/releases -DarchetypeGroupId=org.esupportail.blank -DarchetypeArtifactId=esup-blank-archetype -DarchetypeVersion=0.2.8 -DgroupId=org.esupportail.formation -DartifactId=esup-formation -Dpackage=org.esupportail.formation -Dversion=0.0.1-SNAPSHOT

FormationEsup-CommonsV2-ManipulationsPage19sur101Puisdanslerépertoireduprojet/esup-formationlescriptvafaireunmvn eclipse:eclipse 8 File>import...>Maven>ExistingMavenProjects...8 Browse>choisiresup-formation>Valider8 Cochertouslespom.xml>Finish

FormationEsup-CommonsV2-ManipulationsPage20sur101Onconstatealorsqu'éclipsefaitunBuildmavendependenciesetunBuildmavenprojectEclipseaalorsconstruitplusieursprojets.Ils'agitenfaitd'unprojetracine,iciesup-formationetdel'ensembledesesmodules,iciesup-formation-xxx.& Guidedudévelopp eur>Pri seenmain>Organisationdesfichiers http://www.esup-portail.org/x/pgAABgLeprojetestalorscomplètementautonomeetdéconnectéducoreesup-commonsetdeSVN.Mavennesertqu'àgérerlesdépendances.CeprojetpourraensuiteêtrepartagéviaSVNouêtrelui-mêmedéposésurunrepositorymaven(pourd'autresprojetsquienendépendraient)etmêmepotentiellementdevenirarchetypemaven(modèledeprojet).2 Uncoupdeménage...2.1 PremierlancementSurleprojetracine:mvn install 8 Cliquedroitsurleprojetracineesup-formation>RunAs>MavenInstall[INFO] Reactor Summary: [INFO] [INFO] esup-formation .................................... SUCCESS [0.933s] [INFO] esup-formation-domain-beans ....................... SUCCESS [4.283s] [INFO] esup-formation-dao ................................ SUCCESS [1.562s] [INFO] esup-formation-utils .............................. SUCCESS [0.580s] [INFO] esup-formation-domain-services .................... SUCCESS [0.961s] [INFO] esup-formation-web-jsf-mixed ...................... SUCCESS [14.104s] [INFO] esup-formation-web-jsf-servlet .................... SUCCESS [7.868s] [INFO] esup-formation-web-jsf-mobile ..................... SUCCESS [8.539s] [INFO] esup-formation-web-jsf-portlet .................... SUCCESS [8.928s] [INFO] esup-formation-web-springmvc-servlet .............. SUCCESS [4.476s] [INFO] esup-formation-web-springmvc-portlet .............. SUCCESS [10.112s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS

FormationEsup-CommonsV2-ManipulationsPage21sur101Silatraceestunpeudifférenteetfaitréférenceàdesmodulesunnamed,c'estparcequesurlamachinevirtuelleonutiliseMaven2quirecommandedepréciserunebalisedanslepom.xml.EnMaven3,cen'estplusnécéssaireNousallonscomme ncernospremierstes tssur uneappl icationdet ypeservlettraditionnelle.Surlemoduleweb-jsf-servlet.mvn jetty:run 8 Cliquedroitsurleprojetweb-jsf-servlet>RunAs>Mavenbuild...8 Saisirunnomdetâcheetgoals:jetty:runLancerlatâchejetty:rundepuisEclipseplutôtqu'enlignedecommandeoffrel'avantagedepouvoirlancerdudebuggagepasàpasetdurechargementàchaudgràceàl'utilisationdesoutilsintégrésàl'IDE.Vérifierquecelafonctionne[INFO] Started Jetty Server EtlancerdansunnavigateurF http://localhost:8080/

FormationEsup-CommonsV2-ManipulationsPage22sur1012.2 MénagedansleslibrairiesJSFStopperleserveur.Danslemodule web-jsf-servlet lefich ier /src/main/webapp/stylesheets/welcome.xhtmlôtertouteslesdéclarationsetlesutilisationsdeslibrairiesprimefaces,tomahawk(corps+déclaration)etutiliserplutôtlesbalisesJSFstandard.Onôtedonclesdéclarationsdeslibrairiestomahawk,primefaces,esupportail:• http://primefaces.prime.com.tr/ui• http://commons.esup-portail.org• http://myfaces.apache.org/tomahawkOnlaisselesdéclarationsdeslibrairiesJSFstandard:• http://java.sun.com/jsf/core• http://java.sun.com/jsf/facelets• http://java.sun.com/jsf/htmlOnpour rafairedemêmedan stemplate.xhtml,_include/_header.xhtmletexception/exception.xhtmlOterlabaliseprimefacesdansexception.xhtmlenremplaçant... ...par... Oterlabalisetomahawkdanstemplate.xhtmlenremplaçant... ...par... OterlesobjetsRunAs>Mavenbuild...8 Saisirunnomdetâcheetgoals:installjetty:runVérifierquecelafonctionne.

FormationEsup-CommonsV2-ManipulationsPage23sur1012.3 MénagedesmodulesinutilesEnfin,supprimerles modulesdontnousnenousservironspasaucours decette formationàsavoir:• esup-formation-web-jsf-mixed• esup-formation-web-springmvc-servlet• esup-formation-web-springmvc-portletPuisdanspom.xmlduprojetracineesup-formation,ôteroucommenterlesmodulesfilscorrespondants: esup-formation-dao esup-formation-utils esup-formation-domain-beans esup-formation-domain-services esup-formation-web-jsf-servlet Surleprojetracine:mvn clean install Eventuellement,faireunenouvelletâche:8 Cliquedroitsurleprojetracine>RunAs>Mavenbuild...8 Saisirunnomdetâcheetgoals:cleaninstall

FormationEsup-CommonsV2-ManipulationsPage24sur101 Beans Spring & Guidedudéveloppeur>Priseenmain>LesbeansSpringhttp://www.esup-portail.org/x/qAAABg1 Lefic ierdeconfigurationprincipalSpringpermetdecréerdesobjets(appelésalorsbeans)enlesdéclarantdansunfichierdeconfigurationXML.Lefichierdeconfigurationprincipalestdéclarédanslefichierweb.xml sousformed'unparamètredel'application.Ilsetrouveradoncdanslemoduledevuequiseralancé.Ouvrirparexempledanslemoduleweb-jsf-servletlefichier src/main/resources/properties/applicationContext.xml Dansesup-commonscefichie rdeconfigurationprin cipalco ntientseulementdesinclusionsdefichiersdeconfigurationsspécialiséspardomaineL'importdesdifférentsfichiers Casdesfichiersembarquésdanslesmodulessous-jacentsAfindelimiterladuplicationdesfichiersdeconfigurationdanschaquemoduledevue.Onpeutdéciderdepositionnerdesfichiersdeconfigurationdirectementauniveaudumodulequilesutilise. Onretrou veraparexemplecesfichiersdan slemodule domain-services etplus précisémentdanssrc/main/resources/META-INFafinqu'ilsseretrouventàlaracinedufichierjargénéréàlacompilationdumodule.2 L'injectionParcourirlesdifférentsfichiersdeconfiguration.Inj ction

'un chaîn caractèr sExemple: Inj ction 'unautr b anExemple: Inj ction 'un list

FormationEsup-CommonsV2-ManipulationsPage25sur101Exemple: Ext rnalisation

ansunfichi rOuvrirlefichiersrc/main/resources/properties/smtp/smtp.xml onremarqu edesparamètresexternalisésparl'intermédiaired'unevariable.Exemple: Lavariablesmtp.interceptAllserarenseignéedansunfichierdepropriétédistinct.Cemécanismepermetdesimplifierlatâchedesexploitants,quipourrontconfigureruneapplicationdirectementenéditantdesfichiersdepropriét és,plus simplesquedesfichiersXMLdeconfigurationspring.Danslemodule web-jsf-servlet lefich iersrc/main/resources/properties/applicationContext.xml ontrouve: classpath:/properties/defaults.properties classpath:/properties/config.properties L'utilisationduProp rtyPlac hol

ronfigur rdespringproposeunmécanismedesurchargedesfichiersdepropriét és.Onvoi tainsidansl'exemple l'utilisationd'unfichier/properties/defaults.propertiesquicontiendralaconfiguration pardéfautdel'application.Ilsuf firaalorsdesurcharger dansleficher/properties/config.propertieslesparamètresquineconviennentpasdufichier/properties/defaults.properties.Onconstatequeconfig.propertiesestvide.Eneffet,pardéfautuneapplicationviergeutiliselesparamètrespardéfaut.ExerciceN°4: Instanciationd'unbeansimpleL'objectifdecetexerciceestdecréerunbeansimpleetd'yinjecterlesvaleursdesattributsgrâceàspring.Dansdomain-beansajouterlebeanTaskpackage org.esupportail.formation.domain.beans; public class Task{ private boolean publicTask; private String title; private String description; public String getTitle() { return title;

FormationEsup-CommonsV2-ManipulationsPage26sur101 } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public boolean isPublicTask() { return publicTask; } public void setPublicTask(boolean publicTask) { this.publicTask = publicTask; } } ! RécupérerlefichierTask.java-exo4Déclareruneinsta ncedecebeandanssrc/main/resources/properties/web/beans.xml Importerbeans.xmldanssrc/main/resources/properties/applicationContext.xml Pourl'exemple,injectercebeandanss ssionontroll rdumoduleweb-jsf-servlet.Pourcela,ajouterunepropriétédetypeTaskàl'objets ssionontroll rainsiquesesaccesseurs.private Task task; [...] public Task getTask() { return task; } public void setTask(Task task) { this.task = task; } Injecterparréférencetask1dansles ssionontroll rparconfigurationSpringDanssrc/main/resources/properties/web/controllers.xml [...] The task FaireaffichercebeandanslaméthodeafterPropertiesSetInternal()des ssionontroll rimport org.esupportail.formation.domain.beans.Task; import org.esupportail.commons.utils.BeanUtils;

FormationEsup-CommonsV2-ManipulationsPage27sur101[...] public class SessionController extends AbstractDomainAwareBean { [...] @Override public void afterPropertiesSetInternal() { [...] System.out.println("Test injection => "+task.getTitle()+" "+task.getDescription()); } [...] Surleprojetracine:mvn clean install Surlemoduleweb-jsf-servlet.mvn jetty:run Seconnectersurl'applicationpourinstancierleS ssionontroll r.Pourcela,lancerdansunnavigateurF http://localhost:8080/Ontrouveraalorsdansleslogs:Test injection => titre 1 description blabla 3 AccèsauxparamètresdeconfigurationExerciceN°5: Personnalisationdesconfigurationsgrâceàl'injectionDanscetexercicenousallonsobserverlefonctionnementglobalduparamétraged'uneapplicationetmodifierpourl'exemplelaconfigurationdusystèmed'authentification(quiseravuplustard)grâceauxmécanismesd'injectionspring.Danslemoduledomain-services vérifierdans lefichiersrc/main/resources/META-INF/esup-formation-domain-services-auth.xmlquelaméthod ed'auth entificationestbie n"offline»(utilisationdelaclasseorg. supportail.commons.s rvic s.auth ntication.Offlin Fix

Us rAuth nticationS rvic auniveaudeauthenticator).Oncons tatequel'identifiantdubeanréférencéest indiquédans unevariable${auth.bean}quiseradéclaréedanssrc/main/resources/defaults.propertiesdumoduleweb-jsf-servletquiserasurchargéparconfig.properties.Changerleloginquiserapositionnéendurpardéfautetletyped'authentificationquiserasimulé.Exemple: Faireafficherlaversiondel'applicationdanslaméthodeafterPropertiesSetInternal()des ssionontroll rdumoduleweb-jsf-servlet.

FormationEsup-CommonsV2-ManipulationsPage28sur101Oncons tatequedanssrc/main/resources/properties/misc/application.xml onpeutparamétrerlaversiondel'application.Changerlenumérodelaversion. The major number of the application (1 for version 1.2.3). The minor number of the application (2 for version 1.2.3). The update of the application (3 for version 1.2.3). Ensuitedanss ssionontroll rdumoduleweb-jsf-servletonconstatequeesup-commonsfournitparhéritagela méthodegetApplicationService()quinousper metd'appelerGetVersion().public void afterPropertiesSetInternal() { [...] System.out.println("Test Version => "+getApplicationService().getVersion().toString()); } Onconstatedansesup-commonsqueGetVersion()fournirabienuneconcaténationdes3numérospassésenconfiguration:public Version getVersion() { return new Version(versionMajorNumber + "." + versionMinorNumber + "." + versionUpdate); } Surlemoduleweb-jsf-servlet.mvn jetty:run Seconnectersurl'applicationpourinstancierleS ssionontroll r.Pourcela,lancerdansunnavigateur! http://localhost:8080/Ontrouveraalorsdansleslogs:Test Version => 0.0.2 Nousavonsfait ceciàtitred'e xemple.Supprimer ladéclaratio ndub eandansbeans.xmletsarécupérat iondansS ssionontroll r.Eventuellement,remettrelenumérodeversion 0.0.1.Nousnegarderonsqu ela classeTasketl'authent ificationofflinepourlasuite.

FormationEsup-CommonsV2-ManipulationsPage29sur101 Gestion des Logs et tests unitaires 1 GestiondeslogsEsup-commonsutiliselalibrairie standar dcommons-loggingd'Apachequipermetd'utiliserdifférentsmécanismesdelog(standardJava,Log4j,etc.).1.1 UtilisationdanslecodeJavaPourpouvoirut iliserun loggerdansuneclassedevot reapplicat ionvousdevezledéfinir.Suivantlecas,vousaurezdeuxdéfinitions.Exemple:private static final Logger LOGGER = new LoggerImpl(NonClasse.class); ouprivate final Logger logger = new LoggerImpl(getClass()); Lepremier exempleestadaptéà l'utilisationd'un loggeràl'i ntérieurd'uneclass eutilitaireconstituéedeméthodes définiesstatic.Lesecond exempleestadaptéaux classesdynamiques.Dans cecasl'utilisationdegetClas s()permetd'avo iruneinformationsurlaclasseconcrèteutilisée.C'estparticulièrementutileencasd'héritagedeclasses.EnsuitevouspouvezutiliserceloggerdansvosméthodespourloguerenmodeTRACE,DEBUG,INFO,WARNouERROR.Exemple:logger.error("Nous avons un problème"); AfindenepaspénaliserlesperformancesaveclagestiondeslogsenmodeDEBUGetTRACEilestconseillédetesterleuractivation.Exemple:if (logger.isDebugEnabled()) { logger.debug("set language " + locale + " for user '" + currentUser.getId() + "'"); } 1.2 ActivationdumécanismedelogLemécanis medegestiondeslogse stconfi gurédanslefichiersrc/main/resources/log4j.propertiesdumodule web-jsf-servletDansconfig.propertiesparamétrerlagestiondeslogsàvotreconvenance.Ajouterparexemple:log.level=DEBUG log.output=stdout 2 LestestunitairesLestestsunitairessont(oudevraientêtre!)unepartieimportantedetouteapplicationJava.

FormationEsup-CommonsV2-ManipulationsPage30sur1012.1 ExecutiondestestsunitairesviaMavenMavenintègrecomplètementlestestsunitairesdanslecyclededéveloppement.Pourexécuterl'ensembledestestsunitaires,onappellelaphasetestducycledevie:mvn test ExerciceN°6: TestunitairesimpleAfindevoircommentmavenintègrelagestiondestestsunitairesnousallonsmettreenplaceuntestunitairesimplesurlebeanTask.Danslefichierpom.xmldumoduledomain-beansajouterladépendanceversJUnit. junit junit 4.8.2 jar test 8 cliquedroitsurleprojet>Maven>UpdatedépendenciesOnnote ral'utilisationdus copetestquiindiqueàmavenquecett elibrairieneserautiliséequepourlestestsunitairesdumodule.Decefait,ilestimpossibledegénéraliserl'utilisationdelalibrairie jUnitendéclar antladépendanceauniveaud ulemodu leracinedel'applicationpuisquelaportéerestedansleslimitesdumodule.Puiscréerlerépertoiresrc/test/java(conventionmaven)8 cliquedroitsurjava>Buildpath>BuildassourcefolderCréeruneclassedetest(testCase)surTask8 cliquedroitsurtask.java>new>other...>JUnit>JUnitTestCase8 Attention!changerlerépertoiresourceproposépardéfaut8 Next>ChoisiruneoudeuxméthodesLaisserlaclasseproposéepardéfaut(quiprovoqueunéchecàchaquefois)package org.esupportail.formation.domain.beans; import static org.junit.Assert.*; import org.junit.Test; public class TaskTest { @Test public void testSetTitle() { fail("Not yet implemented"); } @Test public void testGetDescription() { fail("Not yet implemented"); } } Lancermvn test 8 Cliquedroitsurlemodule>Runas>MavenTest

FormationEsup-CommonsV2-ManipulationsPage31sur101Onconstatealorsdanslaconsole:Running org.esupportail.formation.domain.beans.TaskTest [...] Failed tests: testSetTitle(org.esupportail.formation.domain.beans.TaskTest): Not yet implemented [...] Tests run: 2, Failures: 2, Errors: 0, Skipped: 0 [...] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.7.2:test (default-test) on project esup-formation-domain-beans: There are test failures. Etsiontentedecompileroulancerl'applicationonobtientlamêmeerreur:• Surlemoduleousurleprojetracinemvn clean install • Surlemoduleweb-jsf-servletmvn jetty:run Eneffet,mavenexigequel'ensembledestestsunitairessoitvalidéavantdepoursuivre.Ajoutermaintenantuntestquipasse(ouquipeutpasserpourêtreexact!)@Test public void testSetTitle() { Task t=new Task(); t.setTitle("test titre"); assertEquals("test titre",t.getTitle()); } EtlàçapasseRunning org.esupportail.formation.domain.beans.TaskTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.051 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 Ilesttoujourspossibled'indiquerexplicitementàmavend'ignorerlestests• Enlignedecommande-Dmaven.test.skip=true ou-DskipTests=true • Auniveaudufichierpom.xml org.apache.maven.plugins maven-surefire-plugin true • Danseclipse

FormationEsup-CommonsV2-ManipulationsPage32sur1018 FenêtreRun>Runconfigurations>cocherSkipT stExerciceN°7: TestunitaireavancéOnsouhai teparexempletesterquel 'authentica torinjectéestbien dela classeAuthenticatorImpl.Cetestestcomplètementabsurdedansuncasréelmaisilvanouspermettredevoircommentlanc erdestestsenmo debatch(horsconte neurJ2EE)dépendantd'unearborescencedefichiersdeconfigurationstraditionnellementgérésparleconteneurJ2EEdansuncontexteweb.Démarrercommel'exerciceprécédentdanslemoduledomain-servicesCréeruneclassedetestsurAuth nticatorpackage org.esupportail.formation.domain; import org.esupportail.formation.services.auth.Authenticator; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; [...] public class AuthenticatorTest { @Autowired private Authenticator authenticator; @Test public void testSetAuthenticationService() { Assert.assertEquals("org.esupportail.formation.services.auth.AuthenticatorImpl",authenticator.getClass().getName()); } } Danssrc/test/resources/META-INF(àcréer)créerunfichier deconfiguration springsimilaireàapplicationContex.xml(testApplicationContext.xmlparexemple)quicontiendra:

FormationEsup-CommonsV2-ManipulationsPage33sur101 Sicesfi chiersimport ésutilisentdesparamètres externalisésdansunf ichierdepropriétés,copier/collercesfichiersconfig.propertiesetdefault.propertiesoucréerunfichierminimalcontenantuniquementlespropriétésnécéssaires.IlfaudraalorsajouterunpropertyConfigurer classpath:META-INF/defaults.properties classpath:META-INF/config.properties Simulerenfinletrava ilducontexted' applicationeny ajoutantles fichier sd econfigurationsnécessaires.Celasetraduiradelafaçonsuivantedanslaclassedetest [...] import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath*:META-INF/testApplicationContext.xml") public class AuthenticatorTest { [...] Pourall rplusloin...Onpourra,pourletestvérifierlaclassed'implémentationdel'auth nticationS rvic estbienOfflin Fix

Us rAuth nticationS rvic Pourcela,ondéclareragetAuthenticationService()deAuth nticatorcommeméthodepublicetnonplusprotected:public AuthenticationService getAuthenticationService() { return authenticationService; } ...etontestera:Assert.assertEquals("org.esupportail.commons.services.authentication.OfflineFixedUserAuthenticationService",authenticator.getAuthenticationService().getClass().getName());

FormationEsup-CommonsV2-ManipulationsPage34sur1012.2 ExecutiondestestsunitairesdansEclipseEclipsepermetdelancerdirectementuntestunitairegrâceàun:8 Cliquedroitsurlaclassedetest>Runas>JUnitTestLerésultatestalorsvisuel...

FormationEsup-CommonsV2-ManipulationsPage35sur101 Accès aux données & Guidedudéveloppe ur>Dév eloppementd'applications>Accèsaux donnéeshttp://www.esup-portail.org/x/zwAABgExerciceN°8: Créationd'unobjetmétiersimple.L'objectifdecepremierexerciceestdecréerl'objetmétierreprésentantunetâcheetdemettreenplacelesmécanismesd'écrituresetlectureenbasededonnée.PourcelaonutiliseraunebasededonnéeembarquéeHSQL.1 L'objetmétierCréerunobjetmétierquiseramappéenbase.Danslepom.xmldumoduledomain-beansajouterladépendanceverslemoduleJPAdeesup-commons. org.esupportail esup-commons2-jpa ${esupcommons.version} provided Dansdomain-beansadapterlebeanTaskcrééprécédementenladéclarantcommeentité(@Entity)avec:• id(longgénéréenbase):Identifiant(@Idet@GeneratedValue)• title(chaineobligatoire):Titre(@Column(nullable=false))• date(typedate):Datedelimited'éxécutiondelatâche• description(typechaine):Descriptiondelatâche• publicTask(typebooleen):BooléenprécisantsilatâcheestpubliqueoupasAjouter2requêtesderécupérationdestâchesgrâceàdesannotations(@NamedQuerieset@NamedQuery)surlebeanTask:• allTasks:pourrécupérertouteslestâches.• publicTasks:pourrécupérerlestâchespubliques.! RécupérerlefichierTask.java-exo82 Lacouc eDAODanslemoduledao,créeruneclassed 'accèsDAOJPA-aoS rvic Implquiétendra org. supportail.commons.

ao.AbstractG n ricJPA-aoS rvic ainsiquesoninterface-aoS rvic quidevraseprésentercommesuit: package org.esupportail.formation.dao; import java.io.Serializable; import java.util.List; import org.esupportail.formation.domain.beans.Task;

FormationEsup-CommonsV2-ManipulationsPage36sur101 /** * The DAO service interface. */ public interface DaoService extends Serializable { /** * Get all public task. */ public List getPublicTasks() ; /** * Get all task. */ public List getTasks(); /** * Add a task. * @param task */ void addTask(Task task); /** * Delete a task. * @param task */ void deleteTask(Task task); /** * Update a task. * @param task */ Task updateTask(Task task); /** * @param id * @return the Task instance that corresponds to an id. */ Task getTask(long id); } Onvaensuitedevoirajouterlesfichiersdeconfigurationnécessaires. Pourcela2façondepositionner:• Soitdanslemoduledevuequiseralancé(ex:web-jsf-servlet)àfaireàchaquemoduledevues'ilyenaplusieurs(ex:unevueportletetunevueservlet)• Soitdanslemoduledaodirectementdemanièreàavoirlaconfigurationdanslejargénéréparmavenets'assurerd'avoirlamêmechosesquelquesoitlemoduledevuelancé.Esup-commonspréconisedelocaliserlesfichiersdeconfigurationspringauplusprèsdeleurutilisationc'estàdireauniveaudumodule.Pourcela:! Récupérerlesfichiersesup-formation-dao-dao.xml-exo8etesup-formation-dao-persistence.xml-exo8.Copier/collerlesfichiersesup-formation-dao-dao.xmletesup-formation-dao-persitence.xmlverssrc/main/resources/META-INF(àcréer)enDansesup-formation-dao-dao.xmlvérifierlecheminversesup-formation-dao-persitence.xml:

FormationEsup-CommonsV2-ManipulationsPage37sur101 Onconstatedansesup-formation-dao-dao.xmlquelesparamètressontpassésparl'intermédiairedevariablesquiserontpositionnéesdanslefichierdeproperties.Onpeutd'oresetdéjàprévoirquelacouchedaoseraappeléeparlacouchedomain-services.On devradon cajouterl'import deladaodanslefich iersrc/main/resources/META-INF/esup-formation-domain-services-domain.xmldumoduledomain-servicesdelafaçonsuivante Enfinsurlemoduledaofairemvn install 3 Lacouc eServicesLacoucheservicevafaireappelàlacouchedaopourrécupérerlestâchesenbase.Danslefichierpom.xmldumoduledomain-servicesajouterladépendanceverslemoduledao org.esupportail.formation esup-formation-dao 0.0.1-SNAPSHOT jar Ajouterdans-omainS rvic Impll'attributdaoServiceetlesaccesseurscorrespondantsprivate DaoService daoService; Encasd'erreursdereconnaissancedesclassesdaogénérerànouveaulejardumoduledao.AjouterdansafterPropertiesSet()lavé rificationdel'injectioncorrectedel' objet-aoS rvic .Assert.notNull(this.daoService, "property daoService of class " + this.getClass().getName() + " can not be null"); Ajouterdans-omainS rvic etsonimplémentation-omainS rvic Impllesméthodespermettantdelisterlestâchesetd'ajouterunetâche. public List getTasks() { return daoService.getTasks(); } public void addTask(Task task) { Task tmp = daoService.getTask(task.getId()); if (tmp == null) { // task does not already exists in database logger.debug("addTask -> not found "+task.getId()); daoService.addTask(task); } else { daoService.updateTask(task); logger.debug("addTask -> found "+task.getId()); } }

aoS rvic dansMETA-INF/esup-formation-domain-services-domain.xml AinsiqueAOP(aspect-orientedprogrammingviaSpring)pourgérerlesconnexionsauxbasesdedonnéesetlestransactions. Labalisepermetdepréciserdeuxchoses:-Lepoint decoupe(pointc ut).C 'est-à-direl'empla cementoùvaêtreinsérédynamiquementlecodeAOP.L'attributexpressionpermetdepréciserquel'onvaciblertoutesles méthodes,quellequ' ensoitla signature,delaclasseDomainServiceImpldansunpackagedonclepathcommenceparorg.esupportailetfinipardomain.-Laréférenceaugestionnairedetransactionsàbranchersurcepointdecoupe.Labalise

vic >permetdepréciserlanaturedelatransaction.Icionprécise,viapropagation="REQUIRED"quel'onveutcréerunetransaction,siellen'estpasencoreprésente,surtouteslesméthodesdontlenomcommenceparadd,deleteouupdate.Danslefichiergénéraldepropriétésdumoduledevuequiserautilisé(iciweb-jsf-servlet)src/main/resources/properties/config.propertiesconfigurerla connexionàlabasededonnées(cf.variablesutiliséesdansdao-dao.xml)#################################################################### # Database jdbc.connection.driver_class=org.hsqldb.jdbcDriver jdbc.connection.url=jdbc:hsqldb:file:formationData jdbc.connection.username=sa jdbc.connection.password= jndi.datasource=jdbc/formationDB # JNDI/JDBC # for JDBC datasource.bean=JDBCDataSource # for JNDI datasource.bean=JNDIDataSource datasource.bean=JDBCDataSource jpa.database.type=HSQL

FormationEsup-CommonsV2-ManipulationsPage39sur101Enfin,sicelan'apasétéfaitajouterl'importdufichierdepropriétésDAO 4 Premierstestsd'écritureetlectureenbaseDanssrc/main/javadumoduleweb-jsp-servletcréerTaskontroll rdupackageorg. supportail.formation.w b.controll rs.Lerôleducontrôleurseraabordédanslechapitresuivantsurlesvuespackage org.esupportail.formation.web.controllers; import java.util.Date; import org.esupportail.formation.domain.beans.Task; public class TaskController extends AbstractContextAwareController { /** * VersionId */ private static final long serialVersionUID = -872218604638760392L; public String getTestDao(){ Task task=new Task(); task.setDate(new Date()); task.setTitle("titre de test"); task.setPublicTask(true); getDomainService().addTask(task); return "OK"; } } Déclarerlecontrôleurdanssrc/main/resources/properties/web/controllers.xml Etl'appelerdanssrc/main/webapps/stylesheets/welcome.xhtmlenajoutantun Surleprojetracine:mvn clean install Surlemoduleweb-jsf-servletmvn jetty:run Vérifierquecelafonctionne[INFO] Started Jetty Server etF http://localhost:8080/

FormationEsup-CommonsV2-ManipulationsPage40sur101"OK"s'affichelaméthodeaétéappeléeDanslaconsoleona...Hibernate: select task0_.id as id0_0_, task0_.date as date0_0_, task0_.description as descript3_0_0_, task0_.publicTask as publicTask0_0_, task0_.title as title0_0_ from Task task0_ where task0_.id=? Hibernate: insert into Task (id, date, description, publicTask, title) values (null, ?, ?, ?, ?) Hibernate: call identity() ...cequisembledirequelatâcheaétéajoutée.DansEclipsefaireunrefreshsurweb-jsf-servlet.Onconstateque3fichiersontétécréésàlaracinedumodule:DansformationData.logouformationData.scriptontrouvelescriptdecréationdelabasegénéréàpartirdecequ'onadéclaréparannotationsJPA.CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE MEMORY TABLE TASK(ID BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY,DATE TIMESTAMP,DESCRIPTION VARCHAR(255),PUBLICTASK BOOLEAN NOT NULL,TITLE VARCHAR(255) NOT NULL) ALTER TABLE TASK ALTER COLUMN ID RESTART WITH 2 CREATE USER SA PASSWORD "" GRANT DBA TO SA SET WRITE_DELAY 10 SET SCHEMA PUBLIC Enrevanche,ilnecontientpaslesdonnées.Sionstoppejetty,onn'atoujourspasdedonnéesdanscefichier.OnredémarreetlàonaINSERT INTO TASK VALUES(1,'2011-07-27 13:17:27.957000000',NULL,TRUE,'titre de test') Enfait,touteslesactionsfaitesenbasesontd'abordconservéestemporairementdansunfichierdelogformationData.log.Achaquedémarrageleslogssontrejouésetl'étatdelabaseestalorsenregistrédansformationData.script.Ajouterlarécupérationdel'ensembledestâchesenbasedanslaméthodegetTestDao()etlelisterdanslaconsoleList liste=getDomainService().getTasks(); for (Task t : liste) { if (logger.isDebugEnabled())

FormationEsup-CommonsV2-ManipulationsPage41sur101 logger.debug(t.getId()+" : "+t.getTitle()); } Ondéclareraleloggerprivate final Logger logger = new LoggerImpl(getClass()); OndoitalorsretrouverleslignessuivantesHibernate: select task0_.id as id0_, task0_.date as date0_, task0_.description as descript3_0_, task0_.publicTask as publicTask0_, task0_.title as title0_ from Task task0_ 2011-11-09 16:56:02,678 DEBUG [org.esupportail.formation.web.controllers.TaskController] - 1 : titre de test ExerciceN°9: Créationd'unerelationentreobjetsmétiersPardéfaut, ontrouve danslemodule domain-beanslaclas seUser.Nousallons maintenantgérercetyped'objetenbaseetajouterunerelationavecl'objetTask.Ils'agiradoncd'ajouterlapropriétéownerquiseraleUserquiacréélatâche.Pourallerplusloin:• Ajouterettesterlamodificationd'uneTâche• Ajouterettesterlasuppressiond'uneTâche• Ajouterlarecherchedestâchesd'unuser• Faireensortequelorsqu'onsupprimeunUserenbase,l'ensembledesestâchessoientsuppriméeségalementDansUs r :• Ajouteridcommeidentifiantgénéréautomatiquementgrâceàl'annotation@GeneratedValue • Nestockerqueid,etloginlesautrespropriétésserontignoréesgrâceà@Transient • AjouterlebeanUs rdansdao-persistence.xmlDansTask• AjouterlarelationsurunepropriétéUserownerenutilisantl'annotationManyToOne(optional = true) Dansdomain-servicesetdao:• AjouterlesaccèsàlapersistancedesobjetsUs r(add,remove,etc.)TesterenlogantcommeprécédemmentExerciceN°10: Testdelacouc edomaindansuntestunitairePourvaliderl'intégritédecettecouched'accèsauxdonnéesquiestamenéeàchangersouventaucoursdu développementd'uneap plication,onajo uteraquelquestestsunitaires.(Exercicefacultatif)CréeruntestCasesur

omainS rvic quipourraressembleràça:package org.esupportail.formation.domain; import java.util.Date; import java.util.List; import junit.framework.Assert;

FormationEsup-CommonsV2-ManipulationsPage42sur101 import org.esupportail.formation.domain.beans.Task; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath*:META-INF/testApplicationContext.xml") public class DomainServiceTest { @Autowired DomainService domainService; @Test public void testAddTask() { Task t=new Task(true, "Test de tache", "Tache de test", new Date()); domainService.addTask(t); List listedestaches = domainService.getTasks(); //on cherche la tâche en base Task task=null; for (int i = 0; i < listedestaches.size(); i++) { if(listedestaches.get(i).getTitle().equals("Test de tache")) task=listedestaches.get(i); } Assert.assertNotNull("La tache de test créée en base n'a pas été retrouvée" , task); } } DocumentationJPA:& http://tahe.developpez.com/java/jpa/& http://www.dil.univ-mrs.fr/~massat/ens/jee/tp-JPA.html& http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html

FormationEsup-CommonsV2-ManipulationsPage43sur101 Les vues Esup-commonslaisselalibertéaudéveloppeurdechoisirlatechnologiedevuequ'ilsouhaite:• SpringMVC• JavaFaces:JSFCesdernièresétantsensiblementdifférentes,nousnelesdétailleronspasdanscetteséancelesdifférentestechnologies.Ellespourrontfairel'objetdesessionsdeformationdesecondniveauspécialiséessurl'uneoul'autredecestechnologies.& Guidedudévelopp eur>Pri seenmain>Lesvueshttp://www.esup-portail.org/x/KYA6Bw1 JSFetseslibrairies& Guidedudéveloppe ur>Pri seenmain>JSFhttp://www.esup-portail.org/x/qgAABgPourcommenceretresterrelativementprochedecequel'onpouvaitfaireenesup-commonsV1nousallonsutiliserJSF.Cependant,nousnouslimiteronsauxlibrairiesJSFstandardetnousn'utiliserons pasleslibrairiesplus évoluéestellesquetomahawk,primefacesetc.Danslesprochainschapitresnousallonsessentiellementtravaillersurlemoduledevue.DansEclipse,pouractiverl'autocomplétiondanslespagesJSFoncocheradansProject>Properties>ProjectFacets>JavaserverFaces2 Facelet& Guidedudévelopp eur>Pri seenmain>JSF>Facelethttp://www.esup-portail.org/x/sAAABg

FormationEsup-CommonsV2-ManipulationsPage44sur101ExerciceN°11: Ajoutd'unmenuviauntemplatefaceletOnsouhaiteajouterunmenuetquiserafixepourtouteslespagesdenotreapplication.Pourcelanousallonscréeruntemplatefaceletquel'onchaînerasurletemplateproposépardéfaut.Seplacerdansl'arborescencesrc/main/webapps/stylesheetsDanscréerunfichierpageTemplate.xhtmlquilui-mêmeappeleratemplate.xhtmletdanslequelonnedéfiniraquelemenuquel'onsouhaitefixe Menu fixe ici Danswelcome.xhtml • supprimerladéfinitiondenavigationpuisqu'elleestdéfiniedansletemplate• remplacerletemplateutiliséparpageTemplate.xhtmlTester3 Pagesetnavigation& Guidedudéveloppeur>Priseenmain>JSF>Généralitéshttp://www.esup-portail.org/x/rgAABgExerciceN°12: Ajoutd'unenouvellepageavecrègledenavigationNousallonscréerunlienderedirectionversunenouvellepage:leTaskManagerquipermettradegérerlestâches.Nousallonsd'abordcréerunenouvellepageJSPquin'afficherarien(d'intéressant)pourl'instant.Danssrc/main/webapps/stylesheetscréerunfichier taskManager.xhtmlquiressembleraàceci:

FormationEsup-CommonsV2-ManipulationsPage45sur101 xmlns:h="http://java.sun.com/jsf/html" template="/stylesheets/pageTemplate.xhtml"> Ici le Task Manager ! Danssrc/main/javadumoduleweb-jsp-servletajouterlaméthodedoToTaskManagerPage()àorg. supportail.formation.w b.controll rs.Taskontroll r.Cetteméthoderetournelachaine"go_taskManagerPage» public String goToTaskManagerPage(){ return "go_taskManagerPage"; } Enfinonajoutelar èglede navigationd anssrc/main/webapps/WEB-INF/navigation-rules.xml. Cettedéclarationdoitpréciserquelorsquelachainego_taskManagerPageestretournéeparJSFilfautalorsredirigerverslapagetaskManager.xhtml Gestion des tâches go_taskManagerPage /stylesheets/taskManager.xhtml Testerenajoutantunliensurlapaged'accueilDanssrc/main/webapps/stylesheets/welcome.xhtmlenajoutantunlien Task Manager Labaliseestobligatoirepourun.Nousverronsplusloinlacréationdeformulaires.Necompilerquelemoduleweb-jsf-servletmvn install jetty:run VérifierquecelafonctionnePourallerplusloinfaitesensortentqueceliensoitlepremierongletdumenudenotreapplication.ExerciceN°13: Parcoursd'untableauAfficherlalistedestâchesstockéesenbaseetajouteruntripardategrâceàl'utilisationd'objetscomparateurs(quiimplémentelaclasseComparable).Danssrc/main/javadumoduleweb-jsp-servletajouterlaméthodegetTasks()àorg. supportail.formation.w b.controll rs.Taskontroll rprivate List sortedTasks=null; [...] public List getTasks() { if (this.sortedTasks==null) sortedTasks = getDomainService().getTasks(); return sortedTasks;

FormationEsup-CommonsV2-ManipulationsPage46sur101 } Danssrc/main/webapps/stylesheets/taskManager.xhtmlonauraceci: Améliorerlerendu......enajoutantlesentêtesauxcolonnesdanslesbalises ...entest antsilalistecontien tdesélé mentsdan slecascontraire onafficheraunmessage:rendered="#{taskController.tasks != null and !empty taskController.tasks}" ...enajoutantunboutonquipermetd'ajouterdestâchesfacticesdécritesendurainsiqu'unboutonquisupprimetout. Etdanssrc/main/javadeweb-jsp-servlet,ajouterlesméthodesaddFakeTask()etsupprimerTout()àorg. supportail.formation.w b.controll rs.Taskontroll rpublic void addFakeTask() { User user1=getDomainService().getUser("cbissler"); if(user1 == null){ user1=new User(); user1.setLogin("cbissler");

FormationEsup-CommonsV2-ManipulationsPage47sur101 getDomainService().addUser(user1); } //On ajoute la tâche getDomainService().addTask(new Task(true, "titre de tache bidon", "", new Date(), user1)); } public void supprimeTout() { List listeTask=getDomainService().getTasks(); for (Task t : listeTask) { getDomainService().deleteTask(t); } List listeUser=getDomainService().getUsers(); for (User u : listeUser) { getDomainService().deleteUser(u); } } ...entriantlestâchesparordrealphabétique,dateàl'aidedecomparateursPourceladanslemoduleutilsajouterladépendancedanspom.xml org.esupportail.formation esup-formation-domain-beans 0.0.1-SNAPSHOT jar Surlemoduleutilsmvn install Danssrc/main/javadumoduleutils, créerlesclassesTask-at omparatoretTaskTitl omparatoràl'imagedecelle-ci:package org.esupportail.formation.utils; import java.util.Comparator; import org.esupportail.formation.domain.beans.Task; public class TaskDateComparator implements Comparator { public int compare(Task t1, Task t2) { int result = t1.getDate().compareTo(t2.getDate()); //si la date est identique on trie ensuite par le titre if(result==0) result = t1.getTitle().compareTo(t2.getTitle()); return result; } } Surlemoduleutils refairemvn install Ensuite,ilvafalloirfairedépendremoduleweb-jsp-servletdeutilsenajoutantdanslepom.xml dumodulemoduleweb-jsp-servlet org.esupportail.formation esup-formation-utils 0.0.1-SNAPSHOT

FormationEsup-CommonsV2-ManipulationsPage48sur101Danssrc/main/javadeweb-jsp-servletajouterlesméthodessortTasksByDate()etsortTasksByTitle()àorg. supportail.formation.w b.controll rs.Taskontroll r public void sortTasksByDate() { if (this.sortedTasks==null) sortedTasks = getDomainService().getTasks(); Collections.sort(sortedTasks, new TaskDateComparator()); } public void sortTasksByTitle() { if (this.sortedTasks==null) sortedTasks = getDomainService().getTasks(); Collections.sort(sortedTasks, new TaskTitleComparator()); } Enfinajouterlesboutonsdetriàlavue [...]

FormationEsup-CommonsV2-ManipulationsPage49sur101 Internationalisation & Guidedudéveloppe ur>Dév eloppementd'applications>Internationalisationhttp://www.esup-portail.org/x/xwAABg1 ConfigurationL'internationalisationestdéfiniedanslefichierdeconfigurationsrc/main/resources/properties/i18n/i18n.xml.Onytrouveraparexemple: classpath:properties/i18n/bundles/Custom classpath:properties/i18n/bundles/Messages classpath:properties/i18n/bundles/Commons 2 DéclarationetutilisationdesentréesExerciceN°14: DéclarationetutilisationdesentréesAdapterlavuetaskManager.xhtmlprécédementcréedemanièreàceq uetousleslibellésdel'interfacesoientexternalisésetnonplusen"durs»danslespagesJSP.2.1 Déclaration2.1.1 ViaunéditeurdetexteParexemplenousallonsajouterparexemplel'entréeTASK.MANAGER.NOTASKSdanslefichierbundles/Messages_fr.properties.TASK.MANAGER.NOTASKS = La liste de t\u00E2che est vide 2.1.2 ViaResourceBundleEditordanseclipseEditerbundles/Messages_fr.propertiesavecresourceBundleEditor8 Cliquedroitsurlefichier>openwith...>éditeurdereourceBundle

FormationEsup-CommonsV2-ManipulationsPage50sur1012.2 Utilisation2.2.1 DucôtédelavueDanssrc/main/webapps/stylesheets/taskManager.xhtmlondéclareralesclésdetraductiondelamanièresuivante:Contenus>Langues>Choisir...Tester2.2.2 DucôtéducodeJavaEssayermaintenantd'envoyerdirectementunechainetraduitedepuislecontrôleurpublic String getChaineTraduite(){ return getString("TASK.MANAGER.NOTASKS"); } Et

FormationEsup-CommonsV2-ManipulationsPage51sur1014 DéfinitiondeslangagesExerciceN°16: Ajoutd'unlangageAjouterlelangagejaponaisettraduiretoutel'applicationJ.L'ajoutd'unlangagesefaitdanslefichierdeconfigurationsrc/main/webapps/WEB-INF/jsf/faces-config.xml.Ilsuffitensuited'écrirelebundlecorrespondant.5 Lesmessagesd'erreurpardéfautdeJSFDanssrc/main/webapps/WEB-INF/jsf/faces-config.xmlonremarqueproperties.i18n.bundles.JsfMessages ...qu iindiqueq uelesmessagesutilisés parJFacessontdéclarésdansproperties/i18n/bundles/JsfMessages. Onnoteradansl'exempleci-après,l'usagedupassagedevariables.

FormationEsup-CommonsV2-ManipulationsPage52sur101 Formulaires et Validation & Guidedud éveloppe ur>Priseenmain>JSF>Ecriture desfor mulaireshttp://www.esup-portail.org/x/tQAABg1 FormulairesetbindingExerciceN°17: Créationd'unformulairedesaisiesimpleNousallonsajouterunformulairedesaisied'unenouvelletâche.Lesdonnéessaisiesàtraversleformulairevontêtrebindéessurunobjet.Dansorg. supportail.formation.w b.controll rs.Taskontroll rajouterunepropriétécurrentTaskdetypeTaskainsiquelesaccesseurscorrespondants. private Task currentTask=null; [...] public Task getCurrentTask() { return currentTask; } public void setCurrentTask(Task currentTask) { this.currentTask = currentTask; } Nousallons d'abordcréerunformula iresimplequiper metlasai siedutitre(obligatoire),deladescriptionetducaractèrepublicounondelatâche.CréerdeformulairedanstaskManager.xhtml.Onferaafficherlesmessagesd'erreurcorrespondantàchaquechamp.

FormationEsup-CommonsV2-ManipulationsPage53sur101 ! RécupérerlefichiertaskManager.xhtml-exo17EnfindansTaskontroll rajouterlaméthodeaddTask()appeléeàlavalidationd uformulaireetquiajoutelatâchesaisieenbasededonnées:public void addTask() { getDomainService().addTask(currentTask); currentTask=new Task(); sortedTasks = getDomainService().getTasks(); } Surlemoduleweb-jsf-servletmvn install jetty:run Testerleformulaireetl'affichagedeserreursdesaisie.2 LesconvertisseursJSFproposedesconvertisseu rspardéfaut( DateTimeConverteretNumberConverter).Ceux-cipermettentdetransformerunedateouunnombresuivantdifférentesrègles.ExerciceN°18: Utilisationd'unconvertisseurprédéfiniAjouterlechampdesai siedel adateetconvertircetypecomplexegrâ ceauconvertisseurDateTimefourniparJSFquitransformeraladatesaisieenobjetDate. Testerleformulaireetl'affichagedeserreursdesaisie.Notezquesivoussouhaiterchangerleformatdesaisieilfaudraégalementallerchangerlemessaged'erreurcorrespondantdansbundles/JsfMessages_fr.propertiesjavax.faces.convert.DateTimeConverter.CONVERSION = Veuillez saisir les dates sous la forme jjmmaaaa. javax.faces.convert.DateTimeConverter.CONVERSION_detail = "{1}": Conversion en Date impossible, Veuillez saisir sous la forme jjmmaaaa.

FormationEsup-CommonsV2-ManipulationsPage54sur101Danscertainscas,ilestaussinécessairededéfinirdesconvertisseursmanuellement.C'estnotammentlecaspourleslistesdéroulantes.ExerciceN°19: Créationd'unconvertisseurAjouterunelistedéroulantepourlechoixdel'utilisateurpropriétairedelatâche.Lalisteproposeral'ensembledesUsersenbasededonnées.Onsouhaitemapperdirectementl 'utilisateurquiserasél ectionnéavec lapropriétéownerdubeantaskmappéauformulaire.D'oùlanécessitéd'unconvertisseurquipourunloginfournileUsercorrespondantenbaseetpourunUserlelogincorrespondantPourcela,ajouterunélémentdansleformulaire. AjouterlaméthodegetUserItems()quipermetderécupérerl'ensembledesutilisateursenbasedansTaskontroll rpublic List getUserItems() { List les_users= getDomainService().getUsers(); ArrayList userItems = new ArrayList(); for (User user : les_users) { if (user.getDisplayName() !=null) userItems.add(new SelectItem(user, user.getDisplayName()+"("+user.getLogin()+")")); else userItems.add(new SelectItem(user, "Inconnu ("+user.getLogin()+")")); } return userItems; } Dansorg. supportail.formation.w b.conv rt rsécrireuneclasseUs ronv rt r.Elledevraimplémenterl'interfacejavax.fac s.conv rt.onv rt retnotammen tlesméthodesgetAsObject()etgetAsString(). package org.esupportail.formation.web.converters; [...] public class UserConverter implements Converter,InitializingBean { DomainService domainService; [...] @Override public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) throws ConverterException { User u=domainService.getUser(arg2); return u; } @Override public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) throws ConverterException { if (arg2!=null && (arg2 instanceof User)) return ((User)arg2).getLogin(); else return null; } [...] }

FormationEsup-CommonsV2-ManipulationsPage55sur101Onsouhaiteallerrechercherl'objetUs renbasededonnées.Onn'utiliseralaméthodegetUser()de

omainS rvic quel'oninjecteravialadéclarationdesbeansSpring.Déclarerceconvertisseurdansconverters.xml. A converter for User. Testerleformulaire.3 LesvalidateursExerciceN°20: Validationdesc ampsgrâceàunvalidateurTesterlatailleduchamptitregrâceàunvalidateurprédéfini.AjouterlevalidateurdanstaskManager.xhtml Testerleformulaireetl'affichagedeserreursdesaisie.Fairel'équivalentavecunquotesdbs_dbs9.pdfusesText_15