22. Wnioski
Podsumujmy, co zrobiliśmy w tym dokumencie. Przeanalizowaliśmy dwie warstwy [DAO] z jedną z dwóch następujących architektur:
![]() |
![]() |
Warstwa [DAO1] została zaimplementowana przy użyciu Spring JDBC, a warstwa [DAO2] przy użyciu Spring JPA. Warstwy [DAO1] i [DAO2] implementowały ten sam interfejs [IDAO], co pozwoliło nanapisać jeden test [JUnitTestDao] do sprawdzania obu warstw [DAO];
Po wykonaniu tych czynności udostępniliśmy interfejs [IDAO] w sieci w następujący sposób:
![]() |
- w [1], warstwa [IDAO] została udostępniona w sieci poprzez warstwę internetową [2] zaimplementowaną przez Spring MVC. To właśnie interfejs [IDAO] jest udostępniony, a my stworzyliśmy dwie wersje usługi internetowej w zależności od tego, czy interfejs ten jest zaimplementowany w architekturze [DAO-JDBC], czy [DAO-JPA-JDBC];
- w przypadku [B] klient zdalny korzysta z interfejsów URL udostępnianych przez usługę internetową, które zapewniają dostęp do metod warstwy [IDAO-serveur]. Zadbaliśmy o to, aby warstwa [DAO-Client] [3] implementowała interfejs [IDAO-serveur] [1]. Dzięki temu mogliśmy wykorzystać ten sam test [JUnitTestDao], który został już dwukrotnie użyty;
- w [3] warstwa [DAO-client] została zaimplementowana przy użyciu Springa RestTemplate;
Po wykonaniu tych czynności zabezpieczyliśmy dostęp do serwisu internetowego:
![]() |
- w [5] żądanie klienta HTTP przechodzi przez warstwę uwierzytelniania zaimplementowaną przy użyciu Spring Security;
W ten sposób przekształciliśmy poprzednią architekturę w następującą:
![]() |
- w [3] aplikacja kliencka jest sama w sobie aplikacją internetową dostarczaną przez serwer internetowy [4]. Aplikacja kliencka wyświetla w przeglądarce formularz [5], umożliwiający wysyłanie zapytań do URL zabezpieczonej usługi internetowej. Dostęp do zabezpieczonej usługi internetowej odbywa się za pośrednictwem warstwy [jS] zaimplementowanej w języku JavaScript. Architektura ta wykorzystuje tzw. żądania międzydomenowe:
- serwis internetowy udostępnia URL w postaci [http://machine1:port1/];
- aplikacja kliencka jest pobierana z serwera o adresie URL [http://machine2:port2/]. Jeśli [http://machine2:port2/] nie jest identyczny z [http://machine1:port1/] (ta sama maszyna, ten sam port), wówczas przeglądarka klienta zablokuje wywołania HTTP z warstwy [DAO-client-js]. Aby rozwiązać ten problem, usługa internetowa musi zezwolić na żądania międzydomenowe;
Przedstawione projekty zostały przetestowane z wykorzystaniem następujących sześciu baz danych:
- MySQL 5 Community Edition;
- SQL Server 2014 Express;
- PostgreSQL 9.4;
- Oracle Express 11g wersja 2;
- IBM DB2 Express-C 10.5;
- Firebird 2.5.4;
Dla każdego z tych SGBD opracowano cztery różne warstwy [DAO]:
- warstwę zaimplementowaną przy użyciu Springa JDBC;
- warstwa zaimplementowana przy użyciu Spring JPA oraz dostawcy JPA Hibernate;
- warstwa zaimplementowana przy użyciu Springa JPA oraz dostawcy JPA EclipseLink;
- warstwa zaimplementowana przy użyciu Springa JPA oraz dostawcy JPA i OpenJPA;
Przedstawiono zatem zestaw dwudziestu czterech różnych konfiguracji. Dołożono dużych starań, aby zoptymalizować kod:
- większość kodu została napisana tylko raz. Opiera się on na dwóch projektach konfiguracyjnych Maven:
- jeden konfiguruje warstwę JDBC;
- drugi konfiguruje warstwę JPA;
![]() |
![]() |
Projekt konfiguracyjny Maven dla warstwy JDBC [1] konkretnego SGBD umożliwia:
- import archiwum sterownika JDBC;
- zdefiniowanie identyfikatorów dostępu do wykorzystywanej bazy danych oraz różnych poleceń SQL, które warstwa [DAO1] będzie wysyłać do sterownika JDBC. Mimo że SQL jest standaryzowany, napotkano problemy z przenoszalnością, głównie z powodu obecności w zapytaniach nazw tabel/kolumn, które okazały się być słowami kluczowymi zabronionymi w niektórych SGBD (tabela ROLES dla DB2, kolumna PASSWORD dla Firebird). Ponadto, mimo że nazwa kolumny zazwyczaj nie rozróżnia wielkości liter (wielkie/małe), napotkano problem z PostgreSQL w odniesieniu do kolumny ID klucza głównego tabel. System wymagał, aby kolumna ta nosiła nazwę id, pisana małymi literami;
Trzy projekty Maven konfigurujące warstwę JPA, [2] oraz konkretny projekt SGBD umożliwiają:
- import archiwum implementacji JPA;
- skonfigurowanie implementacji JPA wykorzystywanej dla konkretnego podłączonego SGBD. W rzeczywistości to warstwa JPA wysyła polecenia SQL do warstwy JDBC. Aby działać skutecznie, musi ona znać SGBD, aby móc wysłać do niego polecenia SQL, które ten rozpozna. Polecenia te będą mogły wykorzystywać SQL, będący właścicielem tego SGBD, a także jego szczególne cechy (typy danych, sekwencje, wyzwalacze, procedury, automatyczne generowanie kluczy głównych itp.);
W ten sposób utworzono dwadzieścia cztery projekty (4 konfiguracje × 6 SGBD) konfiguracyjne Maven, na których opierały się wszystkie pozostałe projekty związane z obsługą bazy danych. W powyższych schematach warstwy [DAO1] i [DAO2] oferują ten sam interfejs, dlatego 24 konfiguracje obu powyższych architektur zostały przetestowane przy użyciu jednej klasy testowej [JUnitTestDao]. Po zweryfikowaniu tych architektur nie napotkano już żadnych trudności:
- projekt Maven dotyczący publikacji bazy danych w sieci opiera się na tych dwóch architekturach. Istnieje zatem również 24 możliwe konfiguracje;
- projekt Maven dotyczący zabezpieczenia dostępu do serwisu internetowego opiera się na poprzednim projekcie i również ma 24 możliwe konfiguracje;
- wreszcie projekt Maven umożliwiający żądania międzydomenowe do zabezpieczonej usługi internetowej opiera się na poprzednim projekcie i również ma 24 możliwe konfiguracje;
Chociaż niniejszy dokument nie obejmuje wszystkich możliwości języka Java ani wszystkich obszarów jego zastosowania, może służyć jako materiał do nauki tego języka. Czytelnik, który przyswoi sobie treść tego kursu, osiągnie poziom „zaawansowany w Javie” zarówno w zakresie posługiwania się językiem, jak i frameworkiem Spring. Będzie mógł wówczas kontynuować naukę języka Java, korzystając z następujących publikacji:
- [Spring MVC et Thymeleaf par l'exemple] [http://tahe.developpez.com/java/springmvc-thymeleaf], które kontynuują naukę ekosystemu Spring, przedstawiając jego gałąź „programowania internetowego MVC”. Wykorzystują one bardziej złożoną bazę danych niż ta omawiana w niniejszym dokumencie;
- [Tutoriel AngularJS / Spring MVC] [http://tahe.developpez.com/angularjs-spring4], które przedstawia architekturę internetową klient/serwer, gdzie klient jest zaimplementowany przy użyciu frameworka [AngularJS], a serwer przy użyciu [Spring MVC];
- [Introduction à Java EE] [http://tahe.developpez.com/java/javaee], który odchodzi od środowiska Spring na rzecz architektury internetowej opartej na JSF (Java Server Faces) oraz EJB (Enterprise Java Bean);
- [Introduction à la programmation des tablettes Android] [http://tahe.developpez.com/android/exemples-intellij-aa], opisujący architekturę klient-serwer, w której klientem jest tablet z systemem Android zaprogramowany w języku Java, a serwerem – usługa internetowa zaimplementowana przy użyciu biblioteki Spring MVC;






