Java User Group Marche http://www.jugancona.org – [email protected] Progetto Jug4Tenda WORK IN PROGRESS di Andrea Del Bene Indice generale Progetto Jug4Tenda.......................................................................................................1 Nota.......................................................................................................................2 1Configurazione ambiente di lavoro ed esecuzione del progetto..............................3 1.1Requisiti software ............................................................................................3 1.1.1Installazione Java JDK................................................................................3 1.1.2Installazione MySql....................................................................................4 1.1.3Installazione di Eclipse e Tomcat..............................................................4 1.2Test e configurazione dell'installazione MySql.................................................4 1.3Scaricare con Eclipse il sorgente dal repository CVS del progetto..................5 1.4Struttura delle cartelle.....................................................................................8 1.5Costruzione del database..................................................................................9 1.6Il file dbParamters.properties.........................................................................10 1.7Configurazione Tomcat in eclipse...................................................................12 2Il processo di sviluppo...........................................................................................17 2.1Prima fase: i meeting......................................................................................17 2.2Seconda fase: tracciatura dei requisiti...........................................................17 2.3Terza fase: sviluppo........................................................................................17 2.4Quarta fase: commit delle modifiche..............................................................18 2.5Quinta fase: branching del sorgente...............................................................18 2.6Manutenzione: correzione bug sulla versione in produzione.........................19 2.7Diagramma di attività delle fasi descritte.......................................................19 2.8Mappa delle tecnologie usate.........................................................................20 3Architettura e codice ............................................................................................21 3.1ATTENZIONE!!...............................................................................................21 3.2Nota................................................................................................................21 3.3Il file web.xml.................................................................................................21 3.4Spring MVC....................................................................................................22 3.5Codice di ospiteController..............................................................................25 Andrea Del Bene – Progetto Jug4Tenda 1 / 26 Java User Group Marche http://www.jugancona.org – [email protected] Nota Come modello per questo documento è stato preso il template dei documenti Write di OpenOffice disponibile sul sito dello JUG Sardegna. Si ringrazia il JUG Sardegna per la cortese collaborazione. Il documento è in costante aggiornamento e il paragrafo 3 Architettura e codice è ancora incompleto. Se ci sono domande/dubbi urgenti sul codice sorgente o sull'architettura si possono porre le proprie domande sul forum del progetto (previa iscrizione) o mandando una mail alla mailing list di sviluppo [email protected] o ancora più comodamente ad [email protected]. L'autore di questa guida (Andrea Del Bene) è presente anche su Facebook per coloro che vogliano interagire usando questo network. Andrea Del Bene – Progetto Jug4Tenda 2 / 26 Java User Group Marche http://www.jugancona.org – [email protected] 1 Configurazione ambiente di lavoro ed esecuzione del progetto. 1.1 Requisiti software Per iniziare a lavorare sul progetto Jug4Tenda occorre procurarsi i seguenti programmi: 1.1.1 1. Java JDK (versione 5.0 o superiore) 2. MySql (versione 5.0 o superiore) 3. Tomcat ( versione 5 o superiore) 4. Eclipse (versione 3.3 o superire) Installazione Java JDK Sotto ambiente Windows Java è disponibile come installatore eseguibile all'indirizzo http://java.sun.com/javase/downloads/index.jsp. Sotto ambiente Linux può essere installato l'OpenJDK se disponibile nei repository ufficiali delle varie distribuzioni. Di seguito riportiamo le istruzioni per installare il JDK scaricato all'indirizzo sopra indicato per Windows su un sistema Linux Debian. Le istruzioni sono riprese dal sito dello Jug Sardegna Alla pagina del download si sceglie la distribuzioni a seconda del proprio hardware e del proprio sistema operativo. Nel nostro esempio useremo il file jdk-6u11-linux-i586.bin. Scaricato il file spostiamolo nella cartella di installazione, ad esempio /usr/local, usando il comando: sudo mv jdk-6u11-linux-i586.bin /usr/local Ora ci spostiamo nella cartella di installazione e lanciamo l'installatore dopo aver reso il file eseguibile: cd /usr/local chmod +x jdk-6u11-linux-i586.bin sudo sh jdk-6u11-linux-i586.bin L'installatore ci chiederà di accettare la licenza. Terminata l'installazione si può cancellare l file jdk-6u11-linux-i586.bin. L'installazione è completa ma occorre indicare al sistema che la distribuzione java da usare è quella appena installata. Il comando seguente serve proprio ad “avvisare” Linux che c'è una nuova distribuzione Java nel sistema: sudo update-alternatives --install /usr/bin/java java /usr/local/jdk1.6.0_11/bin/java 300 La sottocartella jdk1.6.0_11 è volutamente evidenziata perchè è stata creata dall'installatore e riporta la versione correntemente installata. Per concludere dobbiamo impostare il nuovo jdk come implementazione di default: sudo update-alternatives --config java Questo comando mostrerà tutte le installazioni di Java presenti nel sistema numerandole. Possiamo ora specificare il numero corrispondente al JDK appena installato per renderlo l'implementazione Java di deffault. Andrea Del Bene – Progetto Jug4Tenda 3 / 26 Java User Group Marche http://www.jugancona.org – [email protected] 1.1.2 Installazione MySql Sotto ambiente Windows MySql è disponibile come installatore eseguibile all'indirizzo http://dev.mysql.com/downloads/. In ambiente Linux è possibile affidarsi al proprio gestore di pacchetti/programmi che si occupa in automatico di cercare MySql, scaricarlo, installarlo e configurarlo. Illustrazione 1: Gestione applicazioni sotto Xubuntu NOTA: si consiglia anche l'installazione del MySql Administrator per agevolare la gestione del database e le operazioni di routine. 1.1.3 Installazione di Eclipse e Tomcat Per seguire le istruzioni di questo manuale è sufficiente scaricare i due programmi sotto forma di archivio zip o tar e decomprimerli in una cartella nel nostro sistema. Tomcat si può trovare sul sito ufficiale http://tomcat.apache.org ed anche Eclipse dispone di un sito da cui scaricare l'ultima versione: http://www.eclipse.org/downloads/. NOTA: benchè non occorrano particolari distribuzioni di Eclipse o plugin per lavorare con il progetto Jug4Tenda, sono richiesti i tool di sviluppo lato server per lanciare Tomcat da Eclipse. Tali strumenti sono solitamente inclusi nelle distribuzioni di Eclipse per lo sviluppo enterprise (JEE). Nel paragrafo XX vengono anche elencati degli strumenti consigliati per lavorare con il codice del progetto in maniera ottimale. 1.2 Test e configurazione dell'installazione MySql Ora dobbiamo assicurarci di conoscere i parametri fondamentali per connetterci a MySql. Per fare ciò useremo l'utility MySql Administrator . I parametri fondamentali sono l'host su cui è stato installato MySql (può essere il nostro sistema locale localhost), la porta su cui è stato installato (di default la 3306) ed infine il profile utente (username e password) di MySql con cui vogliamo lavorare. Sul nostro sistema di sviluppo può essere comodo lavorare con l'username root per Andrea Del Bene – Progetto Jug4Tenda 4 / 26 Java User Group Marche http://www.jugancona.org – [email protected] avere pieni diritti d'uso su MySql. La password di default dell'utente root è vuota. Se abbiamo fatto un'installazione locale senza specificare una password per l'utente root dovremmo avere una schermata simile all'avvio di MySql Administrator. I parametri di connessione a MySql ci torneranno utili in seguito nel paragrafo 1.6 quando dovremo impostare il file con i parametri di connessione a MySql. 1.3 Scaricare con Eclipse il sorgente dal repository CVS del progetto Eclipse è l'IDE usato per il progetto Jug4Tenda ed offre ampio supporto per lavorare su un repository CVS. Per avviare Eclipse è sufficiente andare nella cartella in cui si decompresso l'arcivio della distribuzione scaricata. Qui si troverà il file eseguibile da lanciare per avviare l'IDE (un file eclipse.exe se siamo sotto Windows eclipse.sh se siamo sotto Linux). Al primo avvio Eclipse richiederà la cartella da usare come continetore dei progetti su cui lavoreremo (workspace di Eclipse). Di default viene proposta una cartella workspace posizionata nella cartella utente (es: / home/andrea/workspace sotto Linux o C:\Documents and Settings\andrea\workspace) NOTA: per seguire le istruzioni di questa guida non è richiesta la conoscenza sul funzionamento di CVS o di un altro sistema per il controllore di versione. Tuttavia avere una minima conoscenza di questa tipologia di software rende più facile la comprensione del testo. Un ottimo tutorial (in lingua inglese) introduttivo sull'argomento lo si può tovare al seguente indirizzo . Il progetto ha il suo reporitory ufficiale esplorabile tramite browser al seguente indirizzo. Per scaricare il sorgente con Eclipse è sufficiente seguire le seguenti istruzioni e non è necessaria nessuna conoscenza relativa all'IDE. Per connettersi al repository si clicchi sulla voce di menù ‘File → Import’, si scelga ‘Project from CVS’ e si proceda con 'Next' Andrea Del Bene – Progetto Jug4Tenda 5 / 26 Java User Group Marche http://www.jugancona.org – [email protected] Per connettersi al repository occorre fornire alla prima connessione I parametri per identificare il repository ed autenticarsi. Nel wizard si sceglie quindi “Create a new repository location”. I dati necessari per creare un account generico sono i seguenti: • Host: cvs.dev.java.net • Repository path: /cvs • Username: guest • Password non necessaria • Connection type:pserver Andrea Del Bene – Progetto Jug4Tenda 6 / 26 Java User Group Marche http://www.jugancona.org – [email protected] Ora cliccando su 'Next' dovremmo riuscire ad autenticarci con il repository. Nella schermata successiva ci viene chiesto quale modulo (ossia quale cartella) si desidera scaricare. E' sufficiente scrivere'jugancona/Jug4Tenda' e premere 'Next'. Andrea Del Bene – Progetto Jug4Tenda 7 / 26 Java User Group Marche http://www.jugancona.org – [email protected] In alternativa oltre a scrivere direttamente la sottocartella voluta si possono esplorare tutte le cartelle e sottocartelle del repository selezionando 'Use an existing module'. Ora non rimane che selezionare la cartella del nostro 'workspace' dove verrà scaricato il sorgente: Premendo 'Finish' inizierà il download del progetto che verrà aperto in automatico da Eclipse al termine del trasferimento dati. 1.4 Struttura delle cartelle La struttura attuale delle cartelle del progetto è la seguente: Di seguito riportiamo una breve descrizione delle cartelle del progetto: • doc: contiene la documentazione del progetto ossia le pagine html JavaDoc e un documento di reference scritto con OpenOffice Writer • lib: contiene i jar delle librerie usate dall'applicazione (Hybernate, Spring, Jakarta Common, ecc...). • model: in questa cartelle ho inserito il modello delle classi in argo per averlo sempre disponibile assieme al progetto (è visibile tramite l'apposito plugin). Il file comunque io non l'ho modificato e se si volessero far modifiche considero valido quello disponibile nella sezione download del sito e non questo sul cvs. • src: è la cartella più interessante :-) ossia quella dei sorgenti. Le sue sottocartelle hibernateConfigFiles e springConfigFiles contengono i file xml di configurazione dei Andrea Del Bene – Progetto Jug4Tenda 8 / 26 Java User Group Marche http://www.jugancona.org – [email protected] rispettivi framework. Come ho detto vengono copiate in automatico nella cartella bin ad ogni modifica che viene fatta ai file xml. • • setup: contiene gli script sql per creare il database di lavoro del progetto. webapp: in questa cartella ci sono i binari (bytecode) del progetto e tutti i file di supporto per la parte web del progetto (immagini, pagine jsp/html, css, direcory WEB-INF, ecc...) 1.5 Costruzione del database Nel pragrafo 1.2 ci siamo connessi a MySql per verificare che non ci fossero problemi e per conoscere i parametri richisti per connettersi. Adesso utilizziamo nuovamente MySql Administrator per ricostruire il database di lavoro di Jug4Tenda Illustrazione 1: schermata iniziale di MySql Administrator Per ripristinare il database di lavoro occorre usare la funzione Restore Backup dal menù di sinistra. In questa funzione occorre specificare la cartella setup del progetto che contiene gli script sql per ricostruire le tabelle e le viste del progetto. A questo scopo si usa il pulsante Change path... in basso a sinistra. Andrea Del Bene – Progetto Jug4Tenda 9 / 26 Java User Group Marche http://www.jugancona.org – [email protected] Illustration 2: Configurazione per il ripristino dei backup Il file principale da lanciare è db_setup.sql, seguito da functionAndSp.sql. Per lanciarli è sufficiente selezionarli e cliccare su Reerestore Backup. Selezionando i file viene chiesto il charset da usare per leggerli.Si può scegliere per entrambi il set latin1. Alla fine avremo un database nominato jug4tenda pronto per essere usato. 1.6 Il file dbParamters.properties Ora dobbiamo preoccuparci di “far conoscere”al progetto questi dati in modo che si possa collegare al database di lavoro senza problemi. Il problema con cui ci si deve subito confrontare è che inserire queste informazioni (db url, username e password) nel repository o peggio ancora nel codice darebbe luogo ad una situazione molto scomoda in cui ogni volta che "salviamo" il progetto sul repository (comando Commit...) andiamo anche a salvare le informazioni relative alla nostra installazione di MySql. Chi dopo di noi andrà a prendere il progetto si ritroverà quindi le nostre informaioni di login al database e dovrà modificarle. Quando poi salverà le sue modifiche al sorgente si ripeterà, per un altro di noi, il circolo diabolico che ho descritto adesso...penso di aver reso l'idea :-)! Nel progetto ho quindi centrlizzato le informazioni di login in un file dbParamters.properties (sotto src/springConfigFiles) che viene letto quando bisogna connettersi al database. In seguito...ho rimosso queso file dal repository! In questo modo ovviamnte quando si importa il progetto dal CVS il file dbParamters.properties non viene scaricato, però potete scaricare la copia che ho rimosso dal CVS con pochi click sul navigator di Eclipse. Portandosi sulla cartella src/springConfigFiles si prema il tasto destro, si selezioni il menù “Team” e si lanci “Restore from Repository” Andrea Del Bene – Progetto Jug4Tenda 10 / 26 Java User Group Marche http://www.jugancona.org – [email protected] Nella finestra che appare si scelga il file dbParamters.properties e l'ultima revisione disponibile come mostrato in figura: Cliccando Finish si ritriva il file nel proprio src/springConfigFiles e non sarà controllato dal CVS. progetto, ovviamente alla posizione In questo modo ognuno di noi dovrà modificare il file dbParamters.properties solo una volta e non lo condividerà con nessuno. Inoltre abbiamo evitato di inserire dei parametri testuali dentro il codice centralizzandole in un file di testo. Ora la nostra applicazione, sia che facciamo test sia quando la metteremo in produzione userà questo file per connettersi a MySql. Andrea Del Bene – Progetto Jug4Tenda 11 / 26 Java User Group Marche http://www.jugancona.org – [email protected] 1.7 Configurazione Tomcat in eclipse Tramite Eclipse è possibile lanciare e fermare Tomcat in modo da far “girare” il progetto Jug4Tenda o una qualsiasi altra web application a cui si sta lavorando con Eclipse. Per configurare questa funzionalità per prima cosa dobbiamo aprire la vista Server di Eclipse. Possiamo attivare le viste usando la voce sotto Windows → Show View → Other... come mostrato in figura Illustrazione disponibili 3: Gestione delle viste Dalla finestra Show View scegliamo la vista servers, possiamo trovarla rapidamente usando il campo di ricerca. Illustrazione 4: vista servers Andrea Del Bene – Progetto Jug4Tenda 12 / 26 Java User Group Marche http://www.jugancona.org – [email protected] Al primo utilizzo la vista servers ovviamente non mostrerà alcun elemento. Facendo click con il tasto destro e selezionando New...andiamo ad aggiungere la nostra instalalzione di Tomcat: Illustrazione 5: Creazione di un nuovo profilo server Il wizard di creazione di un nuovo profilo server ci chiede anzi tutto che tipo di profilo vogliamo creare (Tomcat 5.5 nel nostro caso) e successivamente tramite il pulsante Installed Runtime dobbiamo indicare la cartella in cui abbiamo estratto l'archivio di Tomcat precedentemente scaricato: Illustrazione 6: Scelta del tipo server da creare Andrea Del Bene – Progetto Jug4Tenda 13 / 26 Java User Group Marche http://www.jugancona.org – [email protected] Illustrazione 7: Il wizar richiede la cartella di installazione di Tomcat Ora nella nostra vista servers vediamo la configurazione appena creata: Illustrazione 8: Il nostro Tomcat è pronto per partire! Prima di poter lanciare finalmente Tomcat dobbiamo “indicargli” dov'è il nostro progetto Jug4Tenda in modo che possa attivarlo in fase di avvio. Procediamo facendo doppio click sulla configurazione appena creata. Si aprirà una finestra con due schede, Overview e Modules. Portiamoci su Modules come mostrato in figura: Andrea Del Bene – Progetto Jug4Tenda 14 / 26 Java User Group Marche http://www.jugancona.org – [email protected] Illustrazione 9: I moduli di Tomcat A questo punto non c'è molta scelta :-), dobbiamo cliccare su Add External Web Module per aggiungere il progetto Jug4tenda tra le applicazioni disponibili: Illustrazione 10: Aggiunta di un modulo web Per aggiungere un modulo web dobbiamo indicare nella prima casella la cartella del progetto webapp. Ad esempio sotto Linux posta la cartella del nostro workspace /home/andrea/workspace e posta la cartella del progetto Jug4tenda, la cartella da specificare sarà: /home/andrea/workspace/Jug4Tenda/webapp Sotto Windows: C:\Documents and Settings\andrea\workspace\Jug4Tenda\webapp Infine il parametro Path è l'URL relativo che dobbiamo scrivere per accedere al mosulo del progetto Jug4tenda. Quando Tomcat sarà attivo vi si potrà accedere in locale tramite l'url http://localhost:8080. Per accedere al nostro modulo dovremmo concatenare quanto scriveremo come parametro Path. Se mettiamo Jug4Tenda accederemo al modulo all'indirizzo Andrea Del Bene – Progetto Jug4Tenda 15 / 26 Java User Group Marche http://www.jugancona.org – [email protected] http://localhost:8080/Jug4Tenda. ATTENZIONE: l'url è case sensitive, Jug4Tenda è diverso da jug4tenda!!!) Per ora trascuriamo l'opzione di Auto Reloading utile in fase di sviluppo, anche se affetta da un bug di memory overflow, almeno sino ad Eclipse 3.3 Il risultato finale dei nostri sforzi dovrebbe assomigliare a quanto segue: Illustrazione 11: Tutto per la prima esecuzione! Andrea Del Bene – Progetto Jug4Tenda 16 / 26 Java User Group Marche http://www.jugancona.org – [email protected] 2 Il processo di sviluppo Di seguito vengono elencati le fasi che compongono il ciclo di sviluppo del progetto. L'idea è quella di formalizzare il cammino che gli sviluppatori seguono per ricevere nuove richieste di implementazioni, per realizzarle e per pubblicarle (e condividerle). L'ultima fase riguarda la manutenzione della versione del progetto rilasciata e in produzione. Viene anche descritto come interaggiscono gli sviluppatori con il loro committente (casa di accoglienza Tenda di Abramo) 2.1 Prima fase: i meeting Il processo di sviluppo parte da incontri tra sviluppatori e rappresentanti della casa di accoglienza. Durante questi eventi si produce una prima bozza del documento dei requisiti che viene esaminato dagli sviluppatori e integrato dai committenti in maniera iterativa fino ad ottenere delle specifiche chiare e condivise tre sviluppatori e rappresentanti della tenda. Le specifiche possono riguardare nuove implementazioni, migliorie di funzionalità già presenti o bug fix. Esistono figure “intermedie” con competenze tecniche e che operano come volontari all'interno della tenda che agevolano il dialogo tra il gruppo tecnico e i responsabili della tenda. Oltre al documento dei requisiti spesso vengono prodotti anche documenti tecnici come diagrammi delle classi UML relativi alle classi di dominio: 2.2 Seconda fase: tracciatura dei requisiti Tramite mailing list del progetto (creata su Google) viene prodotto e distribuito una sorta di resoconto del meeting, comprese le specifiche elaborate. Le specifiche del meeting vengono anche inserite in un issue tracker presente sul sito del progetto (sito della Sun dev.java) per tenere traccia del loro avanzamento e per poterle assegnare ai singoli sviluppatori. Gli avanzamenti nello sviluppo dei singoli issue vengono notificati in automatico all'intero gruppo di sviluppo tramite mailing list. 2.3 Terza fase: sviluppo. Lo sviluppo si avvale di un repository cvs (upgradabile a Subversion) tramite il quale vengono condivisi i vari artefatti prodotti dagli sviluppatori (file java, pagine jsp, file sql, ecc...). Il sistema cvs si occupa del versioning dei vari file e gestisce le eventuali situazioni di conflitto tra file modificati contemporaneamente da più sviluppatori. Come vedremo il repository cvs viene usato nella fase finale di rilascio anche per produrre branch delle versioni messe in produzione presso la tenda. Gli sviluppatori sono tenuti ad aggiornarsi regolarmente dal branch principale del repository in modo da lavorare sempre su una copia aggiornata del sorgente. Ciò consente di affrontare tempestivamente eventuali conflitti di risorse e per integrare il proprio codice con le ultime modifiche fatte dal resto del gruppo. Lo sviluppo vero e proprio ruota attorno alle classi di dominio che riflettono i diagrammi UML prodotti e che sono quindi i primi artefatti prodotti dallo sviluppatore. Le classi sono puri POJO (Plain Old Java Object) ossia semplici JavaBean che non implementano alcuna interfaccia aventi solo proprietà private e relativi getter e setter. Le fase successive dello sviluppo seguono un approccio bottom-up che ruota sempre attorno alle classi di dominio. Vengono sviluppati preposti alla gestione delle classi di dominio in accordo con i requisiti espressi nelle specifiche. In ordine di norma vengono sviluppati i seguenti artefatti: Andrea Del Bene – Progetto Jug4Tenda 17 / 26 Java User Group Marche http://www.jugancona.org – [email protected] 1) Interfacce DAO per la gestione delle classi di dominio, in particolare le interfacce specificano le classiche operazioni CRUD e operazioni speciali imposte dai requisiti. Di queste interfacce si realizzano implementazioni a seconda della tecnologia di persistenza scelta (JDBC, Hibernate, Top Link, ecc...). 2) Classi di coordinamento (controller) che fanno da tramite tra l'interfaccia web vera e propria e le implementazioni DAO usate dal progetto. 3) Pagine jsp che consentono all'utente di interagire con le entità di dominio in accordo con le specifiche. A questi strati implementativi possono ovviamente essere aggiunti altri strati intermedi, ad esempio uno strato di validazione dei dati inseriti dall'utente. La cosa fondamentale da rispettare è che nessuno strato dipenda (ossia abbia visibilità) da uno strato superiore, ossia più vicino alla GUI. Si deve evitate ciò per almeno due buoni motivi: • Non creare delle dipendenze tra oggetti a forte astrazione (classi di dominio, DAO, ecc...) e oggetti legati ad una particolare tecnologia implementativa (Spring MVC, protocollo HTTP, JSP, ecc...) • Non creare dipendenze circolari di alcun tipo, non solo a livello di codice Java ma anche a livello funzionale. Ad esempio gli strati di presentazione (JSP) o di controller dipendono dalle classi di dominio (strato più in basso). Se valesse anche il viceversa le modifiche fatte a livello di presentazione di rifletterebbero anche sulle classi di dominio! (cit. Jurgen Holler, 2007) Oltre alla realizzazione degli artefatti visti gli sviluppatori sono tenuti a scrivere test unitari (JUnit) che certifichino un comportamento logicamente corretto e che soddisfi i requisiti. 2.4 Quarta fase: commit delle modifiche Quando lo sviluppatore termina le sue implementazioni prima di caricare le modifiche sul repository occorre rilanciare tutti i test unitari realizzati nel progetto, al fine di identificare in maniera tempestiva problemi di integrazione del nuovo codice con le funzioni esistenti e per evitare bug di regressione. Passati tutti i test unitari può essere eseguito il commitment del codice realizzato. In generale vale la seguente regola: non si deve fare il commitment di codice non consistente, ossia codice che non supera tutti i test unitari. La suddetta regola serve per assicurare che ogni membro del team di sviluppo lavori su una copia del sorgente aggiornata senza test fallimentari. 2.5 Quinta fase: branching del sorgente Mano a mano che si realizzano implementazioni e le si caricano sul repository, con l'aiuto del personale della tenda si fanno i primi test “su strada” e si raccolgono le impressioni degli utenti e in Andrea Del Bene – Progetto Jug4Tenda 18 / 26 Java User Group Marche http://www.jugancona.org – [email protected] caso si procede modificando il codice alla luce delle loro osservazioni. Quando si raggiunge un numero sufficiente di implementazioni realizzate e testate si decide di “congelare” il sorgente creando un branch che contiene tutti gli artefatti con i quali andremo a produrre la nuova versione del progetto da mettere in produzione. Una volta creato il branch per l'ultima versione da rilasciare i lavori di nuove implementazioni possono tranquillamente proseguire sul branch principale (chiamato HEAD). 2.6 Manutenzione: correzione bug sulla versione in produzione Nei casi in cui vengano segnalati dei bug sulla versione in produzione le operazioni di bug fix non vengono realizzate sul branch del sorgente principale HEAD bensì sul branch realizzato per fare il deployment della versione in produzione. In questo modo il bug fix viene risolto sulla versione in produzione e non si è costretti a fornire al committente una nuova versione presa dal branch HEAD con nuove funzionalità provvisorie e peggio ancora non ancora opportunamente testate. Il sistema cvs consente poi di fare un merge delle varie fix sul branch principale HEAD, in modo che la prossima release del programma non ripresenti nuovamente i bug segnalati in una versione precedente. 2.7 Diagramma di attività delle fasi descritte Andrea Del Bene – Progetto Jug4Tenda 19 / 26 Java User Group Marche http://www.jugancona.org – [email protected] 2.8 Mappa delle tecnologie usate Spring taglib DisplayTag lib Format taglib AOP DI Web browser Bean Lifecycle manager Classi Utility Spring MVC ... Componenti Spring MVC custom DAO con servizi dichiarativi (transazione,ecc...) Hibernate integ. Compass integ. Data connection Spring framework Hibernate/JDBC driver Compass/Lucene Database MySql Web container (Tomcat) Andrea Del Bene – Progetto Jug4Tenda 20 / 26 Java User Group Marche http://www.jugancona.org – [email protected] 3 Architettura e codice 3.1 ATTENZIONE!! Nell'implementazione corrente viene fatto uso di un Handler Interceptor, non descritto in questa versione del documento di reference. Si provvederà quanto prima ad allinearlo con il sorgente. 3.2 Nota Il seguente documento intende dare le informazioni basilari per comprendere la configurazione della parte web del progetto Jug4Tenda. Come prerequisito si richiede una conoscenza minima di Spring e del funzionamento del suo container tramite file di configurazione xml. Per ovvi motivi di tempo e di spazio non saranno quindi trattati i concetti base di Spring e la sua integrazione con Hibernate. 3.3 Il file web.xml Come per ogni applicazione web Java il file web.xml (nella cartella WEB-INF) contiene tutte le informazioni che il web container (Tomcat nel nostro caso) andrà ad utilizzare per caricare e rendere operativa la nostra applicazione. Nel nostro caso la porzione più significativa del file è la seguente: servlet> <servlet-name>Jug4Tenda</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:springConfigFiles/jug4tendaContext.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jug4Tenda</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <!-- The Usual Welcome File List --> <welcome-file-list> <welcome-file>index.htm</welcome-file> </welcome-file-list> Estratto del file web.xml Nel tag <servlet> specifichiamo il nome della nostra applicazione (Jug4Tenda) e, cosa più importante, la servlet che che viene lanciata e associata alla nostra applicazione al momento dell'avvio del web container. La servlet è del tipo org.springframework.web.servlet.DispatcherServlet. Facendo un “salto” più in basso troviamo il tag <servlet-mapping> dove indichiamo quali richieste, ossia quali URL verranno indirizzati alla nostra servlet Jug4Tenda: tutti gli URL terminanti con html verranno gestiti dalla servlet Jug4Tenda. Andrea Del Bene – Progetto Jug4Tenda 21 / 26 Java User Group Marche http://www.jugancona.org – [email protected] NOTA: per evitare confusione è ben dire che un url terminante con html NON deve per forza riferirsi ad un corrispondente file html esistente. Può anche essere un URL di pura fantasia, la cosa importante è che se termina con html verrà “girato” alla nostra servlet. Il tag <init-param> che abbiamo volutamente ignorato contiene la posizione del file di configurazione di Spring che la nostra servlet si aspetta di caricare al suo avvio. Nel tag <welcome-file-list> indichiamo quale sarà la pagina html visualizzata come homepage del nostro progetto. Ora dopo aver analizzato concetti di configurazione abbastanza generico entreremo più nel dettaglio del funzionamento del framework Spring MVC. 3.4 Spring MVC Il “ponte” di ingresso della nostra applicazione con il mondo esterno è la servlet Dispatch Servlet che abbiamo visto configurata nel file web.xml. Tutte le request indirizzate alla nostra applicazione transitano per questa servlet che le reindirizza alle varie componenti della nostra web application. Vedremo ovviamente cosa sono queste componenti che gestiscono le request e vengono configurate nel file di contesto di Spring. E' il momento di mostrare il cammino classico di una request all'interno dell'architettura di un'applicazione Spring MVC. Di seguito si riporta un semplice diagramma a blocchi: Diagramma di Spring MVC Concetriamo la nostra attenzione sui blocchi azzurri che corrispondono ai passi 1,2,3,4. La request giunge dal nostro browser alla dispatch servlet (passo 1). In base all'URL richiesto la servlet deve attivare una specifica parte di controllo (passo 2 e 3). Quest'ultime sono classi che implementano l'interfaccia Controller del framework e hanno il compito di processare le request http. Passiamo subito ad un esempio: Andrea Del Bene – Progetto Jug4Tenda 22 / 26 Java User Group Marche http://www.jugancona.org – [email protected] 1) Digito nel browser (Passo 1) Per quanto detto prima riguardo il file web.xml le richieste di pagine html sono gestite dalla Dispatch Servlet 2) Sappaiamo che la nostra applicazione Spring MVC all'avvio carica il file di contesto jug4tendaContext.xml. In esso sono specificate le regole di associazione URL --> Controller che deve seguire la Dispatch Servlet. Se analiziamo il file in questione troviamo le seguenti impostazioni di configurazione: <bean id="ospiteController" class="org.jugancona.jug4tenda.web.controllers.OspiteController"> ... <property name="methodNameResolver"> <ref bean="methodNameResolver"/> </property> </bean> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/*Ospite.html">ospiteController</prop> </props> </property> </bean> <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="paramName"> <value>param</value> </property> </bean> Configurazione del controller ospiteController. Uno dei due bean configurati è di tipo handler mapping (Passo 2). Al suo interno nel tag <prop..../> viene dichiarato che tuti gli URL che terminano con Ospite.html verranno “passati” ad ospiteController. Il primo bean che troviamo è proprio ospiteController 3) Siamo ormai giunti al passo 3, la request è stata passata al controller ospiteController che si appresta a processarla. La classe controller oltre ad implementare l'interfaccia Controller di Spring MVC discende da una classe “preconfezionata” del framework, la MultiActionController. La sua particolarità risiede nel fatto che può richiamare diversi metodi per processare la request analizzando il contenuto dell'URL. Nel file di contesto abbiamo dichiarato che il nostro controller referezia il bean methodNameResolver il quale a sua volta ha la proprietà paramName impostata come “param”. Tradotto in parole povere il controller analizza l'URL alla ricerca di un parametro param e tenta di invocare il suo metodo che come nome ha il valore di param. Andrea Del Bene – Progetto Jug4Tenda 23 / 26 Java User Group Marche http://www.jugancona.org – [email protected] Nel nostro esempio: ospiteController invocherà il metodo listOspite per processare la request. In seguito si vedranno i dettagli di codice e le caratteristiche che devono avere i metodi del controller per poter gestire le request. 4) Il controller deve restituire un oggetto di tipo ModelAndView che contiene i dati restituiti dall'elaborazione della request e la vista che deve essere mostrata all'utente. NOTA: a questo punto abbiamo visto tutti i componenti del pattern MVC: il Controller e ora la classe ModelAndView 5) <passo view interceptor> Rimane da esplorare l'ultima parte del “cammino” della request nel framework Spring MVC, la parte relativa alla visualizzazione. Le View altro non sono che le pagine JSP o HTML finali che vedrà l'utente. Il View Resolver è invece un componente configurato ancora una volta nel file di contesto: <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass"> <value>org.springframework.web.servlet.view.JstlView</value> </property> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> Configurazione del View Resolver Ancora non ci siamo addentrati nel codice, tuttavia basta sapere che quando all'interno di una classe Controller costruiamo la vista lo facciamo semplicemente specificando la pagina web che desideriamo. Il bean che vediamo in figura dichiara che la dispatch servlet nel restituire all'utente la pagina indicata la andrà a cercare per default alla posizione /WEB-INF/jsp/ della nostra applicazione web e le assegnerà in automatico il prefisso jsp. Data quindi la struttura della nostra applicazione Andrea Del Bene – Progetto Jug4Tenda 24 / 26 Java User Group Marche http://www.jugancona.org – [email protected] per richiamare la pagina listOspite.jsp nel codice è sufficiente scrivere solo listOspite(passo 5 e 6). 3.5 Codice di ospiteController Come anticipato ospiteController possiede il metodo listOspite, richiamato per recuperare l'elenco degli ospiti e visualizzarli nella pagina listOspite.jsp. public ModelAndView listOspite(HttpServletRequest request, HttpServletResponse response) { List elencoOspiti = ospiteManager.getOspiti(0, 100); return new ModelAndView("listOspite", "elencoOspiti", elencoOspiti); } Metodo listOspite L'elenco degli ospiti è passato alla pagina listOspite.jsp come variabile di request nominata elencoOspiti. Andrea Del Bene – Progetto Jug4Tenda 25 / 26 Java User Group Marche http://www.jugancona.org – [email protected] Appendice: note sulla configurazione Andrea Del Bene – Progetto Jug4Tenda 26 / 26