Skip to content

22. Conclusie

Laten we nog eens samenvatten wat we in dit document hebben gedaan. We hebben twee lagen [DAO] onderzocht met een van de volgende twee architecturen:

De laag [DAO1] is geïmplementeerd met Spring JDBC en de laag [DAO2] met Spring JPA. De lagen [DAO1] en [DAO2] implementeerden dezelfde interface [IDAO], waardoor het mogelijk was oméén enkele test [JUnitTestDao] te schrijven om beide lagen [DAO] te testen;

Toen dit eenmaal was gebeurd, hebben we de interface [IDAO] op de volgende manier op het web beschikbaar gesteld:

  • in [1] is de laag [IDAO] op het web beschikbaar gesteld via een weblaag [2], geïmplementeerd door Spring MVC. Het is inderdaad de interface [IDAO] die beschikbaar wordt gesteld en we hebben twee versies van de webservice gebouwd, afhankelijk van of deze interface is geïmplementeerd met een [DAO-JDBC]- of een [DAO-JPA-JDBC]-architectuur;
  • in [B] maakt een externe client gebruik van de URL die door de webservice worden blootgesteld en die toegang geven tot de methoden van de laag [IDAO-serveur]. We hebben ervoor gezorgd dat de laag [DAO-Client] [3] de interface [IDAO-serveur] [1] implementeert. Hierdoor konden we dezelfde test [JUnitTestDao] gebruiken die al twee keer was gebruikt;
  • in [3] is de laag [DAO-client] geïmplementeerd met Spring RestTemplate;

Toen dit eenmaal was gebeurd, hebben we de toegang tot de webservice beveiligd:

  • in [5] doorloopt het verzoek HTTP van de klant een authenticatielaag die is geïmplementeerd met Spring Security;

Hiermee hebben we de vorige architectuur verder ontwikkeld tot de volgende:

  • in [3] is de clienttoepassing zelf een webtoepassing die wordt geleverd door de webserver [4]. De clienttoepassing toont in de browser een formulier [5] waarmee de URL van de beveiligde webservice kunnen worden opgevraagd. De HTTP-toegangen tot de beveiligde webservice vinden plaats via een in JavaScript geïmplementeerde [jS]-laag. Deze architectuur maakt gebruik van zogenaamde cross-domain-verzoeken:
    • de webservice presenteert URL in de vorm [http://machine1:port1/];
    • de client-webapplicatie wordt gedownload vanaf een URL [http://machine2:port2/]. Als [http://machine2:port2/] niet identiek is aan [http://machine1:port1/] (dezelfde machine, dezelfde poort), dan zal de clientbrowser de HTTP-aanroepen vanuit de [DAO-client-js]-laag blokkeren. Om dit probleem op te lossen, moet de webservice verzoeken tussen domeinen toestaan;

De gepresenteerde projecten zijn getest met de volgende zes databases:

  • 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;

Voor elk van deze SGBD zijn vier verschillende [DAO]-lagen ontwikkeld:

  • een laag geïmplementeerd met Spring JDBC;
  • een laag geïmplementeerd met Spring JPA en de Hibernate-provider JPA;
  • een laag geïmplementeerd met Spring JPA en de provider JPA EclipseLink;
  • een laag geïmplementeerd met Spring JPA en de provider JPA OpenJPA;

Er is dus een reeks van vierentwintig verschillende configuraties gepresenteerd. Er is veel aandacht besteed aan factorisatie:

  • het grootste deel van de code is slechts één keer geschreven. Het is gebaseerd op twee Maven-configuratieprojecten:
    • het ene configureert de laag JDBC;
    • de andere configureert de laag JPA;

Het Maven-configuratieproject voor de laag JDBC [1] van een specifieke SGBD maakt het mogelijk om:

  • het importeren van het stuurprogramma-archief JDBC;
  • de toegangsgegevens voor de gebruikte database en de verschillende SQL-opdrachten te definiëren die de [DAO1]-laag naar de JDBC-driver zal verzenden. Hoewel SQL gestandaardiseerd is, zijn er portabiliteitsproblemen opgetreden, voornamelijk vanwege de aanwezigheid in de query's van tabel- en kolomnamen die in bepaalde SGBD-databases verboden sleutelwoorden bleken te zijn (tabel ROLES voor DB2, kolom PASSWORD voor Firebird). Bovendien, hoewel een kolomnaam normaal gesproken hoofdlettergevoelig is (hoofdletters/kleine letters), is er een probleem opgetreden met PostgreSQL met betrekking tot de kolom ID van de primaire sleutel van de tabellen. Het systeem wilde dat deze kolom id in kleine letters heette;

De drie Maven-configuratieprojecten van de laag JPA [2] van een specifieke SGBD maken het mogelijk om:

  • het importeren van het archief van de implementatie JPA;
  • de implementatie JPA te configureren die wordt gebruikt voor de specifieke, aangesloten SGBD. Het is namelijk de JPA-laag die de SQL-opdrachten naar de JDBC-laag verzendt. Om effectief te zijn, moet deze laag de SGBD kennen om de SQL-opdrachten naar hem te kunnen sturen die hij zal herkennen. Deze opdrachten kunnen gebruikmaken van de SQL, de eigenaar van deze SGBD, evenals van de specifieke kenmerken daarvan (datatypes, sequenties, triggers, procedures, automatische generatie van primaire sleutels, ...);

Zo zijn er vierentwintig Maven-configuratieprojecten (4 configuraties x 6 SGBD) gecreëerd, waarop alle andere projecten voor het gebruik van de database zijn gebaseerd. Aangezien de lagen [DAO1] en [DAO2] in de bovenstaande schema’s dezelfde interface bieden, zijn de 24 configuraties van de twee bovengenoemde architecturen getest met de enige testklasse [JUnitTestDao]. Nadat deze architecturen waren gecontroleerd, waren er geen problemen meer:

  • het Maven-project voor het publiceren van de database op het web is gebaseerd op deze twee architecturen. Er zijn dus ook hier 24 mogelijke configuraties;
  • het Maven-project voor het beveiligen van de toegang tot de webservice bouwt voort op het vorige project en kent eveneens 24 mogelijke configuraties;
  • ten slotte is het Maven-project dat verzoeken tussen domeinen naar de beveiligde webservice mogelijk maakt, gebaseerd op het vorige project en kent eveneens 24 mogelijke configuraties;

Hoewel dit document niet alle mogelijkheden van de Java-taal noch alle toepassingsgebieden ervan behandelt, kan het worden gebruikt als leermateriaal voor de taal. De lezer die de inhoud van deze cursus onder de knie heeft, zal een „gevorderd Java”-niveau hebben bereikt, zowel wat betreft het gebruik van de taal als dat van het Spring-framework. Hij of zij kan dan zijn of haar Java-opleiding voortzetten met de volgende boeken:

  • [Spring MVC et Thymeleaf par l'exemple] [http://tahe.developpez.com/java/springmvc-thymeleaf], dat de verdere verdieping in het Spring-ecosysteem voortzet door de tak ‘webprogrammering MVC’ te behandelen. Hierin wordt gebruikgemaakt van een complexere database dan die welke hier is bestudeerd;
  • [Tutoriel AngularJS / Spring MVC] [http://tahe.developpez.com/angularjs-spring4], waarin een client/server-webarchitectuur wordt gepresenteerd, waarbij de client is geïmplementeerd met het framework [AngularJS] en de server met [Spring MVC];
  • [Introduction à Java EE] [http://tahe.developpez.com/java/javaee], dat de Spring-omgeving verlaat ten gunste van een webarchitectuur op basis van JSF (Java Server Faces) en EJB (Enterprise Java Bean);
  • [Introduction à la programmation des tablettes Android] [http://tahe.developpez.com/android/exemples-intellij-aa], waarin een client/server-architectuur wordt beschreven, waarbij de client een in Java geprogrammeerde Android-tablet is en de server een webservice die is geïmplementeerd met Spring MVC;