Skip to content

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:

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’azione URL [ http://machine:port/contexte/actions/Action1]. Vengono quindi eseguiti i seguenti passaggi:

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

  2. 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&param2=val2&...], allora il controller C assegna tali parametri alla classe [actions.Action1] nel modo seguente:
[actions.Action1].setParami(valeuri) ;

È 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 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
  1. 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:

Image

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