Skip to content

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

11.1. Arquitetura da aplicação

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

Substituímos a camada simulada [métier] pelas camadas [métier, DAO, jpa] implementadas por EJB no parágrafo 7.1:

11.2. O projeto NetBeans da camada web

O projeto NetBeans da versão web nº 2 é obtido por meio da cópia do projeto anterior:

  • [1]: copia-se o novo projeto e cola-se na aba [Projects],
  • [2]: atribui-se um nome e define-se a pasta,
  • [3]: o projeto foi criado,

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

  • [4]: estamos renomeando o projeto,
  • [5]: alteramos seu nome, bem como o do artifactID.

Temos poucas alterações a fazer para adaptar essa camada web ao seu novo ambiente: a camada simulada [metier] deve ser substituída pela camada [metier, DAO, jpa] do servidor criado no parágrafo 7.1. Para isso, realizamos duas ações:

  • excluímos os pacotes [exception, metier, jpa] que estavam presentes no projeto anterior.
  • para compensar essa remoção, adicionamos às dependências do projeto web o projeto do servidor EJB criado no parágrafo 7.1.
  • no [1], adicionamos uma dependência ao projeto,
  • no [2], seleciona-se o projeto Maven da camada [métier]. No [3], especifica-se seu tipo e, no [4], seu escopo. Este escopo é provided para indicar que ele será fornecido (provided) ao módulo web pelo seu ambiente de trabalho. Veremos em breve que ele será fornecido por um aplicativo corporativo,
  • em [5], a dependência foi adicionada.

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


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

Agora podemos excluir os pacotes da camada [métier] que não são mais necessários:

  

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


public class Form {
  
  public Form() {
  }
  
  // camada de negócios
  private IMetierLocal metier=new Metier();
  
  // campos do formulário
...

A linha 7 instanciava a camada simulada [métier]. Agora, ela deve referenciar a camada real [métier]. O código anterior passa a ser o seguinte:


public class Form {
  
  public Form() {
  }
  
  // camada de negócios
  @EJB
  private IMetierLocal metier;
  
  // campos do formulário

Na linha 7, a anotação @EJB indica ao contêiner de servlets, que executará a camada web, para injetar no campo metier da camada 8, o EJB, que implementa a interface local IMetierLocal.

Por que 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 do contêiner de servlets podem referenciar diretamente as classes EJB do contêiner EJB.

É isso. Nossa camada web está pronta. A transformação foi simples porque nos preocupamos em simular a camada [métier] por meio de uma classe que respeitava a interface IMetierLocal implementada pela camada [métier] real.

11.3. O projeto NetBeans do aplicativo corporativo

Uma aplicação corporativa permite a implantação simultânea, em um servidor de aplicações, da camada [web] e da camada EJB de uma aplicação, respectivamente no contêiner de servlets e no contêiner EJB.

Procedemos da seguinte maneira:

  • em [1], criamos um novo projeto
  • em [2], seleciona-se a categoria [Maven]
  • em [3], selecionamos o tipo [Enterprise Application]
  • no [4], nomeia-se o projeto
  • em [5], selecionamos Java EE 6
  • em [6], um projeto empresarial pode incluir até dois tipos de módulos:
    • um módulo EJB
    • um módulo web

É possível solicitar, ao mesmo tempo que a criação do projeto empresarial, a criação desses dois módulos, que estarão vazios inicialmente. Um projeto empresarial serve apenas para a implantação dos módulos que fazem parte dele. Fora isso, é uma estrutura vazia. Aqui, queremos implantar:

  • 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 já existente, o [mv-pam-ejb-metier-dao-eclipselink]. Nesse caso também, não há necessidade de criar um novo.

No [6], criamos um projeto corporativo sem módulos. Adicionaremos seus módulos web e EJB posteriormente.

  • No [7], foram criados dois projetos Maven. O projeto corporativo é aquele com o sufixo ear. O outro projeto é um projeto Maven pai do anterior. Não vamos nos preocupar com ele.

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

  • no [1], adição de uma nova dependência,
  • em [2], adição do projeto EJB [mv-pam-ejb-metier-dao-eclipselink]. Observe-se seu tipo ejb,
  • em [3], adição do projeto web [mv-pam-jsf2-ejb]. Observe-se seu tipo war.

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


<dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
            <version>${project.version}</version>
            <type>ejb</type>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>mv-pam-jsf2-ejb</artifactId>
            <version>${project.version}</version>
            <type>war</type>
        </dependency>
    </dependencies>

Antes da implantação do aplicativo corporativo [mv-pam-webapp-ear], certifique-se de que o banco de dados MySQL [dbpam_eclipselink] exista e esteja preenchido. Feito isso, podemos implantar o aplicativo corporativo [mv-pam-webapp-ear]:

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

No navegador, é exibida a seguinte página:

  • em [1], o URL solicitado
  • em [2], a lista de funcionários foi preenchida com os elementos da tabela [Employes] do banco de dados dbpam.

Solicita-se ao leitor que repita os testes da versão web nº 1. Segue um exemplo de execução:

Image