Sei sulla pagina 1di 9

JJ n.

3 marzo-aprile 2007

Introduzione a Struts
di Andrea Colleoni
` Struts e un framework completo e diffuso e offre le basi per sviluppare in modo organico le applicazioni web

Andrea Colleoni Andrea Colleoni si occupa professionalmente di sviluppo di software dal 1996 e di Java dal 2000. Attualmente ` svolge lattivita di consulente attraverso la ` sua societa, coordinando gruppi di lavoro su progetti software di dimensioni medie o grandi in ambito nanziario/bancario e industriale.

pubblicato su WWW.INFOMEDIA.IT stampa digitale da Lulu Enterprises Inc. stores.lulu.com/infomedia


Infomedia
` Infomedia e limpresa editoriale che da quasi venti anni ha raccolto la voce dei programmatori, dei sistemisti, dei professionisti, degli studenti, dei ricercatori e dei professori dinformatica italiani. Sono pi` di 800 gli autori che hanno realizzato per le teu state Computer Programming, Dev, Login, Visual Basic Journal e Java Journal, molte migliaia di articoli tecnici, presentazioni di prodotti, tecnologie, protocolli, strumenti di lavoro, tecniche di sviluppo e semplici trucchi e stratagemmi. Oltre 6 milioni di copie distribuite, trentamila pagine stampate, fanno di questa impresa la pi` grande ed u inuente realt` delleditoria specializzata nel campo della a programmazione e della sistemistica. In tutti questi anni le riviste Infomedia hanno vissuto della passione di quanti vedono nella programmazione non solo la propria professione ma unattivit` vitale e un vero a divertimento. ` Nel 2009, Infomedia e cambiata radicalmente adottando ` un nuovo modello aziendale ed editoriale e si e organizzata attorno ad una idea di Impresa Sociale di Comunit` , a partecipata da programmatori e sistemisti, separando le attivit` di gestione dellinformazione gestite da un board a comunitario professionale e quelle di produzione gesti` te da una impresa strumentale. Questo assetto e in linea con le migliori esperienze internazionali e rende Infomedia ancora di pi` parte della Comunit` nazionale degli u a sviluppatori di software. ` Infomedia e media-partner di manifestazioni ed eventi in ambito informatico, collabora con molti dei pi` imporu tanti editori informatici italiani come partner editoriale e fornitore di servizi di localizzazione in italiano di testi in lingua inglese.

Limpaginazione automatica di questa rivista e realizzata al ` 100% con strumenti Open Source usando OpenOffice, Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp, Python e BASH

For copyright information about the contents of Java Journal, please see the section Copyright at the end of each article if exists, otherwise ask authors. Infomedia contents is 2007 Infomedia and released as Creative Commons 2.5 BY-NC-ND. Turing Club content is 2007 Turing Club released as Creative Commons 2.5 BY-ND. Le informazioni di copyright sul contenuto di Java Journal sono riportate nella sezione Copyright alla ne di ciascun articolo o vanno richieste direttamente agli autori. Il contenuto Infomedia e 2007 Infomedia e rila` sciato con Licenza Creative Commons 2.5 BY-NC-ND. Il contenuto Turing Club e 2007 Turing Club e rilasciato ` con Licenza Creative Commons 2.5 BY-ND. Si applicano tutte le norme di tutela dei marchi e dei segni distintivi. ` E in ogni caso ammessa la riproduzione parziale o totale dei testi e delle immagini per scopo didattico purch e vengano integralmente citati gli autori e la completa identicazione della testata. Manoscritti e foto originali, anche se non pubblicati, non si restituiscono. Contenuto pubblicitario inferiore al 45%. La biograa dellautore riportata nellarticolo e sul sito www.infomedia.it e di norma quella disponibi` le nella stampa dellarticolo o aggiornata a cura dellautore stesso. Per aggiornarla scrivere a info@infomedia.it o farlo in autonomia allindirizzo http://mags.programmers.net/moduli/biograa

JAVA Journal

focus

Introduzione a Struts
Struts un framework completo e diffuso e offre le basi per sviluppare in modo organico le applicazioni web
>> di Andrea Colleoni (andrea.colleoni@javajournal.it)

Applicazioni Web e Framework: MVC Le applicazioni web, funzionano tutte seguendo le stesse regole di base e quindi si assomigliano molto fra loro. Pertanto, nata la necessit per gli sviluppatori di queste applicazioni di dotarsi di infrastrutture che costituiscano limpalcatura generale dellapplicazione, le fondamenta del progetto: i framework. Parallelamente, gli ingegneri del software hanno individuato che, in linea generale, alcuni problemi che si presentano nellinformatica sono ricorrenti e ben circoscritti; tipologie di problemi ricorrenti hanno tipologie di soluzione altrettanto ricorrenti: i design pattern. MVC (Model View Controller) un pattern di progetto che si applica alle applicazioni multi tier, come quelle web, e consiste nella separazione netta tra: modello dei dati (il model); controllo del flusso dellapplicazione (il controller); presentazione dei risultati allutente (la view). Struts un framework che aiuta a perseguire la separazione indicata dal pattern MVC e dalla sua evoluzione Model 2, fornendo un controller gi funzionante e una base su cui costruire la view. Struts: quando, dove, come e perch; orientarsi nel sito Struts un progetto sviluppato negli anni dal 2000 al 2001 ed ospitato nel grande contenitore di progetti che lApache Software Foundation. reperibile allindirizzo http://struts.apache.org/. Lapporto principale al suo sviluppo venuto da Craig McClanahan gi principale fautore del progetto

Apache Tomcat ed ora personaggio di spicco nella progettazione di JavaServer Faces dello strato web delle specifiche J2EE. Oggi il popolare framework diviso in due parti: Struts Shale Framework; Struts Action Framewok. Noi ci occuperemo di questultimo che levoluzione del framework originario. Struts non unIDE, non ha un front-end grafico e non costruisce automaticamente applicazioni web. semplicemente una libreria di oggetti gi costruiti che svolgono alcune funzioni di base essenziali per il buon funzionamento di applicazioni web MVC. Struts non lunico framework e non necessariamente il pi valido, ma oggi uno dei pi utilizzati e diffusi. Ha molte estensioni tra cui alcune discretamente diffuse: Tiles, di cui non parleremo, una di queste e fornisce un comodo strumento per costruire la view.

MVC significa ModelView-Controller ed un pattern molto usato

n.3 - marzo/aprile 2007

47

focus

JAVA Journal
Essendo le specifiche Servlet e JSP uno standard, qualunque servlet container adatto, ma in questarticolo ci riferiremo sempre al server Apache Tomcat versione 5.x, reperibile allindirizzo http: //tomcat.apache.org/ e di cui sono disponibili gli installer per Windows o gli archivi compressi, contenenti i file per linstallazione su tutti i sistemi operativi. Nei nostri esempi il server installato sul computer locale (localhost) e sulla porta http di default (80) per cui gli indirizzi saranno nella forma:
http://localhost/struts-examples/welcome.do.

FIGURA 1 la mailreader demo application

Download e utilizzo Allindirizzo http://struts.apache.org/downloads.html sono disponibili per il download sia le release con tutte le librerie compilate e pronte per luso (i cosidetti binary) sia i programmi sorgenti. Nellarchivio struts-x.y.z-bin.zip (oppure tar.gz) contenente le librerie compilate, troviamo le seguenti cartelle: /lib: contiene tutti i file JAR necessari a far funzionare le varie parti del framework, pi tutte le DTD e le definizioni delle tag library utilizzabili; /contrib: contiene unestensione delle tag library di Struts; non ci occuperemo di questa parte /webapps: contiene alcune applicazioni web di esempio che utilizzano Struts, pi unapplicazione web utilizzabile come base di partenza per costruire applicazioni basate su Struts e la documentazione su Struts e Tiles Per far funzionare le applicazioni di esempio, per consultare la documentazione e per provare gli esempi di questo articolo avremo bisogno di un servlet container in cui installare le applicazioni.

Linstallazione delle webapp fornite con Struts pu avvenire copiando i file .WAR nella directory webapps del servlet container, eseguendone un upload dal pannello di amministrazione del servlet container oppure estraendone i file con un programma per la gestione di file compressi tipo WinZip in una sottodirectory di webapps del servlet container. Per gli scopi di questarticolo necessario installare le seguenti applicazioni: struts-documentation.war struts-mailreader.war struts-blank.war

Uno sguardo alle applicazioni di esempio Struts viene fornito con alcune applicazioni di esempio, tra cui struts-mailreader. Esplorando il contenuto allindirizzo http://localhost/struts-mailreader/Welcome.do si accede ad una semplice applicazione di registrazione di informazioni. Tramite un form possibile registrare un utente, per il quale possono poi essere definiti alcuni account di accesso a server di posta. Una volta registrato, un utente, pu rieseguire laccesso e visualizzare lelenco degli account definiti. I dati vengono conservati in un database XML nel file WEB-INF/database.xml.

FIGURA 2

la struts console per editare la configurazione

48

n.3 - marzo/aprile 2007

JAVA Journal
// logon.jsp ... <html:form action=/SubmitLogon focus=username onsubmit=return validateLogonForm(this);> ... <html:text property=username size=16 maxlength=18/> ... <html:password property=password size=16 maxlength=18 redisplay=false/> ... <html:submit property=Submit value=Submit/> ... <html:reset/> ... </html:form> ...
<servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>

focus

Qualunque URL che termini con .do, invoca lActionServlet; quindi, a dispetto di quanto possa sembrare a prima vista, non ci sono file .do nella webapp. Nella sezione delle Tag Libraries, vengono caricate le Tag Libraries di Struts che sono presenti nella cartella WEB-INF. Vediamo il contenuto di una semplice pagina JSP: /index.jsp
<%@ taglib uri=/tags/struts-logic prefix=logic %> <logic:redirect action=/Welcome/>

LISTATO 1 La JSP per la Logincon struts Dando unocchiata pi da vicino, cerchiamo di capire come funziona e quale plus d Struts a questa applicazione. In primo luogo osserviamo il descrittore WEB-INF/web.xml:
// web.xml <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <init-param> <param-name>config</param-name> <param-value> /WEB-INF/struts-config.xml, /WEB-INF/struts-configregistration.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>

Questo frammento di codice consente di registrare luso della Tag library struts-logic allinterno della pagina JSP e quindi di utilizzare il tag redirect di tale libreria per eseguire unazione di redirect. In particolare il browser viene rediretto verso una Action di nome Welcome, che definita nel file di configurazione di Struts. Nella sezione action-mappings del file WEB-INF/strutsconfig.xml, viene definita tra le altre lazione Welcome:
// struts-config.xml <action path=/Welcome type=org.apache.struts.webapp.example.Wel comeAction> <forward name=failure path=/Error.jsp /> <forward name=success path=/welcome.jsp /> </action>

// LogonAction.java ... public ActionForward execute(...) throws Exception { ... String username = (String) PropertyUtils.getSimplePropert y(form, USERNAME); String password = (String) PropertyUtils.getSimplePropert y(form, PASSWORD); ... return (mapping.getInputForward()); ... return (findSuccess(mapping)); } ...

Nella sezione relativa alla definizione dei servlet, viene definito il controller del nostro framework MVC: lActionServlet. LActionServlet viene caricato allavvio e gli vengono passati come parametri due file di configurazione scritti in XML che il servlet caricher allavvio dellapplicazione e di cui vedremo tra poco il contenuto. Per essere invocato dal servlet container, lActionServlet, deve essere associato ad un pattern URL:
// web.xml <servlet-mapping>

LISTATO 2 La Action (java) per la Login con struts

n.3 - marzo/aprile 2007

49

focus

JAVA Journal
ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ... if (messages.size()>0) { ... return findFailure(mapping); } return findSuccess(mapping); } }

FIGURA 3 editiamo una azione

Nel codice, a seconda del successo o meno di alcune Questo frammento della configurazione, noto come istruzioni che non nostro scopo approfondire, possiamo ActionMapping, fa s che quando viene richiesta lURL decidere di uscire con successo o uscire con insuccesso /Welcome.do ( case sensitive, quindi con la W maiuscola), venga creato un oggetto di // La classe TextBean molto semplice: classe WelcomeAction, che istanziato dal fra// ha una propriet di nome text di tipo String mework, ma definito dal programmatore. // accessibile sia in lettura che in scrittura. Il frammento contiene anche la definizione di due forward di nome failure e success. A TextBean.java questi sono associate due pagine JSP, rispetpublic class TextBean { tivamente /Error.jsp e /welcome.jsp. Vediamo private String text; cosa significano queste impostazioni e come public String getText() { funziona unazione Struts. Aprendo il file WEB-INF/src/org/apache/struts/ webapp/example/WelcomeAction.java, a cui si riferisce laction mapping visto sopra, notiamo che lazione estende una classe fornita nellesempio: BaseAction che a sua volta estende la classe del framework Action introducendo rispetto a questultima solo alcuni semplici metodi di utilit. Una volta individuata la classe corrispondente allazione, il framework la istanzia e ne invoca il metodo execute() al quale vengono passati tutti gli oggetti per operare con il contesto web e due oggetti Struts: lActionMapping che rappresenta il contenuto del file di configurazione e lActionForm. Il metodo quindi termina restituendo al framework che lha invocato, un oggetto di tipo ActionForward.
// WelcomeAction.java public final class WelcomeAction extends BaseAction { public ActionForward execute( ActionMapping mapping,

return this.text; } public void setText(String text) { this.text = text; } }

// TextManager ha solo un metodo // che altera il contenuto della // propriet text del bean TextBean TextManager.java public class TextManager { public TextManager() { } public void modifica (TextBean tb) { tb.setText(*** + tb.getText() + ***); } }

LISTATO 3 un semplice JavaBean

50

n.3 - marzo/aprile 2007

JAVA Journal
I metodi findSuccess() e findFailure() sono definiti in BaseAction e facilitano il rintracciamento dei tipici forward success e failure. Nei forward definiti nellaction mapping, viene definito cosa fare in caso di successo e cosa in caso di insuccesso. In caso di successo, nel nostro esempio, viene caricata nel browser la view /welcome.jsp che la pagina che si vede navigando lURL http:/ /localhost/struts-mailreader/Welcome.do, che chiude gli elementi del paradigma MVC. In definitiva uno dei compiti del controller governare il flusso dellapplicazione web attraverso file di configurazione scritti in XML. Il framework offre anche un altro strumento configurabile molto utile: lActionForm. Nel file di configurazione, notiamo che c unazione /Logon.do che fa semplicemente un forward alla pagina /logon.jsp.
<action path=/Logon forward=/logon.jsp/>

focus

// text.jsp <%@ taglib uri=/tags/struts-html prefix=html %> <!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd> <html> <head> <meta http-equiv=Content-Type content=text/html; charset=UTF-8> <title>Form</title> </head> <body> <html:form action=/SubmitAction> Testo: <html:text property=textproperty /><br /> <html:submit /> </html:form> </body> </html>

LISTATO 4 la form che visualizza il bean La classe LogonAction conterr il codice per eseguire lautenticazione utilizzando username e password forniti dal form (Listato 2). Vale anche la pena di osservare che il metodo execute() in grado di ritornare alla pagina di logon in caso di errori, con il metodo mapping.getInputForward() che restituisce il forward definito nellattributo input dellactionmapping.

La pagina /logon.jsp, contiene un form costruito con i tag della libreria HTML di Struts (Listato 1). Anche nel file di configurazione di Struts esiste una rappresentazione di questo form; si trova nella sezione formbeans:
// struts-config.xml <form-bean name=LogonForm type=org.apache.struts.validator.DynaValidatorForm> <form-property name=username type=java.lang.String/> <form-property name=password type=java.lang.String/> </form-bean>

Uno sguardo alla blank application La blank-application contenuta nellarchivio strutsblank.war e contiene lo scheletro di unapplicazione web che funziona con il controller Struts. Ha un web.xml che carica lActionServlet con la configurazione definita nel file struts-config.xml, che inizialmente contiene alcuni esempi ben commentati. Per iniziare a costruire applicazione web con Struts la blank-application fornisce quindi una buona base di partenza. Per interagire con il file di configurazione di Struts, pu essere comodo inizialmente utilizzare uno strumento di supporto grafico che aiuti a ricordare la struttura del file e il suo utilizzo. Un buono strumento in tal senso la Struts console reperibile allindirizzo http: //www.jamesholmes.com/struts/console/ di cui in questo esempio stata usata la versione 4.8. Per iniziare con una nuova applicazione, quindi estrarremo il file struts-blank.war in qualche directory nella quale verranno costruiti tutti i percorsi e i file di default, quindi usando la console struts e un kit di sviluppo per Java procederemo con lo sviluppo di azioni e pagine JSP.

Il contenuto del form pu essere quindi gestito dal framework (in questo caso viene addirittura valicato automaticamente dal framework attraverso luso del DynaValidatorForm) e rappresentato al suo interno come un JavaBean. Lazione /SubmitLogon a cui il form invia le informazioni cos definita:
// struts-config.xml <action path=/SubmitLogon type=org.apache.struts.webapp.example.Lo gonAction name=LogonForm scope=request input=logon> ... </action>

n.3 - marzo/aprile 2007

51

focus

JAVA Journal
// SubmitAction.java import import import import import import import org.apache.struts.action.Action; org.apache.struts.action.ActionForward; org.apache.struts.action.ActionMapping; org.apache.struts.action.ActionForm; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; org.apache.commons.beanutils.PropertyUtils;

public class SubmitAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ActionForward retValue; TextBean tb = new TextBean(); TextManager tm = new TextManager(); tb.setText((String) PropertyUtils.getSimpleProperty(form, textproperty)); tm.modifica(tb); request.setAttribute(risultato, tb); return mapping.findForward(success); } }

LISTATO 5 una action per processare il bean action lazione /SubmitAction che andremo a definire successivamente in struts-config.xml (Listato 4). Usiamo la struts console per costruire il form e mappare lazione. Dal men file apriamo il file struts-config.xml che abbiamo estratto in c:\esempi\struts\WEB-INF ed eseguiamo i seguenti passi: Aggiungiamo un form bean di nome textform e di tipo DynaActionForm ed a questo aggiungiamo una propriet di nome textproperty di tipo String (Figura 2) Ora aggiungiamo unaction-mapping con URL / SubmitAction che usi il form bean che abbiamo appena creato; il tipo di mapping deve essere SubmitAction che il nome della classe che andremo a creare fra poco per gestire lazione (Figura 3) Aggiungiamo nella configurazione del mapping anche un forward che chiameremo success che punti al path /success.jsp: Possiamo salvare lo struts-config.xml, chiudere la struts console e prosegure con leditor Java Ora dobbiamo costruire la nostra classe SubmitAction che preso il valore inserito nel form lo manipola con le classi del model e lo restituisce alla pagina /success.jsp: (Listato 5). Per rendere il risultato disponibile alla pagina view, una tecnica utilizzata quella di valorizzare un attributo delloggetto request, il quale poi verr letto con la libreria di tag di Struts bean.

Struts funziona su un
application server che supporta Servlet e JSP
Costruzione di un semplice esempio Proviamo ora a costruire, partendo dalla blank.application, unapplicazione web che svolga i seguenti compiti: Da una pagina /text.jsp venga offerta la possibilit di inserire del testo Allinvio del form tale testo venga trattato da classi di backend e restituito (Figura 4) Prima di tutto estraiamo con il programma di decompressione il file struts-blank.war in una cartella, ad esempio c: \esempi\struts. Poi con un editor Java creiamo secondo la struttura delle applicazioni web, le classi che rappresentino il nostro model; costruiamo un JavaBean che rappresenti la nostra informazione ed una classe adatta a trattarlo (Listato 3). Creiamo quindi un semplice form usando la libreria HTML di Struts al posto dei normali tag HTML; il form avr come

52

n.3 - marzo/aprile 2007

JAVA Journal

focus

FIGURA 4
// Success.jsp <%@ taglib uri=/tags/struts-bean prefix=bean %> <html> <head> <meta http-equiv=Content-Type content=text/html; charset=UTF-8> <title>JSP Page</title> </head> <body> Il testo contenuto nel JavaBean processato <bean:write name=risultato property=text /> </body> </html>

LISTATO 6 visualizzare il risultato Infine aggiungiamo la pagina success.jsp che deve presentare allutente il risultato del processo avvenuto nel backend (Listato 6). Per installare ed eseguire lesempio necessario compilare il progetto e copiare tutti i file dellapplicazione web contenuti nella cartella c:\esempi\struts nel servlet container. Una volta copiati i file necessari navighiamo allURL http: //localhost/struts-blank/text.jsp. A questo punto, baster inserire del testo nella casella di testo, inviare il form e avremo ottenuto il risultato atteso. Struts in effetti un framework completo e diffuso e offre anche basi per sviluppare organicamente altre parti delle applicazioni web, come il supporto allinternazionalizzazione, alla validazione che in questarticolo abbiamo solo sfiorato. Lavvento di altri validi framework di successo ed il tentativo di standardizzare lo sviluppo di applicazioni MVC condizionano lo sviluppo di Struts ed in effetti la divisione tra lAction Framework e Shale conseguenza di questo fatto. Note Biografiche
Andrea Colleoni si occupa professionalmente di sviluppo di software dal 1996 e di Java dal 2000. Attualmente svolge lattivit di consulente attraverso la sua societ, coordinando gruppi di lavoro su progetti software di dimensioni medie o grandi in ambito finanziario/bancario e industriale prevalentemente con tecnologie legate a J2EE, ma anche con Microsoft.NET. Si occupa anche di formazione; insegna Informatica alla Facolt di Economia dellUniversit di Bergamo e in altri corsi pi specifici organizzati da vari enti di formazione. Vive a Seriate in provincia di Bergamo con mia moglie Elena e la sua piccolina, Greta, arrivata cinque mesi fa.

Conclusioni Nellesempio abbiamo toccato i punti essenziali dellAction Framework che di fatto lelemento architetturale che consente di scrivere applicazioni web secondo il paradigma MVC.

n.3 - marzo/aprile 2007

53