Skip to content

22. Conclusão

Vamos rever o que abordámos neste documento. Analisámos duas camadas [DAO] utilizando uma das duas arquiteturas seguintes:

A camada [DAO1] foi implementada com Spring JDBC e a camada [DAO2] com Spring JPA. As camadas [DAO1] e [DAO2] implementaram a mesma interface [IDAO], o que nos permitiu escrever um único teste [JUnitTestDao] para testar ambas as camadas [DAO];

Depois de concluído este passo, expusemos a interface [IDAO] na Web da seguinte forma:

  • Em [1], a camada [IDAO] foi exposta na Web através de uma camada Web [2] implementada utilizando Spring MVC. É, de facto, a interface [IDAO] que é exposta, e criámos duas versões do serviço Web, dependendo de esta interface ser implementada utilizando uma arquitetura [DAO-JDBC] ou [DAO-JPA-JDBC];
  • em [B], um cliente remoto utiliza os URLs disponibilizados pelo serviço web, que fornecem acesso aos métodos da camada [IDAO-server]. Assegurámos que a camada [DAO-Client] [3] implementa a interface [IDAO-server] [1]. Isto permitiu-nos reutilizar o mesmo teste [JUnitTestDao] que já tinha sido utilizado duas vezes;
  • Em [3], a camada [DAO-Client] foi implementada utilizando o Spring RestTemplate;

Feito isso, protegemos o acesso ao serviço web:

  • em [5], o pedido HTTP do cliente passa por uma camada de autenticação implementada com o Spring Security;

Feito isso, evoluímos a arquitetura anterior para a seguinte:

  • em [3], a aplicação cliente é, ela própria, uma aplicação web servida pelo servidor web [4]. A aplicação cliente apresenta um formulário [5] no navegador que permite consultar os URLs do serviço web seguro. O acesso HTTP ao serviço web seguro é tratado por uma camada [jS] implementada em JavaScript. Esta arquitetura utiliza o que se designa por pedidos entre domínios:
    • o serviço web apresenta URLs do tipo [http://machine1:port1/];
    • a aplicação web cliente é descarregada a partir de um URL [http://machine2:port2/]. Se [http://machine2:port2/] não for idêntico a [http://machine1:port1/] (mesma máquina, mesma porta), então o navegador do cliente bloqueará as chamadas HTTP da camada [DAO-client-js]. Para resolver esta questão, o serviço web deve permitir pedidos entre domínios;

Os projetos apresentados foram testados com as seguintes seis bases de dados:

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

Para cada um destes SGBDs, desenvolvemos quatro camadas [DAO] diferentes:

  • uma camada implementada com Spring JDBC;
  • uma camada implementada com Spring JPA e o provedor Hibernate JPA;
  • uma camada implementada com Spring JPA e o provedor EclipseLink JPA;
  • uma camada implementada com Spring JPA e o provedor OpenJPA JPA;

Assim, foi apresentado um conjunto de vinte e quatro configurações diferentes. Foi feito um grande esforço no sentido da refatoração do código:

  • a maior parte do código é escrita apenas uma vez. Baseia-se em dois projetos de configuração do Maven:
    • um configura a camada JDBC;
    • o outro configura a camada JPA;

O projeto de configuração Maven para a camada JDBC [1] de um SGBD específico permite:

  • importar o arquivo do driver JDBC;
  • definir as credenciais de acesso à base de dados utilizada e as várias instruções SQL que a camada [DAO1] enviará ao controlador JDBC. Embora o SQL seja padronizado, deparámo-nos com problemas de portabilidade, principalmente devido à presença nas consultas de nomes de tabelas/colunas que se revelaram palavras-chave proibidas em determinados SGBDs (a tabela ROLES para o DB2, a coluna PASSWORD para o Firebird). Além disso, embora um nome de coluna seja normalmente insensível a maiúsculas e minúsculas, deparámo-nos com um problema no PostgreSQL relativamente à coluna ID da chave primária nas tabelas. Era necessário que fosse nomeada «id» em minúsculas;

Os três projetos Maven para configurar a camada JPA [2] de um SGBD específico permitem:

  • importar o arquivo de implementação JPA;
  • configurar a implementação JPA utilizada para o SGBD específico conectado. Na verdade, é a camada JPA que emite comandos SQL para a camada JDBC. Para ser eficaz, ela deve conhecer o SGBD a fim de enviar-lhe comandos SQL que este reconheça. Esses comandos podem utilizar o SQL proprietário desse SGBD, bem como as suas características específicas (tipos de dados, sequências, gatilhos, procedimentos, geração automática de chaves primárias, etc.);

Assim, criámos vinte e quatro projetos de configuração Maven (4 configurações × 6 SGBDs) nos quais se basearam todos os outros projetos de operação de bases de dados. Nos diagramas acima, uma vez que as camadas [DAO1] e [DAO2] fornecem a mesma interface, as 24 configurações das duas arquiteturas acima foram testadas utilizando uma única classe de teste [JUnitTestDao]. Uma vez verificadas estas arquiteturas, não houve mais dificuldades:

  • o projeto Maven para a publicação da base de dados na web baseia-se nestas duas arquiteturas. Existem, portanto, também 24 configurações possíveis aqui;
  • o projeto Maven para proteger o acesso ao serviço web baseia-se no projeto anterior e também tem 24 configurações possíveis;
  • por fim, o projeto Maven que permite pedidos entre domínios para o serviço web seguro baseia-se no projeto anterior e também tem 24 configurações possíveis;

Embora este documento não abranja todas as capacidades da linguagem Java nem todas as suas áreas de aplicação, pode ser utilizado como recurso de aprendizagem da linguagem. Os leitores que dominarem o conteúdo deste curso terão atingido um nível de «Java avançado», tanto na utilização da linguagem como do framework Spring. Poderão então continuar a sua formação em Java com os seguintes livros:

  • [Spring MVC and Thymeleaf by Example] [http://tahe.developpez.com/java/springmvc-thymeleaf], que dá continuidade à exploração do ecossistema Spring ao apresentar o seu ramo de “programação web MVC”. Utiliza uma base de dados mais complexa do que a estudada aqui;
  • [Tutorial AngularJS / Spring MVC] [http://tahe.developpez.com/angularjs-spring4], que apresenta uma arquitetura web cliente/servidor, em que o cliente é implementado utilizando o framework [AngularJS] e o servidor utilizando [Spring MVC];
  • [Introdução ao Java EE] [http://tahe.developpez.com/java/javaee], que se afasta do ecossistema Spring para uma arquitetura web baseada em JSF (Java Server Faces) e EJB (Enterprise JavaBeans);
  • [Introdução à Programação para Tablets Android] [http://tahe.developpez.com/android/exemples-intellij-aa], que descreve uma arquitetura cliente/servidor em que o cliente é um tablet Android programado em Java e o servidor é um serviço web implementado utilizando Spring MVC;