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:
Nell'esempio precedente, supponiamo che venga richiesta l'URL [http://machine:port/contexte/actions/Action1]. Vengono quindi eseguiti i seguenti passaggi:
- 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.
- 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¶m2=val2&...], il controller C assegna questi parametri alla classe [actions.Action1] come segue:
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
- ...
- 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:

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à.










