Programmazione Java Avanzata Il Framework Spring · gestiamo tramite Spring MVC. During the HTTP...
Transcript of Programmazione Java Avanzata Il Framework Spring · gestiamo tramite Spring MVC. During the HTTP...
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
� Core ContainerInversion 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/IntegrationLivello di astrazione per l'accesso ai dati mediante tecnologie eterogenee tra loro (JDBC, Hibernate, ecc.)
� Spring AOPAspect Oriented Programming. Supporto delle operazioni trasversali tra piùoggetti (es. logging).
� WebSpring MVC Framework (moduli Web-Servlet e Web-Portlet).
� TestingIntegrazione con JUnit, e presenza di Mock objects per il testing del codice in isolamento.
Programmazione Java
Avanzata
InversionInversion of Controlof Control
e e DependencyDependency InjectionInjection
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)
� IoChttp://www.martinfowler.com/articles/injection.html(articolo originale in inglese)http://docs.google.com/View?docid=dg4p5693_22h76wp (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)
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)
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.
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
� 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.
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 willbe 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.
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.