1. Introduzione
Il codice PDF del documento è disponibile |QUI|.
Gli esempi del documento sono disponibili |QUI|.
In questa sede ci proponiamo di introdurre, con l’ausilio di esempi, i concetti fondamentali di Struts 2. 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 si sviluppa un'applicazione web.
I prerequisiti necessari per la comprensione degli esempi sono i seguenti:
- conoscenze di base del linguaggio Java
- conoscenze di base dello sviluppo web, in particolare del linguaggio HTML.
Sul sito [https://developpez.com] sono disponibili tutte le risorse necessarie per soddisfare tali prerequisiti. Ne ho scritte alcune che si possono trovare sul sito [https://tahe.developpez.com].
Per approfondire Struts 2, è possibile consultare i seguenti riferimenti:
- [ref1]: la documentazione di Struts 2 disponibile sul sito di Struts
- [ref2]: il libro "Struts 2 in Action" scritto da Donald Brown, Chad Michael Davis e Scott Stanlick, edito da Manning. Questo libro è particolarmente didattico.
A volte faremo riferimento a [ref2] per indicare al lettore che può approfondire un argomento con questo libro.
Il documento è stato redatto in modo tale da poter essere letto anche senza avere un computer a portata di mano. Per questo motivo sono state inserite numerose schermate.
1.1. Il ruolo di Struts 2 in un’applicazione web
Innanzitutto, collochiamo Struts 2 nel contesto dello sviluppo di un’applicazione web. Nella maggior parte dei casi, questa sarà costruita su un’architettura a più livelli come la seguente:
![]() |
- il livello [web] è il livello a contatto con l’utente dell’applicazione web. Quest’ultimo interagisce con l’applicazione web attraverso pagine web visualizzate da un browser. È in questo livello che si trova Struts 2 ed esclusivamente in questo livello.
- Il livello [metier] implementa le regole di gestione dell’applicazione, come il calcolo di uno stipendio o di una fattura. Questo livello utilizza dati provenienti dall’utente tramite il livello [web] e dal sistema di gestione di database (SGBD) 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). Funge da ponte tra gli oggetti gestiti dal livello [dao] e le righe e le colonne dei dati di un database relazionale.
- L'integrazione dei livelli può essere realizzata tramite un container Spring o EJB3 (Enterprise Java Bean).
La maggior parte degli esempi riportati di seguito utilizzerà un solo livello, ovvero il livello [web]:
![]() |
Questo documento si concluderà tuttavia con la realizzazione di un’applicazione web multistrato:
![]() |
L'insieme dei livelli [metier], [dao], [jpa/hibernate] ci verrà fornito sotto forma di archivio jar, in modo che, ancora una volta, dovremo costruire solo il livello [web].
1.2. Il modello di sviluppo MVC di Struts 2
Struts 2 implementa il modello architetturale denominato MVC (Modello – Vista – Controller) nel modo seguente:
![]() |
L’elaborazione di una richiesta da parte di un client avviene nel modo seguente:
I 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 di Struts 2, altrimenti viene rifiutato. Un'azione è definita in un file XML nel formato seguente:
Nell’esempio precedente, supponiamo che venga richiesta l’azione URL [ http://machine:port/contexte/actions/Action1]. Vengono quindi eseguiti i seguenti passaggi:
-
richiesta: il browser del cliente invia una richiesta al controller [FilterDispatcher]. Quest’ultimo gestisce tutte le richieste dei clienti. È il punto di ingresso dell’applicazione. È la «C» di MVC.
-
Elaborazione
- il controller C consulta il proprio file di configurazione e rileva che l’azione actions/Action1 esiste. Il valore namespace (riga 1), concatenato con il nome dell’azione (attributo name della riga 2), definisce l’azione actions/Action1.
- Il controller C istanzia [2a], una classe di tipo [actions.Action1] (attributo class della riga 2). Il nome e il pacchetto di questa classe possono essere qualsiasi cosa.
- Se la classe URL richiesta è accompagnata da parametri di tipo [param1=val1¶m2=val2&...], allora il controller C assegna tali parametri alla classe [actions.Action1] nel modo seguente:
È quindi necessario che la classe [actions.Action1] disponga di questi metodi setParami per ciascuno dei parametri parami previsti.
- (continua)
- il controller C richiede l’esecuzione del metodo di firma [String execute()] della classe [actions.Action1]. Quest’ultimo può quindi utilizzare i parametri parami che la classe ha recuperato. Durante l’elaborazione della richiesta dell’utente, potrebbe aver bisogno dei livelli [metier] e [2b]. Una volta elaborata la richiesta del cliente, può generare diverse risposte. Un esempio classico è:
- una pagina di errore se la richiesta non è stata elaborata correttamente
- una pagina di conferma in caso contrario
- il controller C richiede l’esecuzione del metodo di firma [String execute()] della classe [actions.Action1]. Quest’ultimo può quindi utilizzare i parametri parami che la classe ha recuperato. Durante l’elaborazione della richiesta dell’utente, potrebbe aver bisogno dei livelli [metier] e [2b]. Una volta elaborata la richiesta del cliente, può generare diverse risposte. Un esempio classico è:
Il metodo execute restituisce al controller C un risultato di tipo stringa denominato 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à inoltre il modello M [2c] che verrà utilizzato dalla pagina JSP, la quale verrà inviata come risposta all’utente. Questo modello può contenere elementi di:
- (continua)
- la classe [actions.Action1] istanziata
- la sessione dell'utente
- dati nell'ambito Application
- …
- risposta: il controller C richiede che venga visualizzata la pagina JSP corrispondente alla chiave di navigazione [3]. Si tratta della vista, la V di MVC. La pagina JSP utilizza un modello M per inizializzare le parti dinamiche della risposta che deve inviare al client.
Ora precisiamo il legame tra l’architettura web MVC e l’architettura a livelli. Si tratta infatti di due concetti diversi che talvolta vengono confusi. Prendiamo un’applicazione web Struts 2 a un livello:
![]() |
Se implementiamo il livello [web] con Struts 2, avremo sì un’architettura web MVC, ma non un’architettura a più livelli. In questo caso, il livello [web] si occuperà di tutto: presentazione, logica di business, accesso ai dati. Con Struts 2, saranno le classi di tipo [Action] a svolgere questo lavoro.
Consideriamo ora un’architettura web multistrato:
![]() |
Il livello [web] può essere implementato senza framework e senza seguire il modello MVC. Si ha quindi effettivamente un’architettura multistrato, ma il livello web non implementa il modello MVC.
In MVC abbiamo detto che il modello M è quello della vista V, c.a.d, ovvero l’insieme dei dati visualizzati dalla vista V. A volte (spesso) viene fornita un’altra definizione del modello M di MVC:
![]() |
Molti autori ritengono che ciò che si trova a destra del livello [web] costituisca il modello M del MVC. Per evitare ambiguità, si può parlare:
- del modello di dominio quando si indica tutto ciò che si trova a destra dello strato [présentation]
- del modello della vista quando si indicano i dati visualizzati da una vista V
Di seguito, il termine "modello M" indicherà esclusivamente il modello di una vista V.
1.3. Gli strumenti utilizzati
Di seguito, utilizziamo (dicembre 2011)
- NetBeans 7.01, disponibile all'indirizzo URL [http://www.netbeans.org]
- il plugin Struts 2 per NetBeans 7.01 disponibile all'indirizzo URL [http://plugins.netbeans.org/plugin/39218]
- la versione 2.2.3 di Struts 2 è disponibile all'indirizzo URL [http://struts.apache.org/]
Si noti che per sviluppare gli esempi che seguiranno sono indispensabili solo le librerie di Struts 2 disponibili all'indirizzo URL [http://struts.apache.org/]. NetBeans può essere sostituito da un altro IDE (Eclipse, JDeveloper, IntelliJ, ...) e il plugin Struts 2 serve solo a semplificare il lavoro dello sviluppatore. Anche questo non è indispensabile.
1.3.1. IDE NetBeans
Sul sito di download di NetBeans, scegliamo la versione Java EE:

1.3.2. Plugin Struts 2
A seconda delle versioni di NetBeans, questo plugin non è sempre stato disponibile. A dicembre 2011, lo si trova all'indirizzo URL [http://plugins.netbeans.org]. Questo URL permette di conoscere i diversi plugin disponibili per NetBeans. È possibile filtrare i risultati della ricerca. In [1], si possono cercare i plugin che contengono la parola "struts" nel loro nome.
![]() |
- si segue il link [2]
![]() |
Si scarica il plugin e lo si decomprime [2]. Per integrarlo in NetBeans, si può procedere come segue:
- si avvia NetBeans
![]() |
- in [1], selezionare il menu Tools/Plugins
- nella scheda [2], utilizzare il pulsante [3]
- in [4], selezionare i file .nbm dei plugin scaricati. In questo caso, scegliamo le librerie di Struts versione 2.2.3 anziché quelle di Struts 2.0.14
- Tornando alla scheda [2], si installano i plugin selezionati con il pulsante [5].
L’installazione dei plugin richiede spesso il riavvio di NetBeans.
1.3.3. Le librerie Struts 2
Se è stato scaricato il plugin Struts 2 per NetBeans, si dispone delle principali librerie di Struts ma non di tutte. Di seguito, avremo bisogno di alcune librerie disponibili sul sito di Struts 2 [http://struts.apache.org/].
![]() |
Seguiamo il link [1] e poi il link [2] per scaricare il file zip della distribuzione 2.2.3.1. Una volta decompressa la distribuzione, le librerie necessarie a Struts si trovano nella cartella [lib] [3] della distribuzione. Ce ne sono diverse decine e ci si chiede quindi quali siano indispensabili. È qui che il plugin di Struts ci aiuterà.










