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:












