Skip to content

11. Versão 6 - Integração da camada web numa arquitetura JSF/EJB de três camadas

11.1. Arquitetura da Aplicação

A arquitetura da aplicação web anterior era a seguinte:

Substituímos a camada [de negócios] simulada pelas camadas [de negócios, DAO, JPA] implementadas por EJBs na Secção 7.1:

11.2. O projeto NetBeans para a camada web

O projeto NetBeans para a Web Versão 2 é criado através da cópia do projeto anterior:

  • [1]: Copie o novo projeto e cole-o no separador [Projetos],
  • [2]: atribua-lhe um nome e defina a sua pasta,
  • [3]: o projeto está criado,

O novo projeto tem o mesmo nome que o antigo. Vamos alterar isso:

  • [4]: Renomeie o projeto,
  • [5]: Altere o nome e o artifactID.

Temos algumas alterações a fazer para adaptar esta camada web ao seu novo ambiente: a camada [business] simulada deve ser substituída pela camada [business, DAO, JPA] do servidor construído na Secção 7.1. Para tal, fazemos duas coisas:

  • removemos os pacotes [exception, business, jpa] que estavam presentes no projeto anterior.
  • Para compensar esta remoção, adicionamos o projeto do servidor EJB construído na Secção 7.1 às dependências do projeto web.
  • Em [1], adicionamos uma dependência ao projeto,
  • Em [2], selecionamos o projeto Maven para a camada [business]. Em [3], especificamos o seu tipo e, em [4], o seu âmbito. O âmbito é definido como `provided` para indicar que será fornecido ao módulo web pelo seu ambiente de execução. Veremos em breve que será fornecido por uma aplicação empresarial,
  • em [5], a dependência foi adicionada.

O ficheiro [pom.xml] fica então da seguinte forma:


  private boolean viewInfosIsRendered;

Podemos agora remover os pacotes da camada [business] que já não são necessários:

  

Também precisamos de modificar o código no bean [Form.java]:


<dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
      <version>${project.version}</version>
      <scope>provided</scope>
      <type>ejb</type>
    </dependency>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-web-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

A linha 7 instanciou a camada [business] simulada. Agora, deve referenciar a camada [business] real. O código anterior passa a ser o seguinte:


public class Form {
 
  public Form() {
  }
 
  // business layer
  private IMetierLocal metier=new Metier();
 
  // form fields
...

Linha 7: A anotação @EJB instrui o contentor de servlets — que irá executar a camada web — a injetar o EJB que implementa a interface local IMetierLocal no campo de negócio na linha 8.

Porquê a interface local IMetierLocal em vez da interface IMetierRemote? Porque a camada web e a camada EJB são executadas na mesma JVM:

As classes no contentor de servlets podem referenciar diretamente as classes EJB no contentor EJB.

É isso. A nossa camada web está pronta. A transformação foi simples porque nos preocupámos em simular a camada [de negócios] utilizando uma classe que cumpria a interface IMetierLocal implementada pela camada [de negócios] real.

11.3. O projeto NetBeans para a aplicação empresarial

Uma aplicação empresarial permite a implementação simultânea da camada [web] e da camada EJB de uma aplicação num servidor de aplicações, no contentor de servlets e no contentor de EJB, respetivamente.

Procedemos da seguinte forma:

  • em [1], criamos um novo projeto
  • em [2], selecionamos a categoria [Maven]
  • em [3], selecionamos o tipo [Aplicação Empresarial]
  • em [4], nomeamos o projeto
  • Em [5], selecionamos o Java EE 6
  • Em [6], um projeto empresarial pode incluir até dois tipos de módulos:
    • um módulo EJB
    • um módulo web

Ao criar o projeto empresarial, pode solicitar a criação destes dois módulos, que estarão vazios inicialmente. Um projeto empresarial é utilizado exclusivamente para implementar os módulos que contém. Para além disso, é uma estrutura vazia. Aqui, pretendemos implementar:

  • um módulo web existente [mv-pam-jsf2-alone]. Portanto, não há necessidade de criar um novo módulo web.
  • um módulo EJB existente [mv-pam-ejb-metier-dao-eclipselink]. Aqui, também, não há necessidade de criar um novo.

Em [6], criamos um projeto empresarial sem módulos. Iremos adicionar os seus módulos web e EJB mais tarde.

  • Em [7], foram criados dois projetos Maven. O projeto empresarial é aquele com a extensão .ear. O outro projeto é um projeto Maven pai do primeiro. Não nos preocuparemos com ele.

Adicionamos o módulo web e o módulo EJB ao projeto empresarial:

  • Em [1], adicione uma nova dependência,
  • em [2], adicione o projeto EJB [mv-pam-ejb-metier-dao-eclipselink]. Observe o seu tipo EJB,
  • em [3], adicione o projeto web [mv-pam-jsf2-ejb]. Observe que o seu tipo é war.

O ficheiro [pom.xml] fica então da seguinte forma:


public class Form {
 
  public Form() {
  }
 
  // business layer
  @EJB
  private IMetierLocal metier;
 
  // form fields

Antes de implementar a aplicação empresarial [mv-pam-webapp-ear], certifique-se de que a base de dados MySQL [dbpam_eclipselink] existe e está preenchida. Depois de fazer isso, podemos implementar a aplicação empresarial [mv-pam-webapp-ear]:

  • em [1], a aplicação empresarial está implementada
  • em [2], a aplicação empresarial [mv-pam-webapp-ear] foi implementada com sucesso.

No navegador, aparece a seguinte página:

  • em [1], o URL solicitado
  • em [2], a lista de funcionários foi preenchida com as entradas da tabela [Employees] na base de dados dbpam.

Convidamos o leitor a repetir os testes da Versão Web 1. Aqui está um exemplo da execução:

Image