22. Conclusión
Recordemos lo que hemos hecho en este documento. Hemos estudiado dos capas [DAO] con una de las dos arquitecturas siguientes:
![]() |
![]() |
La capa [DAO1] se ha implementado con Spring JDBC y la capa [DAO2] con Spring JPA. Las capas [DAO1] y [DAO2] implementaban la misma interfaz [IDAO], lo que permitióescribir una única prueba [JUnitTestDao] para probar las dos capas [DAO];
Una vez hecho esto, expusimos la interfaz [IDAO] en la web de la siguiente manera:
![]() |
- en [1], la capa [IDAO] se expuso en la web a través de una capa web [2] implementada por Spring MVC. Es precisamente la interfaz [IDAO] la que se expone y hemos creado dos versiones del servicio web en función de si esta interfaz se implementa con una arquitectura [DAO-JDBC] o [DAO-JPA-JDBC];
- en [B], un cliente remoto utiliza los URL expuestos por el servicio web y que dan acceso a los métodos de la capa [IDAO-serveur]. Nos hemos asegurado de que la capa [DAO-Client] [3] implemente la interfaz [IDAO-serveur] [1]. Esto nos ha permitido utilizar la misma prueba [JUnitTestDao] que ya se había utilizado dos veces;
- en [3], la capa [DAO-client] se implementó con Spring RestTemplate;
Una vez hecho esto, hemos protegido el acceso al servicio web:
![]() |
- en [5], la solicitud HTTP del cliente pasa por una capa de autenticación implementada con Spring Security;
Una vez hecho esto, hemos evolucionado la arquitectura anterior hacia la siguiente:
![]() |
- en [3], la aplicación cliente es en sí misma una aplicación web servida por el servidor web [4]. La aplicación cliente presenta en el navegador un formulario [5] que permite consultar los URL del servicio web seguro. Los accesos HTTP al servicio web seguro se realizan a través de una capa [jS] implementada en Javascript. Esta arquitectura implementa lo que se denomina solicitudes entre dominios:
- el servicio web presenta URL de la forma [http://machine1:port1/];
- la aplicación web cliente se descarga desde un URL [http://machine2:port2/]. Si [http://machine2:port2/] no es idéntico a [http://machine1:port1/] (misma máquina, mismo puerto), entonces el navegador cliente bloqueará las llamadas HTTP de la capa [DAO-client-js]. Para solucionar este problema, el servicio web debe permitir las solicitudes entre dominios;
Los proyectos presentados se han probado con las seis bases de datos siguientes:
- MySQL 5 Community Edition;
- SQL Server 2014 Express;
- PostgreSQL 9.4;
- Oracle Express 11g versión 2;
- IBM DB2 Express-C 10.5;
- Firebird 2.5.4;
Para cada uno de estos SGBD, se han desarrollado cuatro capas [DAO] diferentes:
- una capa implementada con Spring JDBC;
- una capa implementada con Spring JPA y el proveedor JPA Hibernate;
- una capa implementada con Spring JPA y el proveedor JPA EclipseLink;
- una capa implementada con Spring JPA y el proveedor JPA OpenJPA;
Por lo tanto, se ha presentado un conjunto de veinticuatro configuraciones diferentes. Se ha realizado un gran esfuerzo de factorización:
- la mayor parte del código solo se escribe una vez. Se basa en dos proyectos de configuración de Maven:
- uno configura la capa JDBC;
- el otro configura la capa JPA;
![]() |
![]() |
El proyecto de configuración Maven de la capa JDBC [1] de un SGBD concreto permite:
- importar el archivo del controlador JDBC;
- definir las credenciales de acceso a la base de datos utilizada y las diferentes órdenes SQL que la capa [DAO1] enviará al controlador JDBC. Aunque SQL está estandarizado, se han encontrado problemas de portabilidad debido principalmente a la presencia en las consultas de nombres de tablas/columnas que resultaron ser palabras clave prohibidas en algunos SGBD (tabla ROLES para DB2, columna PASSWORD para Firebird). Por otra parte, aunque normalmente los nombres de columna no distinguen entre mayúsculas y minúsculas, se ha detectado un problema con PostgreSQL en relación con la columna ID de la clave primaria de las tablas. Quería que se llamara id en minúsculas;
Los tres proyectos Maven de configuración de la capa JPA [2] de un SGBD concreto permiten:
- importar el archivo de la implementación JPA;
- configurar la implementación JPA utilizada para el SGBD concreto conectado. De hecho, es la capa JPA la que envía las órdenes SQL a la capa JDBC. Para ser eficaz, debe conocer el SGBD con el fin de enviarle las órdenes SQL que este reconocerá. Estas órdenes podrán utilizar el SQL propietario de este SGBD, así como las características particulares de este último (tipos de datos, secuencias, triggers, procedimientos, generación automática de claves primarias, etc.);
De este modo, se crearon veinticuatro proyectos (4 configuraciones x 6 SGBD) de configuración de Maven en los que se basaron todos los demás proyectos de explotación de la base de datos. En los esquemas anteriores, dado que las capas [DAO1] y [DAO2] ofrecen la misma interfaz, las 24 configuraciones de las dos arquitecturas anteriores se probaron con la única clase de prueba [JUnitTestDao]. Una vez verificadas estas arquitecturas, no hubo más dificultades:
- el proyecto Maven de publicación de la base de datos en la web se basa en estas dos arquitecturas. Por lo tanto, también hay 24 configuraciones posibles;
- el proyecto Maven de securización del acceso al servicio web se basa en el proyecto anterior y cuenta también con 24 configuraciones posibles;
- por último, el proyecto Maven que permite las solicitudes entre dominios al servicio web seguro se basa en el proyecto anterior y también tiene 24 configuraciones posibles;
Aunque no abarca todas las capacidades del lenguaje Java ni todos sus ámbitos de aplicación, este documento puede utilizarse como material de aprendizaje del lenguaje. El lector que haya asimilado el contenido de este curso habrá alcanzado un nivel de «Java avanzado», tanto en el uso del lenguaje como en el del marco Spring. Podrá entonces continuar su formación en Java con las siguientes obras:
- [Spring MVC et Thymeleaf par l'exemple] [http://tahe.developpez.com/java/springmvc-thymeleaf], que continúa el aprendizaje del ecosistema Spring presentando su rama de «programación web MVC». Utiliza una base de datos más compleja que la estudiada aquí;
- [Tutoriel AngularJS / Spring MVC] [http://tahe.developpez.com/angularjs-spring4], que presenta una arquitectura web cliente/servidor, en la que el cliente se implementa con el marco [AngularJS] y el servidor con [Spring MVC];
- [Introduction à Java EE] [http://tahe.developpez.com/java/javaee], que abandona el entorno Spring para adoptar una arquitectura web basada en JSF (Java Server Faces) y EJB (Enterprise Java Bean);
- [Introduction à la programmation des tablettes Android] [http://tahe.developpez.com/android/exemples-intellij-aa], que describe una arquitectura cliente/servidor, donde el cliente es una tableta Android programada en Java y el servidor un servicio web implementado por Spring MVC;






