22. Conclusion
Rappelons ce que nous avons fait dans ce document. Nous avons étudié deux couches [DAO] avec l'une des deux architectures suivantes :
![]() |
![]() |
La couche [DAO1] a été implémentée avec Spring JDBC et la couche [DAO2] avec Spring JPA. Les couches [DAO1] et [DAO2] implémentaient la même interface [IDAO] ce qui a permis d'écrire un test unique [JUnitTestDao] pour tester les deux couches [DAO] ;
Ceci fait, nous avons exposé l'interface [IDAO] sur le web de la façon suivante :
![]() |
- en [1], la couche [IDAO] a été exposée sur le web au travers d'une couche web [2] implémentée par Spring MVC. C'est bien l'interface [IDAO] qui est exposée et nous avons construit deux versions du service web selon que cette interface est implémentée avec une architecture [DAO-JDBC] ou [DAO-JPA-JDBC] ;
- en [B], un client distant utilise les URL exposées par le service web et qui donnent accès aux méthodes de la couche [IDAO-serveur]. On a fait en sorte que la couche [DAO-Client] [3] implémente l'interface [IDAO-serveur] [1]. Ceci nous a permis d'utiliser le même test [JUnitTestDao] déjà utilisé deux fois ;
- en [3], la couche [DAO-client] a été implémentée avec Spring RestTemplate ;
Ceci fait, nous avons sécurisé l'accès au service web :
![]() |
- en [5], la requête HTTP du client traverse une couche d'authentification implémentée avec Spring Security ;
Ceci fait, nous avons fait évoluer l'architecture précédente vers la suivante :
![]() |
- en [3], l'application client est elle-même une application web délivrée par le serveur web [4]. L'application cliente présente dans le navigateur un formulaire [5] permettant d'interroger les URL du service web sécurisé. Les accès HTTP au service web sécurisé se font grâce à une couche [jS] implémentée en Javascript. Cette architecture met en oeuvre ce qu'on appelle des requêtes inter-domaines :
- le service web présente des URL de la forme [http://machine1:port1/] ;
- l'application web cliente est téléchargée à partir d'une URL [http://machine2:port2/]. Si [http://machine2:port2/] n'est pas identique à [http://machine1:port1/] (même machine, même port), alors le navigateur client bloquera les appels HTTP de la couche [DAO-client-js]. Pour remédier à ce problème, le service web doit autoriser les requêtes inter-domaines ;
Les projets présentés ont été testés avec les six bases de données suivantes :
- MySQL 5 Community Edition ;
- SQL Server 2014 Express ;
- PostgreSQL 9.4 ;
- Oracle Express 11g release 2 ;
- IBM DB2 Express-C 10.5 ;
- Firebird 2.5.4 ;
Pour chacun de ces SGBD, on a développé quatre couches [DAO] différentes :
- une couche implémentée avec Spring JDBC ;
- une couche implémentée avec Spring JPA et le fournisseur JPA Hibernate ;
- une couche implémentée avec Spring JPA et le fournisseur JPA EclipseLink ;
- une couche implémentée avec Spring JPA et le fournisseur JPA OpenJPA ;
C'est donc un ensemble de vingt-quatre configuration différentes qui a été présenté. On a fait un grand effort de factorisation :
- l'essentiel du code n'est écrit qu'une fois. Il repose sur deux projets Maven de configuration :
- l'un configure la couche JDBC ;
- l'autre configure la couche JPA ;
![]() |
![]() |
Le projet Maven de configuration de la couche JDBC [1] d'un SGBD particulier permet :
- d'importer l'archive du pilote JDBC ;
- de définir les identifiants d'accès à la base de données utilisée et les différents ordres SQL que la couche [DAO1] va émettre vers le pilote JDBC. Bien que SQL soit standardisé, on a rencontré des problèmes de portabilité essentiellement à cause de la présence dans les requêtes de noms de tables / colonnes qui se sont révélés être des mots clés interdits dans certains SGBD (table ROLES pour DB2, colonne PASSWORD pour Firebird). Par ailleurs, bien qu'un nom de colonne soit normalement insensible à la casse (majuscules / minuscules), on a rencontré un problème avec PostgreSQL avec la colonne ID de la clé primaire des tables. Il a voulu qu'elle s'appelle id en minuscules ;
Les trois projet Maven de configuration de la couche JPA [2] d'un SGBD particulier permettent :
- d'importer l'archive de l'implémentation JPA ;
- de configurer l'implémentation JPA utilisée pour le SGBD particulier connecté. En effet, c'est la couche JPA qui émet les ordres SQL vers la couche JDBC. Pour être efficace, elle doit connaître le SGBD afin de lui envoyer les ordres SQL qu'il reconnaîtra. Ces ordres pourront utiliser le SQL propriétaire de ce SGBD ainsi que les caractéristiques particulières de celui-ci (types de données, séquences, triggers, procédures, génération automatique de clés primaires, ...) ;
On a ainsi créé vingt-quatre projets (4 configurations x 6 SGBD) Maven de configuration sur lesquels ont reposé tous les autres projets d'exploitation de la base de données. Dans les schémas ci-dessus, les couches [DAO1] et [DAO2] offrant la même interface, les 24 configurations des deux architectures ci-dessus ont été testées avec l'unique classe de test [JUnitTestDao]. Une fois ces architectures vérifiées, il n'y a plus eu de difficultés :
- le projet Maven de publication de la base de données sur le web repose sur ces deux architectures. Il y a donc là également 24 configurations possibles ;
- le projet Maven de sécurisation de l'accès au service web s'appuie sur le projet précédent et a lui également 24 configurations possibles ;
- enfin le projet Maven permettant les requêtes inter-domaines au service web sécurisé s'appuie sur le projet précédent et a lui également 24 configurations possibles ;
Bien que ne scannant pas toutes les capacités du langage Java ni tous ses domaines d'application, ce document peut être utilisé comme document d'apprentissage du langage. Le lecteur ayant assimilé le contenu de ce cours aura atteint un niveau " Java avancé " aussi bien dans l'utilisation du langage que dans celui du framework Spring. Il pourra alors poursuivre sa formation Java avec les ouvrages suivants :
- [Spring MVC et Thymeleaf par l'exemple] [http://tahe.developpez.com/java/springmvc-thymeleaf] qui poursuit l'apprentissage de l'écosystème Spring en présentant sa branche 'programmation web MVC'. Il utilise une base de données plus complexe que celle étudiée ici ;
- [Tutoriel AngularJS / Spring MVC] [http://tahe.developpez.com/angularjs-spring4] qui présente une architecture web client / serveur, où le client est implémenté avec le framework [AngularJS] et le serveur avec [Spring MVC] ;
- [Introduction à Java EE] [http://tahe.developpez.com/java/javaee] qui quitte le monde Spring pour une architecture web basée sur JSF (Java Server Faces) et les EJB (Enterprise Java Bean) ;
- [Introduction à la programmation des tablettes Android] [http://tahe.developpez.com/android/exemples-intellij-aa] qui décrit une architecture client / serveur, où le client est une tablette Android programmée en Java et le serveur un service web implémenté par Spring MVC ;






