11. Versione 6 - Integrazione del livello web in un'architettura a 3 livelli JSF / EJB
11.1. Architettura dell’applicazione
L'architettura dell'applicazione web precedente era la seguente:
![]() |
Sostituiamo il livello [métier] simulato con i livelli [métier, DAO, jpa] implementati tramite EJB nel paragrafo 7.1:
![]() |
11.2. Il progetto NetBeans del livello web
Il progetto NetBeans della versione web n. 2 si ottiene copiando il progetto precedente:
![]() |
- [1]: si copia il nuovo progetto e lo si incolla nella scheda [Projects],
- [2]: gli si assegna un nome e si imposta la cartella,
- [3]: il progetto è stato creato,
Il nuovo progetto ha lo stesso nome di quello precedente. Modifichiamo questo aspetto:
![]() |
- [4]: rinominiamo il progetto,
- [5]: ne modifichiamo il nome, così come quello di artifactID.
Dobbiamo apportare poche modifiche per adattare questo livello web al suo nuovo ambiente: il livello simulato [metier] deve essere sostituito dal livello [metier, DAO, jpa] del server realizzato nel paragrafo 7.1. A tal fine, procediamo in due modi:
- eliminiamo i pacchetti [exception, metier, jpa] che erano presenti nel progetto precedente.
- per compensare questa rimozione, aggiungiamo alle dipendenze del progetto web il progetto del server EJB creato nel paragrafo 7.1.
![]() |
- in [1], si aggiunge una dipendenza al progetto,
- in [2], si seleziona il progetto Maven del livello [métier]. In [3], se ne specifica il tipo e in [4] il suo ambito. Quest’ultimo è provided per indicare che verrà fornito (provided) al modulo web dal suo ambiente di lavoro. Vedremo in seguito che gli verrà fornito da un’applicazione aziendale,
- in [5], la dipendenza è stata aggiunta.
Il file [pom.xml] è quindi il seguente:
<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>
Ora possiamo rimuovere i pacchetti del livello [métier] che non sono più necessari:
![]() |
Dobbiamo inoltre modificare il codice del bean [Form.java]:
public class Form {
public Form() {
}
// livello applicativo
private IMetierLocal metier=new Metier();
// campi del modulo
...
La riga 7 istanziava il livello simulato [métier]. Ora deve fare riferimento al livello reale [métier]. Il codice precedente diventa il seguente:
public class Form {
public Form() {
}
// livello applicativo
@EJB
private IMetierLocal metier;
// campi del modulo
Riga 7: l'annotazione @EJB indica al contenitore di servlet che eseguirà il livello web di iniettare nel campo metier del livello 8 l'EJB che implementa l'interfaccia locale IMetierLocal.
Perché l’interfaccia locale IMetierLocal anziché l’interfaccia IMetierRemote? Perché il livello web e il livello EJB vengono eseguiti nella stessa JVM:
![]() |
Le classi del contenitore dei servlet possono fare riferimento direttamente alle classi EJB del contenitore EJB.
Questo è tutto. Il nostro livello web è pronto. La trasformazione è stata semplice perché ci siamo preoccupati di simulare il livello [métier] tramite una classe che rispettava l’interfaccia IMetierLocal implementata dal livello [métier] reale.
11.3. Il progetto NetBeans dell’applicazione aziendale
Un’applicazione aziendale consente la distribuzione simultanea su un server applicativo sia del livello [web] che del livello EJB di un’applicazione, rispettivamente nel contenitore dei servlet e nel contenitore EJB.
Procediamo come segue:
![]() |
- da [1], si crea un nuovo progetto
- in [2], si seleziona la categoria [Maven]
- in [3], si seleziona il tipo [Enterprise Application]
- in [4], si assegna un nome al progetto
![]() |
- in [5], si sceglie Java EE 6
- in [6], un progetto aziendale può comprendere fino a due tipi di moduli:
- un modulo EJB
- un modulo web
È possibile richiedere, contestualmente alla creazione del progetto aziendale, la creazione di questi due moduli, che inizialmente saranno vuoti. Un progetto aziendale serve esclusivamente alla distribuzione dei moduli che ne fanno parte. Al di fuori di questo, è un guscio vuoto. In questo caso, vogliamo distribuire:
- un modulo web esistente [mv-pam-jsf2-alone]. È quindi inutile creare un nuovo modulo web.
- un modulo EJB esistente, ovvero [mv-pam-ejb-metier-dao-eclipselink]. Anche in questo caso, è inutile crearne uno nuovo.
In [6] creiamo un progetto aziendale senza moduli. Aggiungeremo i moduli web e EJB in un secondo momento.
- In [7] sono stati creati due progetti Maven. Il progetto aziendale è quello con il suffisso ear. L’altro progetto è un progetto Maven padre del precedente. Non ce ne occuperemo.
Aggiungiamo il modulo web e il modulo EJB al progetto aziendale:
![]() |
- in [1], aggiunta di una nuova dipendenza,
- in [2], aggiungiamo il progetto EJB [mv-pam-ejb-metier-dao-eclipselink]. Si noti il suo tipo ejb,
- in [3], aggiunta del progetto web [mv-pam-jsf2-ejb]. Si noti il suo tipo war.
Il file [pom.xml] risulta quindi il seguente:
<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>
Prima della distribuzione dell'applicazione aziendale [mv-pam-webapp-ear], ci si assicurerà che il database MySQL [dbpam_eclipselink] esista e sia popolato. Fatto ciò, è possibile distribuire l’applicazione aziendale [mv-pam-webapp-ear]:
![]() |
- in [1], l'applicazione aziendale è stata distribuita
- in [2], l'applicazione aziendale [mv-pam-webapp-ear] è stata distribuita correttamente.
Nel browser viene visualizzata la seguente pagina:
![]() |
- in [1], l'URL richiesto
- in [2], l'elenco dei dipendenti è stato compilato con gli elementi della tabella [Employes] del database dbpam.
Si invita il lettore a ripetere i test della versione web n. 1. Ecco un esempio di esecuzione:












