Skip to content

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:

Image