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:












