Struts2 e Netbeans, installare e configurare le versioni più recenti.



ritratto di ngiangregorio

 

Quest'articolo si pone l'obiettivo di fornire un workaround per la configurazione di progetti Web con Netbeans, che supportino il framework Struts2.
Cercando sul web, via Google o altro, ho scoperto che un plugin per netbeans esiste, ma il progetto non viene aggiornato da davvero molto tempo.
C'è un blog, il cui autore fornisce una versione aggiornata del suddetto plugin (utile per Netbeans 6.7 e Struts 2.1.6), che potrebbe essere più che sufficiente per i miei scopi...tuttavia, un pò per curiosità, un pò per testardaggine, mi son creato un workaround per l'installazione e la configurazione di un ambiente sempre aggiornato alle versioni più recenti dei tool che lo compongono.
 
 
 
Velocissima panoramica su Struts2 per coloro che conosco già Struts.
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. 

Gli scopi di quest'articolo sono ben lontani dal volere spiegare le differenze tra Struts e Struts2, argomento sul quale, con una velocissima ricerca su Google, è possibile reperire di tutto e di più.
Tuttavia, alcune di queste differenze sono fondamentali tra i due framework, a mio parere.
   
 
Le Action assumono un ruolo diverso, passano dal Controller al Model e i livelli View riescono a "estrarre" (pull) i dati dalle action, senza necessita' di un ulteriore oggetto al livello di model.
Le componenti su cui si basa il framework, sono sostanzialmente 5:
 
Model
    - Action;
 
Controller    
    - Interceptors;
    - DispatcherFilter;
 
View
    - Result type (dato ritornato);
    - Result view (rappresentazione del dato ritornato);
 
 
    - Value stack\OGNL (moduli che si occupano dell'integrazione delle altre componenti).

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: