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:












