11. Versione 6 - Integrazione del livello web in un'architettura JSF/EJB a tre livelli
11.1. Architettura dell'applicazione
L'architettura della precedente applicazione web era la seguente:
![]() |
Sostituiamo il livello [business] simulato con i livelli [business, DAO, JPA] implementati dagli EJB nella Sezione 7.1:
![]() |
11.2. Il progetto NetBeans per il livello web
Il progetto NetBeans per la versione Web 2 viene creato copiando il progetto precedente:
![]() |
- [1]: Copia il nuovo progetto e incollalo nella scheda [Progetti],
- [2]: assegnare un nome e impostare la cartella,
- [3]: il progetto è stato creato,
Il nuovo progetto ha lo stesso nome di quello precedente. Modifichiamo questo:
![]() |
- [4]: Rinominare il progetto,
- [5]: Modifica sia il nome che l'artifactID.
Dobbiamo apportare alcune modifiche per adattare questo livello web al suo nuovo ambiente: il livello [business] simulato deve essere sostituito dal livello [business, DAO, JPA] del server realizzato nella Sezione 7.1. Per farlo, procediamo in due modi:
- rimuoviamo i pacchetti [exception, business, jpa] presenti nel progetto precedente.
- Per compensare questa rimozione, aggiungiamo il progetto del server EJB realizzato nella Sezione 7.1 alle dipendenze del progetto web.
![]() |
- In [1], aggiungiamo una dipendenza al progetto,
- in [2], selezioniamo il progetto Maven per il livello [business]. In [3], ne specifichiamo il tipo, mentre in [4] ne indichiamo l'ambito. L'ambito è impostato su `provided` per indicare che sarà fornito al modulo web dal suo ambiente di esecuzione. Vedremo tra poco che sarà fornito da un'applicazione aziendale,
- in [5], la dipendenza è stata aggiunta.
Il file [pom.xml] risulta quindi il seguente:
private boolean viewInfosIsRendered;
Ora possiamo rimuovere dal livello [business] i pacchetti che non sono più necessari:
![]() |
Dobbiamo anche modificare il codice nel 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>
La riga 7 ha istanziato il livello [business] simulato. Ora deve fare riferimento al livello [business] effettivo. Il codice precedente diventa il seguente:
public class Form {
public Form() {
}
// business layer
private IMetierLocal metier=new Metier();
// form fields
...
Riga 7: L'annotazione @EJB indica al contenitore servlet — che eseguirà il livello web — di iniettare l'EJB che implementa l'interfaccia locale IMetierLocal nel campo business alla riga 8.
Perché l'interfaccia locale IMetierLocal anziché l'interfaccia IMetierRemote? Perché il livello web e il livello EJB girano nella stessa JVM:
![]() |
Le classi nel contenitore servlet possono fare riferimento direttamente alle classi EJB nel contenitore EJB.
Ecco fatto. Il nostro livello web è pronto. La trasformazione è stata semplice perché ci siamo preoccupati di simulare il livello [business] utilizzando una classe conforme all'interfaccia IMetierLocal implementata dal vero e proprio livello [business].
11.3. Il progetto NetBeans per l'applicazione aziendale
Un'applicazione enterprise consente la distribuzione simultanea del livello [web] e del livello EJB di un'applicazione su un server applicativo, rispettivamente nel contenitore servlet e nel contenitore EJB.
Procediamo come segue:
![]() |
- in [1], creiamo un nuovo progetto
- in [2], selezioniamo la categoria [Maven]
- in [3], selezioniamo il tipo [Enterprise Application]
- in [4], diamo un nome al progetto
![]() |
- In [5], scegliamo Java EE 6
- In [6], un progetto aziendale può includere fino a due tipi di moduli:
- un modulo EJB
- un modulo web
Quando si crea il progetto enterprise, è possibile richiedere la creazione di questi due moduli, che inizialmente saranno vuoti. Un progetto enterprise viene utilizzato esclusivamente per distribuire i moduli che contiene. Oltre a ciò, è un guscio vuoto. Qui, vogliamo distribuire:
- un modulo web esistente [mv-pam-jsf2-alone]. Pertanto, non è necessario creare un nuovo modulo web.
- un modulo EJB esistente [mv-pam-ejb-metier-dao-eclipselink]. Anche in questo caso, non è necessario crearne uno nuovo.
In [6], creiamo un progetto enterprise senza moduli. Aggiungeremo i suoi moduli web ed EJB in seguito.
- In [7] sono stati creati due progetti Maven. Il progetto enterprise è quello con il suffisso .ear. L'altro progetto è un progetto Maven padre del primo. Non ci occuperemo di esso.
Aggiungiamo il modulo web e il modulo EJB al progetto enterprise:
![]() |
- In [1], aggiungere una nuova dipendenza,
- in [2], aggiungi il progetto EJB [mv-pam-ejb-metier-dao-eclipselink]. Nota il suo tipo EJB,
- in [3], aggiungi il progetto web [mv-pam-jsf2-ejb]. Nota che il suo tipo è war.
Il file [pom.xml] risulta quindi il seguente:
public class Form {
public Form() {
}
// business layer
@EJB
private IMetierLocal metier;
// form fields
Prima di distribuire l'applicazione aziendale [mv-pam-webapp-ear], assicurarsi che il database MySQL [dbpam_eclipselink] esista e sia popolato. Una volta 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 con successo.
Nel browser viene visualizzata la seguente pagina:
![]() |
- in [1], l'URL richiesto
- in [2], l'elenco dei dipendenti è stato popolato con le voci della tabella [Employees] nel database dbpam.
Si invita il lettore a ripetere i test della versione Web 1. Ecco un esempio dell'esecuzione:












