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 implementó 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 sola prueba, [JUnitTestDao], para probar ambas 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 dependiendo 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, los cuales 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 permitió 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, aseguramos 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 actualizado la arquitectura anterior a la siguiente:
![]() |
- en [3], la aplicación del cliente es en sí misma una aplicación web servida por el servidor web [4]. La aplicación cliente muestra 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 utiliza lo que se conoce como solicitudes entre dominios:
- el servicio web presenta URL con el formato [http://machine1:port1/];
- la aplicación web cliente se descarga desde una URL [http://machine2:port2/]. Si [http://machine2:port2/] no es idéntico a [http://machine1:port1/] (misma máquina, mismo puerto), entonces el navegador del 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 siguientes seis bases de datos:
- 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;
Así pues, se presentó un conjunto de veinticuatro configuraciones diferentes. Se realizó un gran esfuerzo de factorización:
- la mayor parte del código se escribe solo 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 de Maven de la capa JDBC [1] de un SGBD específico 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 presentado problemas de portabilidad, principalmente debido a la presencia en las consultas de nombres de tablas y columnas que resultaron ser palabras clave prohibidas en ciertos SGBD (tabla ROLES para DB2, columna PASSWORD para Firebird). Por otra parte, aunque normalmente un nombre de columna no distingue entre mayúsculas y minúsculas, se presentó 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] y SGBD de un caso particular permiten:
- importar el archivo de la implementación JPA;
- configurar la implementación JPA utilizada para el SGBD específico conectado. De hecho, es la capa JPA la que envía las órdenes SQL a la capa JDBC. Para que esto funcione, debe conocer el SGBD a fin de enviarle las órdenes SQL que él 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, disparadores, procedimientos, generación automática de claves primarias, etc.);
De esta manera, se crearon veinticuatro proyectos (4 configuraciones × 6 SGBD) de configuración de Maven en los que se basaron todos los demás proyectos de operació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 mencionadas se probaron con la única clase de prueba [JUnitTestDao]. Una vez verificadas estas arquitecturas, ya no hubo más dificultades:
- el proyecto Maven para la 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 para la seguridad del acceso al servicio web se basa en el proyecto anterior y también cuenta 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 cuenta con 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 al presentar 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, donde 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, en la que el cliente es una tableta Android programada en Java y el servidor es un servicio web implementado mediante Spring MVC;






