Programmazione Java Avanzata Il Framework Spring · gestiamo tramite Spring MVC. During the HTTP...

27
Programmazione Java Avanzata Il Il Framework Framework Spring Spring Ing. Gianluca Caminiti

Transcript of Programmazione Java Avanzata Il Framework Spring · gestiamo tramite Spring MVC. During the HTTP...

Programmazione Java

Avanzata

Il Il FrameworkFramework SpringSpring

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 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)

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

SpringSpring MVCMVC

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 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.

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.