L'innovazione più rivoluzionaria che apporta Struts2 è, senza ombra di dubbio, relativa al metodo principale contenuto in ogni action: il metodo execute().
Questo metodo infatti, a differenza dell'implementazione originaria di Struts, non contiene parametri;
e quindi verrebbe da chiedersi: come accedere agli oggetti con cui hai bisogno di lavorare?
In Struts ciò è possibile tramite il form bean, l'ActionForm. In Struts2 questo avviene grazie a un pattern particolare, noto come inversion control o dependency injection.
Non ho nessuna pretesa di dilungarmi in una spiegazione teorica di questo pattern, ma per i più curiosi, consiglio vivamente di leggersi quest'articolo, di Martin Fowler.
Ad ogni modo, si tratta del pattern per cui è famoso Spring.
Struts2 aderisce a un'interpretazione evoluta del paradigma MVC: pull-MVC.
Chi lavora con struts sa benissimo che uno dei file fondamentali per la configurazione del framework è il web.xml. E' proprio lì dentro infatti che vengono definiti i riferimenti ai vari moduli componenti il framework.
Ora passiamo alla parte pratica.
Creazione di un progetto web con Struts2, in netbeans
Il primo passo è creare un nuovo progetto con Netbeans:
File --> New --> Project
Da Categories, selezionare Java Web e, a sinistra, Web Application. Quindi Next.
Nella schermata successiva, assegnare un nome al progetto, quindi scegliere un Application Server e nell'ultima schermata non spuntare il supporto per Struts. Quindi Finish.
A questo punto aggiungere le librerie al progetto: click col destro su Libraries e Add Jar\Folder. Ora occorre scegliere le librerie di Struts da includere nel progetto, personalmente consiglio di iniziare includendo solo quelle essenziali:
struts2-core.jar
xwork.jar
ognl.jar
freemarker.jar
commons-logging.jar
--------------------
commons-io.jar
commons-fileupload.jar
Pare non sia una buona idea aggiungerle tutte, poichè generano conflitti. Le ultime due librerie sono diventate essenziali a partire dalla versione 2.1 di Struts, indagherò sul perchè.
Creazione del file web.xml
Il passo successivo consiste nella creazione del file web.xml.
In particolare, il tutto viene gestito tramite la definizione di filtri. E' necessario aggiungere una entry per il FilterDispatcher: è la classe che agisce da servlet filter, inizializza il framework e gestisce le richieste.
Si può comodamente modificare il file usando il tab General, così:
Aprirlo, selezionare il tab Filters --> Add Filters Element
In filter name digitare: Struts2
In filter class, dovremmo digitare la classe FilterDispatcher, che si occupa di filtrare le request. Ma nell'API di questa classe, si legge:
"Since Struts 2.1.3, use StrutsPrepareAndExecuteFilter instead or StrutsPrepareFilter and StrutsExecuteFilter if needing using the ActionContextCleanUp filter in addition to this one"
E quindi, da Struts 2.1.3, nel web.xml in filter class va aggiunto:
apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
Il perchè è ancora un mistero per me, almeno finchè non viene aggiornata la documentazione a disposizione, per le versioni successive alla 2.1.3.
In Filter Mapping, apply to URL: /*
L'xml finale dovrebbe essere:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>Struts2</filter-name>
<filter-class>apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Creazione del file struts.xml
Il file struts.xml, nella versione 2 di Struts, sostituisce lo struts-config.xml. Eccone il template, per un semplicissimo progetto:
Posizionarsi nella cartella Source package e creare un nuovo file xml con un click col destro, quindi digitare:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="default" extends="struts-default">
</package>
</struts>
Ho riscontrato problemi nel deploy e ho risolto creando manualmente una directory di nome classes dentro la WEB-INF (lo si può fare da Netbeans) e mettendo lì dentro il file struts.xml.
Ora è tutto pronto per far girare un'applicazione di esempio. Sarebbe molto interessante approfondire altre tematiche di configurazione di Struts, per esempio i file di properties. Ma in questo contesto, si possono lasciare vuoti.
Per la creazione di un classico HelloWorld con Struts2, vi rimando alla guida sul sito ufficiale.
Una versione in inglese di quest'articolo è disponibile sul mio nuovissimo blog:
nickgiango.blogspot.com/2010/01/struts2-and-netbeans-configuring-latest.html
Riferimenti:
http://www.infoq.com/minibooks/starting-struts2
https://nbstruts2support.dev.java.net/servlets/ProjectDocumentList
http://hantsy.blogspot.com/


