Skip to content

22. Conclusione

Ricordiamo cosa abbiamo fatto in questo documento. Abbiamo esaminato due livelli [DAO] con una delle due architetture seguenti:

Il livello [DAO1] è stato implementato con Spring JDBC e il livello [DAO2] con Spring JPA. I livelli [DAO1] e [DAO2] implementavano la stessa interfaccia [IDAO], il che ha permesso discrivere un unico test [JUnitTestDao] per testare entrambi i livelli [DAO];

Fatto ciò, abbiamo esposto l’interfaccia [IDAO] sul web nel modo seguente:

  • in [1], il livello [IDAO] è stato esposto sul web tramite un livello web [2] implementato da Spring MVC. È proprio l'interfaccia [IDAO] ad essere esposta e abbiamo realizzato due versioni del servizio web a seconda che tale interfaccia sia implementata con un'architettura [DAO-JDBC] o [DAO-JPA-JDBC];
  • in [B], un client remoto utilizza le URL esposte dal servizio web, che consentono l’accesso ai metodi del livello [IDAO-serveur]. Abbiamo fatto in modo che il livello [DAO-Client] [3] implementi l'interfaccia [IDAO-serveur] [1]. Ciò ci ha permesso di riutilizzare lo stesso test [JUnitTestDao] già impiegato due volte;
  • in [3], il livello [DAO-client] è stato implementato con Spring RestTemplate;

Fatto ciò, abbiamo protetto l’accesso al servizio web:

  • in [5], la richiesta HTTP del client passa attraverso un livello di autenticazione implementato con Spring Security;

A questo punto, abbiamo fatto evolvere l’architettura precedente nella seguente:

  • in [3], l'applicazione client è essa stessa un'applicazione web fornita dal server web [4]. L’applicazione client presenta nel browser un modulo [5] che consente di interrogare i URL del servizio web protetto. Gli accessi HTTP al servizio web protetto avvengono tramite un livello [jS] implementato in JavaScript. Questa architettura utilizza le cosiddette richieste interdominio:
    • il servizio web presenta URL della forma [http://machine1:port1/];
    • l’applicazione web client viene scaricata da un URL [http://machine2:port2/]. Se [http://machine2:port2/] non è identico a [http://machine1:port1/] (stesso computer, stessa porta), il browser client bloccherà le chiamate HTTP provenienti dal livello [DAO-client-js]. Per risolvere questo problema, il servizio web deve autorizzare le richieste interdominio;

I progetti presentati sono stati testati con i seguenti sei database:

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

Per ciascuno di questi SGBD, sono stati sviluppati quattro diversi livelli [DAO]:

  • un livello implementato con Spring JDBC;
  • un livello implementato con Spring JPA e il provider JPA Hibernate;
  • un livello implementato con Spring JPA e il provider JPA EclipseLink;
  • un livello implementato con Spring JPA e il provider JPA OpenJPA;

È stato quindi presentato un insieme di ventiquattro configurazioni diverse. È stato compiuto un grande sforzo di fattorizzazione:

  • la maggior parte del codice è stata scritta una sola volta. Si basa su due progetti Maven di configurazione:
    • uno configura il livello JDBC;
    • l’altro configura il livello JPA;

Il progetto di configurazione Maven del livello JDBC [1] di un particolare SGBD consente:

  • di importare l'archivio del driver JDBC;
  • di definire le credenziali di accesso al database utilizzato e i vari comandi SQL che il livello [DAO1] invierà al driver JDBC. Sebbene SQL sia standardizzato, si sono verificati problemi di portabilità dovuti essenzialmente alla presenza nelle query di nomi di tabelle/colonne che si sono rivelati essere parole chiave non consentite in alcuni SGBD (tabella ROLES per DB2, colonna PASSWORD per Firebird). Inoltre, sebbene un nome di colonna sia normalmente insensibile alle maiuscole e alle minuscole, si è verificato un problema con PostgreSQL relativo alla colonna ID della chiave primaria delle tabelle. Ha richiesto che fosse denominata id in minuscolo;

I tre progetti Maven di configurazione del livello JPA [2] di un particolare SGBD consentono:

  • di importare l’archivio dell’implementazione JPA;
  • di configurare l’implementazione JPA utilizzata per il particolare SGBD connesso. Infatti, è il livello JPA che invia i comandi SQL al livello JDBC. Per funzionare correttamente, deve conoscere il SGBD per potergli inviare i comandi SQL che esso riconoscerà. Tali comandi potranno utilizzare il SQL proprietario di questo SGBD, nonché le caratteristiche specifiche di quest’ultimo (tipi di dati, sequenze, trigger, procedure, generazione automatica di chiavi primarie, ...);

Sono stati così creati ventiquattro progetti (4 configurazioni x 6 SGBD) di configurazione Maven su cui si sono basati tutti gli altri progetti di gestione del database. Negli schemi sopra riportati, poiché i livelli [DAO1] e [DAO2] offrono la stessa interfaccia, le 24 configurazioni delle due architetture sopra descritte sono state testate con l’unica classe di test [JUnitTestDao]. Una volta verificate queste architetture, non si sono più riscontrate difficoltà:

  • il progetto Maven per la pubblicazione del database sul web si basa su queste due architetture. Anche in questo caso vi sono quindi 24 configurazioni possibili;
  • il progetto Maven per la protezione dell’accesso al servizio web si basa sul progetto precedente e presenta anch’esso 24 configurazioni possibili;
  • infine, il progetto Maven che consente le richieste interdominio al servizio web protetto si basa sul progetto precedente e presenta anch’esso 24 configurazioni possibili;

Sebbene non esamini tutte le funzionalità del linguaggio Java né tutti i suoi ambiti di applicazione, questo documento può essere utilizzato come materiale didattico per l’apprendimento del linguaggio. Il lettore che avrà assimilato il contenuto di questo corso avrà raggiunto un livello “Java avanzato” sia nell’uso del linguaggio che in quello del framework Spring. Potrà quindi proseguire la propria formazione su Java con le seguenti opere:

  • [Spring MVC et Thymeleaf par l'exemple] [http://tahe.developpez.com/java/springmvc-thymeleaf], che approfondisce l’apprendimento dell’ecosistema Spring presentando il suo ramo dedicato alla “programmazione web MVC”. Utilizza un database più complesso di quello studiato in questo corso;
  • [Tutoriel AngularJS / Spring MVC] [http://tahe.developpez.com/angularjs-spring4], che presenta un’architettura web client/server, in cui il client è implementato con il framework [AngularJS] e il server con [Spring MVC];
  • [Introduction à Java EE] [http://tahe.developpez.com/java/javaee] che abbandona l’ecosistema Spring a favore di un’architettura web basata su JSF (Java Server Faces) e EJB (Enterprise Java Bean);
  • [Introduction à la programmation des tablettes Android] [http://tahe.developpez.com/android/exemples-intellij-aa], che descrive un'architettura client/server in cui il client è un tablet Android programmato in Java e il server è un servizio web implementato con Spring MVC;