Skip to content

11. Versão 6 - Integração da camada web numa arquitetura de 3 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 através da cópia do projeto anterior:

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

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

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

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

  • eliminamos os pacotes [exception, metier, jpa] que estavam presentes no projeto anterior.
  • para compensar esta 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 o seu tipo e, no [4], o seu âmbito. Este é provided para indicar que este será fornecido (provided) ao módulo web pelo seu ambiente de trabalho. Veremos em breve que lhe será fornecido por uma aplicação empresarial,
  • em [5], a dependência foi adicionada.

O ficheiro [pom.xml] é, então, o seguinte:


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

Podemos agora eliminar os pacotes da camada [métier] que já não são necessários:

  

Temos também de alterar o código do bean [Form.java]:


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

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


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

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

Por que razão 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 contentor de servlets podem referenciar diretamente as classes EJB do contentor EJB.

E pronto. A nossa camada web está pronta. A transformação foi simples porque nos preocupámos em simular a camada [métier] através de uma classe que respeitava a interface IMetierLocal implementada pela camada [métier] real.

11.3. O projeto NetBeans da aplicação empresarial

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

Procedemos da seguinte forma:

  • em [1], criamos um novo projeto
  • em [2], selecionamos a categoria [Maven]
  • em [3], selecionamos o tipo [Enterprise Application]
  • no [4], atribui-se um nome ao 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, em simultâneo com a criação do projeto empresarial, a criação destes dois módulos, que estarão vazios inicialmente. Um projeto empresarial serve apenas para a implementação dos módulos que o compõem. Fora isso, é uma estrutura vazia. Neste caso, pretendemos implementar:

  • um módulo web existente [mv-pam-jsf2-alone]. Por isso, não é necessário criar um novo módulo web.
  • um módulo EJB já existente, o [mv-pam-ejb-metier-dao-eclipselink]. Também neste caso, não é necessário criar um novo.

No [6], criamos um projeto empresarial sem módulos. Iremos adicionar-lhe os seus módulos web e EJB posteriormente.

  • No [7], foram criados dois projetos Maven. O projeto empresarial é aquele que tem o sufixo «ear». O outro projeto é um projeto Maven pai do anterior. Não nos vamos ocupar dele.

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

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

O ficheiro [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 implementação da aplicação empresarial [mv-pam-webapp-ear], deve-se verificar se a base de dados MySQL [dbpam_eclipselink] existe e está preenchida. Feito isto, 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 os elementos da tabela [Employes] da base de dados dbpam.

Convida-se o leitor a repetir os testes da versão web n.º 1. Eis um exemplo de execução:

Image