Programmazione Java Avanzata Il Framework Spring Ing. Gianluca Caminiti
Riferimenti Spring http://www.springsource.org/ (scaricate il reference) Beginning Spring 2 - From Novice to Professional. APress. 2008. http://www.apress.com/book/downloadfile/3867 (sample del capitolo 1)
Overview della Struttura
Overview della Struttura Core Container Inversion Of Control (IoC) e Dependency Injection; Bean - creazione, gestione e manipolazione di oggetti (beans). Context aggiunge le funzionalità JNDI, EJB, JMX, internazionalizzazione(i18n), ecc. Expression Language - linguaggio per interrogare e modificare oggetti a runtime. Data Access/Integration Livello di astrazione per l'accesso ai dati mediante tecnologie eterogenee tra loro (JDBC, Hibernate, ecc.) Spring AOP Aspect Oriented Programming. Supporto delle operazioni trasversali tra più oggetti (es. logging). Web Spring MVC Framework (moduli Web-Servlet e Web-Portlet). Testing Integrazione con JUnit, e presenza di Mock objects per il testing del codice in isolamento.
Programmazione Java Avanzata Inversion of Control e Dependency Injection Ing. Gianluca Caminiti
Riferimenti Spring http://www.springsource.org/ Beginning Spring 2 - From Novice to Professional. APress. 2008 (capitolo 3). http://www.apress.com/book/downloadfile/3867 (sample del capitolo 1) IoC http://www.martinfowler.com/articles/injection.html (articolo originale in inglese) http://docs.google.com/view?docid=dg4p5693_22h76 wp (traduzione in italiano)
Inversion of Control L'Inversion of Control è un principio architetturale nato alla fine degli anni ottanta, basato sul concetto di invertire il controllo del flusso di sistema (Control Flow) rispetto alla programmazione tradizionale. Programmazione tradizionale: lo sviluppatore definisce la logica del flusso di controllo, specificando le operazioni di creazione, inizializzazione degli oggetti ed invocazione dei metodi. IoC: Si inverte il control flow, facendo in modo che non sia più lo sviluppatore a doversi preoccupare di questi aspetti, ma il framework, che reagendo a qualche "stimolo" se ne occuperà per suo conto. Questo principio è anche conosciuto come Hollywood Principle ("Non chiamarci, ti chiameremo noi").
Dependency Injection Il termine Dependency Injection (DI) è utilizzato per riferirsi ad una specifica implementazione dello IoC DI è rivolta ad invertire il processo di risoluzione delle dipendenze, facendo in modo che queste vengano iniettate (a run-time) dall'esterno. Esempio di tight coupling : Una classe A si dice dipendente dalla classe B se ne usa in qualche punto i servizi offerti. Uso del costruttore Uso di una Factory Uso di un servizio di naming (lookup)
Dipendenza fra classi
Problema Le dipendenze sono scolpite nel codice Il principale problema è il fatto che ogni volta che si vuole cambiare la dipendenza, si deve modificare il codice
Dependency Injection Un componente esterno (assembler) si occupa della creazione degli oggetti e delle loro relative dipendenze. Gli oggetti sono assemblati e le dipendenze risolte con l'utilizzo dell'injection. In particolare esistono tre forme di injection: Constructor Injection - la dipendenza viene iniettata tramite l'argomento del costruttore Setter Injection - la dipendenza viene iniettata attraverso un metodo "set" Interface Injection - mapping tra interfaccia e relativa implementazione (non utilizzato in Spring)
IoCMotivationExample1
IoC Container Lo IoC Container fornisce un contesto altamente configurabile per la creazione e risoluzione delle dipendenze di componenti (bean, da non confondere con i JavaBean, che seguono le convenzioni note ) E realizzato da due interfacce: BeanFactory, che definisce le funzionalità di base per la gestione dei bean ApplicationContext, che estende queste funzionalità basilari aggiungendone altre tipicamente enterprise come ad esempio la gestione degli eventi, l'internazionalizzazione e l'integrazione con AOP
IoC Container L'interfaccia BeanFactory rappresenta la forma più semplice di IoC Container in Spring e ha il compito di: * creare i bean necessari all'applicazione * inizializzare le loro dipendenze attraverso l'utilizzo dell'injection * gestirne l'intero ciclo di vita Per fare ciò, il container si appoggia a configurazioni (via XML) impostate dall'utente che, riflettendo lo scenario applicativo, specificano i bean che dovranno essere gestiti dal container, le dipendenze che intercorrono tra questi oltre alle varie configurazioni specifiche.
SpringExample2
Programmazione Java Avanzata Spring MVC Ing. Gianluca Caminiti
Riferimenti Spring http://www.springsource.org/ spring-mvc-step-by-step.pdf (contenuto nella cartella docs del file spring-framework-2.5.6.sec01-with-dependencies.zip) Spring reference 2.5.6 Beginning Spring 2 - From Novice to Professional. APress. 2008. (Capitolo 6)
MVC Overview Il Pattern MVC aiuta a realizzare la separazione fra gli aspetti di logica, presentazione e controllo (uso) dell applicazione web. Model incapsula i dati dell applicazione. View presenta all utente lo stato dei dati e le risposte del sistema. Controller riceve/elabora le richieste dell utente e richiede al model gli aggiornamenti sui dati.
Spring MVC Overview
Spring MVC Esiste un servlet principale (DispatcherServlet) che si occupa di ricevere le richieste dell utente e le smista (a seconda delle necessità) al/ai Controller appropriati. DispatcherServlet riceve per primo la request dell utente. La configurazione di questo servlet (che è nascosto dal framework) avviene tramite un file di configurazione (per default, dispatcher-servlet.xml) che si aggiunge al sempre presente web.xml. STEP 1. DispatcherServlet consulta HandlerMapping e invoca il Controller associato alla richiesta dell utente.
Spring MVC STEP 2. Il Controller elabora la richiesta invocando i metodi di servizio appropriati e restituisce un oggetto ModelAndView al DispatcherServlet. Tale oggetto contiene principalmente i dati del modello e il nome della View che sarà usata per presentare tali dati. STEP 3. Il DispatcherServlet invia il nome della View al ViewResolver che associa l effettiva View da invocare. Un riferimento a tale View è restituito al DispatcherServlet. STEP 4. Il DispatcherServlet invia l oggetto contenente i dati del Model alla View scelta per presentare i risultati. La View presenta i risultati utilizzando i dati del Model.
SpringExample5 E un semplice esempio di Hello World che usa Spring MVC.
SpringExample6 Per gestire i form si deve estendere la classe SimpleFormController. Creiamo un semplice form di registrazione e lo gestiamo tramite Spring MVC. During the HTTP GET request the formview will be rendered. When the form is submitted (during the HTTP POST request) the onsubmit() method of the UserController class will be called, on successful execution of the method the successview will be rendered.
SpringExample7 Adesso si mostrerà come popolare il form in modo dinamico.
SpringExample8 Effettuiamo la validazione del form con Spring Creiamo una classe UserValidator che implementa l interfaccia Validator. Sovrascriviamo il metodo validate() che effettua la validazione. Nella pagina JSP aggiungiamo il tag form:errors per mostrare gli errori (direttamente nel form). Si deve infine collegare la classe UserValidator con la classe UserController. Poiché però questa estende la classe SimpleFormController, il metodo validate() sarà invocato automaticamente. E possibile porre i messaggi di errore in un file separato (.properties).
SpringExample9 Questo esempio verte sull uso di un semplice interceptor. Un Interceptor può intercettare una richiesta web prima che essa venga gestita e dopo che lo è stata. Ciò è utile per il debug in primo luogo. Ogni classe Interceptor deve estendere la classe HandlerInterceptorAdapter. Qui si crea un Logger Interceptor tramite tale estensione. Si possono sovrascrivere i tre metodi prehandle(), posthandle() e aftercompletion(). prehandle() sarà chiamato prima di gestire la richiesta. posthandle() sarà chiamato dopo aver gestito la la richiesta aftercompletion() sarà chiamato dopo avere prodotto i risultati. Si usa in ciascuno di tali metodi log4j per il logging effettivo che avverrà sulla console.
SpringExample10 L uso della classe MultiActionController permette di raggruppare multipe azioni nello stesso controller.