Vous êtes sur la page 1sur 5

Chapitre 6.

L'intgrationdesapplicationsWebaveclacouchedepersistance
Ceciestlapartie6d'uncomptetapepartape,commentdvelopperuneapplicationwebpartirdezroenutilisantleframework Spring. Dans la partie 1 ,nousavonsconfigurl'environnementetmettreenplaceuneapplicationdebase. Dans la partie 2 nous avons raffinl'applicationquenousallonsbtir. Partie 3 ajouttoutelalogiqued'affairesetlestestsunitaireset la partie 4 dveloppl'interface web. Dans la partie 5 ,nousavonsdvelopplacouchedepersistance. Ilestmaintenanttempsd'intgrertoutceladansuneapplication webcomplte.

6.1. Modifier couche de service


Sinousavonsstructurnotreapplicationcorrectement,nousnedevraitavoirmodifierlesclassescouchedeservicepourprofiterdela persistancedebasesdedonnes. Lesclassesdevueetlecontrleurnedoitpastremodifi,carilsdoiventtreaucourantd'aucun dtailsd'implmentationdelacouchedeservice. Ajoutons donc la persistance de la mise en uvre Productmanager. Nous modifions le SimpleProductManager etajouterunerfrenceuneinterface ProductDao plusunemthodesetterpourcetterfrence. Quelle mise en uvrequenousutilisonsrellementicidevraittresansrapportaveclaclasseProductmanager,etnousallonsdfinircetraversune option de configuration. Nousavonsaussichangerlamthode setProducts unemthode setProductDao donc nous pouvons injecter une instance de la classe de DAO. Lamthode getProducts vamaintenantutiliserleDAOpourrcuprerunelistedeproduits. Enfin, la mthode increasePrices aurezmaintenantlalistedesproduitsetpuisaprsleprixataugmentleproduitserastockdanslabase dedonnesenutilisantlamthode saveProduct sur le DAO. Springapp / src / springapp / service / SimpleProductManager.java:

sia.rcfftjat.slmrtnlmrtnpnpda.oc SpPdtnepl cssia.rcPdtnepvaa {jat.sioao sia.mnru lmrtnlmrtnpnprotyruD ; pnpsveoa;a.iLt'pti,'pti sia.mnru;ilruMarui lspnpsverumarracg ;a.iLtmrtn pnpda.oc 'pti,'pti sia.pirPdto rgpei ri vuli ioao ioao rgpoiPdt meocag bc a rgpei ocag ipke vuli pti; rgpoiPdt ioao ioao rgpeso.oca SpPdtnepl csPdtne ilruMarui lsrumar meocag bc a ocag 6.2. Fixerlestestsenchec
Nousavonsrcrit l'SimpleProductManager etmaintenantlestestsserontbiensrd'chouer. Nous avons besoin de fournir les Productmanager avec une mise en uvreenmmoirede l'ProductDao. Nousnevoulonspasvraimentd'utiliserlerelDAOicicarnous aimerionsviterd'avoiraccderunebasededonnespournostestsunitaires. Nousallonsajouteruneclasseinterneappele InMemoryProductDao qui tiendra sur une liste fournie des produits PF dans le constructeur. Cetteclasseenmmoiredoittreadopteen lorsquenouscronsunenouvelle SimpleProductManager. Springapp / test / springapp / repository / InMemoryProductDao.java:

springapp.repository emballage; java.util.List importation; l'importation springapp.domain.Product; public class InMemoryProductDao uvre ProductDao { Listeprive<Product>productList publique InMemoryProductDao (Liste <Product> productList) { this.productList = productList; } Liste publique <Product> getProductList () { retour productList; } saveProduct public void (produit prod) { } }
Et voici le SimpleProductManagerTests misejour: Springapp / test / springapp / service / SimpleProductManagerTests.java:

springapp.service paquet; l'importation java.util.ArrayList; java.util.List importation; springapp.domain.Product l'importation,


Nous avons aussi besoin de modifier le InventoryControllerTests depuiscetteclasseutilisegalementle SimpleProductManager. Voici la InventoryControllerTests misejour: Springapp / test / springapp / service / InventoryControllerTests.java:

forfait springapp.web; import java.util.Map; org.springframework.web.servlet.ModelAndView importation;

6.3. Crercontextedel'applicationdenouvellespourlaconfigurationdelacouchedeservice
Nousavonsvuquec'taitassezfaciledemodifierlacouchedeserviceutiliserlapersistancebasededonnes. Ce fut parce qu'il est

dcoupldelacoucheWeb. Ilestmaintenanttempsdedcoupleroulaconfigurationdelacouchedeservicedelacoucheweb. Nous allons supprimer la configuration Productmanager et la liste des produits du fichier de configuration springapp-servlet.xml. C'est ce que ce fichier ressemble maintenant: Springapp / war / WEB-INF / springapp-servlet.xml:

<Fvesxmlns="http://www.springframework.org/schema/beans"xmlns<xmlversion="1.0"encoding="UTF
Nous avons encore besoin de configurer la couche de service et nous ferons que dans son dossier de candidature propre contexte. Ce fichierestappelapplicationContext.xml etilserachargviauncouteurdeservletquenousallonsdfinirdansweb.xml. Tous les haricotsconfigurdanscecontextenouvelleapplicationseradisponiblepourfairerfrencepartirden'importequelcontextedeservlet. Springapp / war / WEB-INF / web.xml:

<? Xml version = "1.0" encoding = "UTF-8"?> <Web-app version = "2.4" xmlns = "http://java.sun.com/xml/ns/j2ee" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd ">

<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </ listener-cas ls> </ Listener> <servlet> <servlet-name> springapp </ servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </ servlet-class> <load-on-startup> 1 </ load-on-startup> </ Servlet> <servlet-mapping> <servlet-name> springapp </ servlet-name> <url-pattern> *. htm </ url-pattern> </ Servlet-mapping> <welcome-file-list> <welcome-file> index.jsp </ Welcome-file> </ Welcome-file-list> <jsp-config> <taglib> <taglib-uri> / printemps </ taglib-uri> <taglib-location> / WEB-INF/tld/spring-form.tld </ taglib-location> </ Taglib> </ Jsp-config> </ Web-app>
Maintenantnousallonscrerunnouveau"applicationContext.xml" fichier dans le "war / WEB-INF"rpertoire. Springapp / war / WEB-INF / applicationContext.xml:

<? Xml version = "1.0" encoding = "UTF-8"?> <Fvesxmlns="http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: AOP = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd "> <! - Ladfinitioncontexteparentdemandel'applicationspringapp-> <bean id="productManager" class="springapp.service.SimpleProductManager"> <property name="productDao" ref="productDao"/> </ Bean> <bean id="productDao" class="springapp.repository.JdbcProductDao"> <property name="dataSource" ref="dataSource"/>

<property name="dataSource" ref="dataSource"/> </ Bean> </ Beans>

6.4. Ajouter de transaction et de configuration du pool de connexion au contexte d'application


Chaquefoisquevouspersistezdansunebasededonnesdesonmieuxpourutiliserlestransactionsafindes'assurerquetoutesvos misesjoursonteffectuerouaucunn'esttermin. Vousvoulezviterd'avoirlamoitidevotremisejourpersisttandisquel'autre moitiachou. Printempsoffreunevastegammed'optionspourlafaondefournirlagestiondestransactions. Lemanuelderfrence couvre cette profondeur dans. Ici, nous allons faire usage d'un moyen de fournir cette aide AOP (Aspect Oriented Programming) sous la formed'unavisdetransactionetunepointcutApectJdedfinirolesoprationsdoiventtreappliques. Sivoustesintress commentcelafonctionnedansplusdeprofondeur,jetezunoeilsurlemanuelderfrence. Nous utilisons le soutien nouvel espace de noms introduits dans Spring 2.0. Le"AOP"et"TX"namespaceseffectuezlesentresdeconfigurationbeaucoupplusconcisparrapport lamaniretraditionnelleenutilisantrgulirement"<bean>"entres.

<eni=tascinaae"cas"r.pigrmwr.dcdtsuc.aaorernatoMngr><rprynm=dtSuc"rf"aaore/ < ba><o:ofg <o:cnele pitu = ba d"rnatoMngr ls=ogsrnfaeokjb.aaoreDtSucTascinaae" poet ae"aaore e=dtSuc"> / en apcni> ap osilr onct
Lepointdecoupures'appliquetoutemthodeappelesurl'interfaceProductmanager. Le conseil est un conseil transaction qui s'appliqueauxmthodesavecunnomcommenantparsauver. Lesattributsdetransactionpardfautd'REQUISs'appliquepuisque aucunautreattributatspcifi. Leconseils'appliqueaussi"lectureseule"transactionssurtouteslesautresmthodesquisont informsvialepointdecoupure. Nousavonsgalementbesoindedfinirunpooldeconnexion. Nous utilisons le pool de connexion DBCP du projet Apache Jakarta. Nous rutilisonslefichier'jdbc.properties nousavonscrdanslapartie5.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </ Bean> <Haricots id = "propertyConfigurer" class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <valeur> classpath: jdbc.properties </ valeur> </ List> </ Property> </ Bean>
Pourquetoutcelafonctionne,nousdevonscertainsfichiersjarsupplmentairescopisurle "WEB-INF/lib"rpertoire. Aspectjweaver.jarCopierdanslerpertoire 'spring-framework-2.5/lib/aspectj et commons-dbcp.jar e t commons-pool.jar du rpertoire'spring-framework-2.5/lib/jakarta-commons'l'springapp'/war/WEB-INF / lib '. Voici la version finale de notre applicationContext.xml 'fichier: Springapp / war / WEB-INF / applicationContext.xml:

<Fvesxmlns="http://www.springframework.org/schema/beans"xmlns<xmlversion="1.0"encoding="UTF 6.5. Testfinaldelademandecomplte


Maintenant, il est enfin temps de voir si tous ces morceaux vont travailler ensemble. Construireetdployervotreapplicationtermineet souvenez-vousd'avoirlabasededonnesoprationnelle. C'estcequevousdevriezvoirquandpointantlenavigateurwebl'application aprsqu'elleaitrecharg:

Lademandedmentremplie

Regardejustelesmmesquel'ontfaitavant. Nousn'avonsajouterlapersistance,doncsivousarrtezl'applicationdeshaussesdeprix de votre ne sera pas perdu. Ilssonttoujourslquandvousdmarrezl'applicationsauvegarder. Beaucoupdetravailpouruneapplicationtrssimple,maisiln'ajamaistnotrebutdesimplementcrirecetteapplication. Lebuttait demontrercomments'yprendrepourcreruneapplicationSpringMVCpartirdezroetnoussavonsquelesapplicationsquevous crezsontbeaucouppluscomplexes. Lesmmestapess'appliquentsi,etnousespronsquevousavezacquissuffisammentde connaissances pour faciliter la mise en route d'utiliser Spring.

6.6. Rsum
Nousavonstermintouteslestroiscouchesdel'application- la couche Web, la couche de service et de la couche de persistance. Dans cettedernirepartie,nousreconfigurl'application.
l

D'abordnousavonsmodifilacouchedeserviceutiliserleProductDao. NousavonsensuiteeucorrigercertainsservicesdfaillantsettestsdecoucheWeb. Ensuite,nousaintroduitunenouvelleapplicationContextdesparerleserviceetlaconfigurationcouchedepersistancedela configuration de la couche Web. Nousavonsgalementdfiniunecertainegestiondestransactionspourlacouchedeserviceetconfigurunpooldeconnexionpour lesconnexionslabase. Enfin,nousavonsconstruitl'applicationreconfigurettestqu'iltravaillaitencore.

Ci-dessousestunecaptured'crandecequelastructuredevotrerpertoiredeprojetdevraitressembleraprsavoirsuiviles instructions ci-dessus.

Prcdente

Accueil
ParrainparSpringSource

Suivant

Chapitre 5. Persistancebasededonnesmiseen uvre

Annexe A. scripts de construction