Skip to content

1. Introduzione

Il PDF del documento è disponibile |QUI|.

Gli esempi tratti dal documento sono disponibili |QUI|.

In questa sede, intendiamo introdurre i concetti chiave di Struts 2 utilizzando degli esempi. Struts 2 è un framework web che fornisce:

  • una serie di librerie sotto forma di file JAR
  • un framework di sviluppo: Struts 2 influenza il modo in cui viene sviluppata un'applicazione web.

I prerequisiti per comprendere gli esempi sono i seguenti:

  • conoscenza di base del linguaggio Java
  • conoscenza di base dello sviluppo web, in particolare dell'HTML.

Tutte le risorse necessarie per soddisfare questi prerequisiti sono disponibili sul sito web [https://developpez.com]. Ne ho scritte alcune, che si possono trovare sul sito web [https://stahe.github.io].

Gli esempi contenuti in questo documento sono disponibili [QUI].

Per saperne di più su Struts 2, è possibile consultare i seguenti riferimenti:

  • [rif1]: la documentazione di Struts 2, disponibile sul sito web di Struts
  • [rif2]: il libro "Struts 2 in Action" di Donald Brown, Chad Michael Davis e Scott Stanlick, pubblicato da Manning. Questo libro è particolarmente istruttivo.

Di tanto in tanto faremo riferimento a [ref2] per far sapere al lettore che può approfondire un argomento utilizzando questo libro.

Questo documento è stato scritto in modo da poter essere letto senza avere un computer a portata di mano. Pertanto, includiamo molte schermate.

1.1. Il ruolo di Struts 2 in un'applicazione web

Per prima cosa, collochiamo Struts 2 nel contesto dello sviluppo di un'applicazione web. Molto spesso, essa sarà basata su un'architettura a più livelli come la seguente:

  • Il livello [web] è quello a contatto con l'utente dell'applicazione web. L'utente interagisce con l'applicazione web attraverso le pagine web visualizzate da un browser. È in questo livello che risiede Struts 2, e solo in questo livello.
  • Il livello [business] implementa la logica di business dell'applicazione, come il calcolo di uno stipendio o di una fattura. Questo livello utilizza i dati provenienti dall'utente tramite il livello [web] e dal DBMS tramite il livello [DAO].
  • Il livello [DAO] (Data Access Objects), il livello [JPA] (Java Persistence API) e il driver JDBC gestiscono l'accesso ai dati del DBMS. Il livello [JPA] funge da ORM (Object-Relational Mapper). Agisce come ponte tra gli oggetti gestiti dal livello [DAO] e le righe e le colonne di dati in un database relazionale.
  • L'integrazione dei livelli può essere ottenuta utilizzando un contenitore Spring o EJB3 (Enterprise JavaBeans).

La maggior parte degli esempi forniti di seguito utilizzerà un solo livello, il livello [web]:

Tuttavia, questo documento si concluderà con la realizzazione di un'applicazione web multistrato:

I livelli [business], [DAO] e [JPA/Hibernate] ci verranno forniti come archivio JAR, in modo che, ancora una volta, dovremo occuparci solo della realizzazione del livello [web].

1.2. Il modello di sviluppo MVC di Struts 2

Struts 2 implementa il modello architettonico MVC (Model–View–Controller) come segue:

L'elaborazione di una richiesta del client procede come segue:

Gli URL richiesti hanno il formato http://machine:port/contexte/rep1/rep2/.../Action. Il percorso [/rep1/rep2/.../Action] deve corrispondere a un'azione definita in un file di configurazione Struts 2; in caso contrario, viene rifiutato. Un'azione è definita in un file XML nel seguente formato:

1
2
3
4
5
6
<package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="page1">/vues/Page1.jsp</result>
      <result name="page2">/vues/Page2.jsp</result>
    </action>
</package>

Nell'esempio precedente, supponiamo che venga richiesta l'URL [http://machine:port/contexte/actions/Action1]. Vengono quindi eseguiti i seguenti passaggi:

  1. richiesta - il client browser effettua una richiesta al controller [FilterDispatcher]. Il controller gestisce tutte le richieste del client. È il punto di ingresso dell'applicazione. È la C in MVC.
  1. elaborazione
  • Il controller C consulta il proprio file di configurazione e rileva l'esistenza dell'azione actions/Action1. Lo spazio dei nomi (riga 1) concatenato al nome dell'azione (attributo name alla riga 2) definisce l'azione actions/Action1.
  • Il controller C istanzia [2a] una classe di tipo [actions.Action1] (attributo class alla riga 2). Il nome e il pacchetto di questa classe possono essere qualsiasi cosa.
  • Se l'URL richiesto include parametri della forma [param1=val1&param2=val2&...], il controller C assegna questi parametri alla classe [actions.Action1] come segue:
[actions.Action1].setParami(valeuri) ;

Pertanto, la classe [actions.Action1] deve disporre di metodi setParami per ciascuno dei parametri parami previsti.

  • Il controller C chiama il metodo con la firma [String execute()] della classe [actions.Action1] per l'esecuzione. Questo metodo può quindi utilizzare i parametri parami che la classe ha recuperato. Durante l'elaborazione della richiesta dell'utente, potrebbe essere necessario il livello [business] [2b]. Una volta elaborata la richiesta del client, è possibile generare varie risposte. Un esempio classico è:
  • una pagina di errore se la richiesta non è stata elaborata correttamente
  • una pagina di conferma in caso contrario

Il metodo execute restituisce al controller C un risultato di tipo stringa, noto come chiave di navigazione. Nell'esempio sopra riportato, [*actions.Action1*].*execute può generare due chiavi di navigazione: "page1" (riga 3) e "page2" (riga 4). Il metodo [actions.Action1].execute aggiornerà anche il modello M* [2c] che verrà utilizzato dalla pagina JSP inviata in risposta all'utente. Questo modello può contenere elementi di:

  • la classe [actions.Action1] istanziata
  • la sessione dell'utente
  • dati dell'ambito dell'applicazione
  • ...
  1. risposta - il controller C istruisce la pagina JSP corrispondente al tasto di navigazione a visualizzare [3]. Questa è la vista, la V in MVC. La pagina JSP utilizza un modello M per inizializzare le parti dinamiche della risposta che deve inviare al client.

Ora, chiariamo la relazione tra l'architettura web MVC e l'architettura a livelli. In realtà, si tratta di due concetti diversi che a volte vengono confusi. Prendiamo un'applicazione web Struts 2 a livello singolo:

Se implementiamo il livello [web] con Struts 2, avremo effettivamente un'architettura web MVC ma non un'architettura a più livelli. In questo caso, il livello [web] gestirà tutto: presentazione, logica di business e accesso ai dati. Con Struts 2, sono le classi [Action] a svolgere questo lavoro.

Ora, consideriamo un'architettura web multistrato:

Il livello [web] può essere implementato senza un framework e senza seguire il modello MVC. Abbiamo quindi un'architettura a più livelli, ma il livello web non implementa il modello MVC.

In MVC, abbiamo detto che il modello M è quello della vista V, ovvero l'insieme dei dati visualizzati dalla vista V. A volte (spesso), viene fornita un'altra definizione del modello M in MVC:

Molti autori ritengono che ciò che si trova a destra del livello [web] costituisca il modello M dell'MVC. Per evitare ambiguità, possiamo fare riferimento al:

  • il modello di dominio quando ci si riferisce a tutto ciò che si trova a destra del livello [di presentazione]
  • il modello di vista quando ci si riferisce ai dati visualizzati da una vista V

D'ora in poi, il termine "modello M" si riferirà esclusivamente al modello di una vista V.

1.3. Gli strumenti utilizzati

Andando avanti, stiamo utilizzando (dicembre 2011)

  • l'IDE NetBeans 7.01 disponibile all'indirizzo [http://www.netbeans.org]
  • il plugin Struts 2 per NetBeans 7.01, disponibile all'indirizzo [http://plugins.netbeans.org/plugin/39218]
  • Struts 2 versione 2.2.3, disponibile all'indirizzo [http://struts.apache.org/]

Si noti che per sviluppare gli esempi che seguono sono necessarie solo le librerie Struts 2 disponibili all'indirizzo [http://struts.apache.org/]. NetBeans può essere sostituito da un altro IDE (Eclipse, JDeveloper, IntelliJ, ecc.), e il plugin Struts 2 serve solo a semplificare la vita dello sviluppatore. Non è essenziale.

1.3.1. IDE NetBeans

Sul sito di download di NetBeans, selezioniamo la versione Java EE:

Image

1.3.2. Plugin Struts 2

A seconda della versione di NetBeans, questo plugin non è sempre stato disponibile. A partire da dicembre 2011, è reperibile all'URL [http://plugins.netbeans.org]. Questo URL elenca i vari plugin disponibili per NetBeans. È possibile filtrare la ricerca. In [1], cerchiamo i plugin che contengono la parola "struts" nel loro nome.

  • Seguire il link [2]

Scarica il plugin e decomprimilo [2]. Per integrarlo in NetBeans, procedi come segue:

  • Avvia NetBeans
  • In [1], seleziona il menu Strumenti/Plugin
  • Nella scheda [2], fare clic sul pulsante [3]
  • In [4], selezionare i file .nbm relativi ai plugin scaricati. In questo caso, scegliamo le librerie Struts 2.2.3 anziché quelle per Struts 2.0.14
  • Torna alla scheda [2] e installa i plugin selezionati utilizzando il pulsante [5].

L'installazione dei plugin richiede spesso il riavvio di NetBeans.

1.3.3. Le librerie Struts 2

Se avete scaricato il plugin Struts 2 per NetBeans, disponete delle librerie Struts principali ma non di tutte. In seguito, avremo bisogno di alcune librerie disponibili sul sito web di Struts 2 [http://struts.apache.org/].

Seguite il link [1] e poi il link [2] per scaricare il file zip della versione 2.2.3.1. Una volta decompressa la distribuzione, le librerie richieste da Struts si trovano nella cartella [lib] [3] della distribuzione. Ce ne sono decine, quindi sorge la domanda: quali sono essenziali? È qui che il plugin Struts ci aiuterà.