SlideShare a Scribd company logo
1 of 30
Download to read offline
Un backend per tutte le
stagioni con Spring

Marcello Teodori
marcello.teodori@jugmilano.it

Java User Group Milano
http://www.jugmilano.it
Due parole sul JUG Milano

●   Il JUG Milano nasce il 18 Dicembre 2002 ad opera di
    Filippo Diotalevi e dopo un periodo di incubazione ne
    esce il primo meeting ufficiale il 16 Dicembre 2003
●   Lo scopo è quello di favorire l'interscambio di
    conoscenze informatiche e creare un punto di
    riferimento nel panorama degli sviluppatori Java locale
●   La partecipazione alle attività è del tutto gratuita e libera
●   Il JUG gestisce una serie di attività tra cui meeting con
    cadenza regolare, scrittura di articoli, tutorial e
    recensioni libri sul nostro sito web, e partecipazione ad
    avvenimenti di rilevanza tecnologica



                                    JUG Milano – Meeting 33 - All4Web   2
Il Nostro Curriculum

●   Mailing list su Yahoo! Groups con più di 400 iscritti:
    http://tech.groups.yahoo.com/group/it-milano-java-jug/
●   wiki web site: http://www.jugmilano.it/
●   meeting mensili con ospiti italiani ed internazionali
●   Partecipazione alle principali conferenze italiane ed
    europee su Java, OpenSource e Metodi Agili
●   Collaborazione e Promozioni con Sun, Manning,
    Apress ed O'Reilly
●   Facciamo parte della Top 50 dei JUG mondiali!



                                JUG Milano – Meeting 33 - All4Web   3
Definizione di Rich Internet Application

   "web applications have extended the reach of enterprises to customers,
      offering anywhere and anytime access. However, this has been at the
     expense of the overall user-experience, which is diminished by delivery
                            through the web browser"
                         Steven Webster e Alistair McLeod, autori del libro Flex Integration with J2EE
                                              http://www.theserverside.com/articles/article.tss?l=Flex
 => un nuovo tipo di web application che ne superi i limiti?
 Caratteristiche:
 ● web deployment
 ● logica applicativa suddivisa fra client (desktop-based) e server (browser-
   based)
 ● interazione immediata senza percezione di un roundtrip sul server
 ● flussi di esecuzione multipli
 ● accesso a rich content: audio/video



                                                    JUG Milano – Meeting 33 - All4Web                    4
Architettura di Riferimento




               JUG Milano – Meeting 33 - All4Web   5
Client Runtime

La scelta del runtime:
● JVM/JavaFX
  Il ritorno delle Applet in una veste più adatta al mondo RIA...
● AJAX
  Magia tramie JavaScript e XMLHttpRequest...
● Flash VM/Flex
  Browser plugin per animazioni vettoriali, via via arrichitosi nelle
  versioni recenti di funzionalità applicative.
● Silverlight
  Browser plugin che implementa una versione ridotta del runtime
  di .NET con funzioni GUI e media avanzate.




                                      JUG Milano – Meeting 33 - All4Web   6
Backend

Qual è il backend più adatto per le RIA?

Va bene qualsiasi soluzione, purchè esponga le proprie
funzionalità in:
 ● XML over HTTP (ReST)

 ● web service “standard” SOAP

 ● formati “nativi” in base al runtime scelto

    – Java Serialization Protocol ed RMI over HTTP per JVM
    – AMF per Flash
    – JSON per AJAX




                                  JUG Milano – Meeting 33 - All4Web   7
Elementi di scelta per backend RIA
●   Modalità di remoting già supportate dal
    runtime o disponibili tramite librerie
    aggiuntive o sviluppo custom
●   Serializzazione dati nativa o parsing
●   Compromesso fra effort di implementazione
    e performance, intesa come tempo di
    processing lato client e dati scambiati su rete
●   Se non ho ancora deciso cosa usare sul
    client, le opzioni si moltiplicano ancora!!!



                             JUG Milano – Meeting 33 - All4Web   8
Benchmarking
http://www.jamesward.com/census/




                              JUG Milano – Meeting 33 - All4Web   9
Implementare Servizi con Spring
●   Servizi = POJO (Plain Old Java Object)
●   Java EE è opzionale
●   Il core di Spring è l'ApplicationContext
    container IOC ed implementazione di
    Registry e ObjectFactory
●   Configurazione tramite XML o Annotation o
    entrambe
●   I servizi Spring sono facili da testare
●   ma... uno strato servizi spring “vive” nella
    JVM dell'ApplicationContext, per accedervi
    da un'applicazione RIA devo “esportarlo”!

                            JUG Milano – Meeting 33 - All4Web   10
Spring Remoting
●   Modello generale per rendere accessibili
    esternamente i servizi Spring
●   Adatto ad interazioni sincrone request-
    response
●   Permette di implementare facilmente il
    backend di un'applicazione RIA
●   Grazie alle funzionalità offerte da Spring,
    NON devo necessariamente pensare la mia
    applicazione in funzione della tecnologia con
    cui il client può accedere


                            JUG Milano – Meeting 33 - All4Web   11
Spring Remoting - Exporter
●   Supponiamo di aver sviluppato un'intera
    applicazione destinata al web (client jsp/jsf)
    usando Spring.
●   Posso rendere accessibili i servizi offerti dai
    nostri bean Spring a client RIA senza
    modificare nulla del codice né della
    configurazione esistente (e funzionante), ma
    semplicemente aggiungendo opportune
    configurazioni.
●   La chiave è il concetto di Spring Exporter
●   Noi useremo principalmente questo
    approccio per le RIA
                             JUG Milano – Meeting 33 - All4Web   12
Spring Remoting - Exporter
●   Consente, semplicemente tramite configurazione, di
    rendere un servizio esistente accessibile remotamente
    tramite una delle tecnologie previste
●   Al momento si può scegliere tra:
        – Remote Method Invocation (RMI)

        –   Spring's HTTP invoker
        –   Hessian (o Burlap, alternativa ad Hessian Xml
             based)
        –   JAX-RPC, JAX-WS
        –   JMS




                                    JUG Milano – Meeting 33 - All4Web   13
Spring Remoting - Exporter
●   Per toccare con mano la semplicità dell'approccio,
    immaginiamo di avere nella nostra applicazione il
    seguente servizio:
    <bean id="bookService" class="BookServiceImpl">
          <!-- eventuali proprietà addizionali -->
    </bean>

    // ed una implementazione qualsiasi......
    public class BookServiceImpl implements BookService {
        public List<Book> getAllBooks() {
              //........
        }

●   Nella definizione del servizio (e nell'implementazione)
    non c'è nulla che rimandi al remoting
                                       JUG Milano – Meeting 33 - All4Web   14
Spring Remoting - Exporter
●   Immaginiamo ora di voler rendere il bean accessibile
    remotamente via RMI o Hessian. Tutto quello che dobbiamo
    fare lato server è aggiungere una delle due configurazioni
    seguenti:
    <bean class="org.springframework.remoting.rmi.RmiServiceExporter">
      <property name="remoteServiceName" value="RemoteBookService"/>
      <property name="service" ref="bookService"/>
      <property name="serviceInterface" value="BookService"/>
    </bean>

    <bean name="/RemoteBookService"
    class="org.springframework.remoting.caucho.HessianServiceExporter">
       <property name="service" ref="accountService"/>
       <property name="serviceInterface" value="BookService"/>
    </bean>
●   Per utilizzare Hessian occorre naturalmente aver configurato
    opportunamente la DispatcherServlet
                                          JUG Milano – Meeting 33 - All4Web   15
E sul client?
●   Dopo aver esposto il nostro servizio, occorre
    naturalmente mettere il client in grado di invocarlo.
    Grazie ai servizi offerti da Spring, anche questa è
    un'operazione banale

    public class JavaClient {
      private BookService bookService;
      public void setBookService(BookService bookService) {
          this.accountService = accountService;
      }

●   Tramite il reference iniettato bookService, il client può
    invocare i metodi di BookServiceImpl (è del tutto
    trasparente il fatto che sia una chiamata remota)


                                           JUG Milano – Meeting 33 - All4Web   16
E sul client?
Per iniettare il riferimento corretto al JavaClient, è sufficiente
aggiungere nel contesto del client una delle due
configurazioni seguenti (per RMI ed Hessian)
<bean class="JavaClient">
  <property name="bookService" ref="bookService"/>
</bean>

<bean id="bookService"
class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
   <property name="serviceUrl" value="rmi://HOST:1199/BookService"/>
   <property name="serviceInterface" value="BookService"/>
</bean>
<bean id="bookService"
class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
   <property name="serviceUrl"
     value="http://remotehost:8080/remoting/BookService"/ >
   <property name="serviceInterface" value="BookService"/>
</bean>
                                      JUG Milano – Meeting 33 - All4Web   17
Spring Remoting - Proxy
●   L'approccio dell'esempio precedente, sul client
    sfrutta il pattern Proxy.
●   Spring, per ognuna delle tecnologie elencate in
    precedenza, fornisce un proxy che nasconde al
    client tutti i dettagli della comunicazione remota.
●   Pur essendo un approccio estremamente
    semplice e diretto, va bene solo per client java-
    based, perché richiede Spring sul Client
●   Esistono comunque implementazioni di Spring
    anche per .NET, Python e ActionScript


                                JUG Milano – Meeting 33 - All4Web   18
Spring Remoting e Java FX
●   Alla luce di quanto visto, una RIA con Java FX sul
    client non è assolutamente complicata da integrare
    con i servizi remoti, essendo full java.
●   Ad esempio si potrebbe scegliere la strada forse più
    semplice e sicura in un contesto Internet con Java su
    ambo i lati: HttpInvoker
●   A differenza di Hessian,Sspring HttpInvoker usa il
    meccanismo Java di serializzazione per esporre i
    servizi su HTTP. Questo si rivela assai vantaggioso
    se si vogliono scambiare tipi java complessi che non
    potrebbero essere serializzati via Hessian.


                                 JUG Milano – Meeting 33 - All4Web   19
Spring Remoting e Java FX
●   L'uso di HttpInvoker sul server prevede l'ormai familiare
    configurazione:
    <bean name="/BookService"
    class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
       <property name="service" ref="bookService"/>
       <property name="serviceInterface" value="BookService"/>
    </bean>


●   Mentre sul client potremmo utilizzare l'apposito proxy
    <bean id="bookService"
    class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
          <property name="serviceUrl"
               value="http://remotehost:8080/remoting/BookService"/>
          <property name="serviceInterface" value="BookService"/>
    </bean>


                                               JUG Milano – Meeting 33 - All4Web    20
Apache CXF

●   Merger dei progetti XFire e Celtix su Apache:
    http://cxf.apache.org/
●   Implementa Spring Remoting per Web
    Service
●   WS “standard” SOAP con JAX-WS
●   WS “freeform” REST con JAX-RS
        –   serializzazione XML via JAXB
        –   serializzazione JSON via Jettison
              => adatta a RIA realizzate in AJAX!


                                 JUG Milano – Meeting 33 - All4Web   21
Spring BlazeDS Integration

●   Progetto congiunto SpringSource e Adobe
    http://www.springsource.org/spring-flex
●   Implementa Spring Remoting per Flex
●   Semplifica la configurazione di BlazeDS
●   Usa di BlazeDS la serializzazione AMF3,
    tralasciando le funzionalità da “application
    server”
    => la scelta migliore per applicazioni RIA
        realizzate con Flex


                             JUG Milano – Meeting 33 - All4Web   22
Un esempio

Realizzazione di un semplice servizio di
gestione di una libreria:
● Interfaccia LibraryService

● Implementazione LibraryServiceImpl

● Configurazione Exporter CXF su JSON

     => per client AJAX
● Configurazione Exporter BlazeDS

     => per client Flex



                         JUG Milano – Meeting 33 - All4Web   23
AOP e Spring Security

●   Come proteggere il nostro backend RIA?
●   Integro Spring Security via AOP non
    modificando la mia implementazione!
●   Spring Security supporta tutti i più noti
    meccanismi di autenticazione: su database,
    LDAP, NTLM e anche SSO come CAS
●   Integrazione con applicazioni web “classiche”
    su Spring MVC tramite la DispatcherServlet,
    implementazione del pattern FrontController


                           JUG Milano – Meeting 33 - All4Web   24
AOP e Spring Security
http://www.mindtheflex.com/?p=67




                                   JUG Milano – Meeting 33 - All4Web   25
Spring Remoting Proxy server-side

●   I Proxy di Spring Remoting possono essere
    utilizzati anche server-side per “adattare”
    servizi remoti esistenti “legacy” a client RIA
●   Casi d'uso:
        –   integro un servizio EJB 2.1
        –   proxy verso webservice non accessibile a
              Flex per mancanza di un file
              crossdomain.xml
        –   caching di un servizio esterno molto lento a
              rispondere o non sempre accessibile


                                 JUG Milano – Meeting 33 - All4Web   26
Spring Remoting vs. Hibernate

●   Caso d'uso: devo pubblicare un servizio
    Spring che accede a database tramite
    Hibernate
●   Problema: come faccio a gestire le relazioni
    “lazy” nell'interazione con un client RIA senza
    avere la malefica
    LazyInitializationException?
●   Soluzione: tramite Spring AOP serializzo solo
    i dati che posso effettivamente spedire e
    ricevere, ad esempio solo gli ID degli oggetti!

                            JUG Milano – Meeting 33 - All4Web   27
Altri spunti...
●   Spring Remoting va bene per interazioni
    sincrone stile request-response, e per
    interazioni asincrone stile publish-subscribe?
●   Spring Integration è il nuovo progetto di
    Spring che definisce il modello astratto per
    gestirle e contiene implementazioni su JMS e
    thread pool
●   Spring Integration è già supportato nella
    nuova release 1.0.0.RC1 di Spring BlazeDS
    Integration, seguiranno presto connettori per
    Jabber ecc.

                            JUG Milano – Meeting 33 - All4Web   28
Riferimenti
●   Spring Framework
    http://www.springsource.org/
●   Cristophe Coenraets Blog – esempi su Spring BlazeDS
    Integration
    http://coenraets.org/blog/
●   Flex-Mojos – plugin Maven per Flex
    http://flexmojos.sonatype.org/
●   FNA – archetype Maven per Flex e Spring
    http://code.google.com/p/fna/
●   CXF JSON Support
    http://cwiki.apache.org/CXF20DOC/json-support.html




                                JUG Milano – Meeting 33 - All4Web   29
Q&A




  JUG Milano – Meeting 33 - All4Web   30

More Related Content

What's hot

Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide SitoDavide Sito
 
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Codemotion
 
Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8Valerio Radice
 
Acadevmy - Angular Overview
Acadevmy - Angular OverviewAcadevmy - Angular Overview
Acadevmy - Angular OverviewFrancesco Sciuti
 
Struttin' on, novità in casa Struts
Struttin' on, novità in casa StrutsStruttin' on, novità in casa Struts
Struttin' on, novità in casa StrutsMarcello Teodori
 
Introduzione agli Hooks – Primo Episodio
Introduzione agli Hooks – Primo EpisodioIntroduzione agli Hooks – Primo Episodio
Introduzione agli Hooks – Primo EpisodioAntonio Musarra
 
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the WebClaudio Gandelli
 
Design Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency InjectionDesign Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency InjectionRiccardo Cardin
 
Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1Antonio Musarra
 
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi Style
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi StyleLiferay 7: Come realizzare un client SOAP con Apache CXF in OSGi Style
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi StyleAntonio Musarra
 
Liferay - Quick Start 1° Episodio
Liferay - Quick Start 1° EpisodioLiferay - Quick Start 1° Episodio
Liferay - Quick Start 1° EpisodioAntonio Musarra
 
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webAndrea Dottor
 
Liferay & Salesforce.com
Liferay & Salesforce.comLiferay & Salesforce.com
Liferay & Salesforce.comAntonio Musarra
 

What's hot (20)

Spring - Ecosistema
Spring - EcosistemaSpring - Ecosistema
Spring - Ecosistema
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide Sito
 
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
 
Microservices
MicroservicesMicroservices
Microservices
 
Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8
 
Acadevmy - Angular Overview
Acadevmy - Angular OverviewAcadevmy - Angular Overview
Acadevmy - Angular Overview
 
OSGi e Liferay 7
OSGi e Liferay 7OSGi e Liferay 7
OSGi e Liferay 7
 
Struttin' on, novità in casa Struts
Struttin' on, novità in casa StrutsStruttin' on, novità in casa Struts
Struttin' on, novità in casa Struts
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
Introduzione agli Hooks – Primo Episodio
Introduzione agli Hooks – Primo EpisodioIntroduzione agli Hooks – Primo Episodio
Introduzione agli Hooks – Primo Episodio
 
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the Web
 
Design Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency InjectionDesign Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency Injection
 
MVC and Struts 1
MVC and Struts 1MVC and Struts 1
MVC and Struts 1
 
Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1
 
App Engine + Python
App Engine + PythonApp Engine + Python
App Engine + Python
 
Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi Style
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi StyleLiferay 7: Come realizzare un client SOAP con Apache CXF in OSGi Style
Liferay 7: Come realizzare un client SOAP con Apache CXF in OSGi Style
 
Liferay - Quick Start 1° Episodio
Liferay - Quick Start 1° EpisodioLiferay - Quick Start 1° Episodio
Liferay - Quick Start 1° Episodio
 
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
 
Liferay & Salesforce.com
Liferay & Salesforce.comLiferay & Salesforce.com
Liferay & Salesforce.com
 

Similar to Un backend per tutte le stagioni con Spring

#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2Bkino2k
 
Designing with microservices - Daniele Mondello
Designing with microservices - Daniele MondelloDesigning with microservices - Daniele Mondello
Designing with microservices - Daniele MondelloDaniele Mondello
 
Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)brossi676
 
Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini Whymca
 
SVILUPPO DI SERVIZI REST PER ANDROID
SVILUPPO DI SERVIZI REST PER ANDROIDSVILUPPO DI SERVIZI REST PER ANDROID
SVILUPPO DI SERVIZI REST PER ANDROIDLuca Masini
 
Tesi Discussione
Tesi DiscussioneTesi Discussione
Tesi DiscussioneYeser Rema
 
I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)Diego La Monica
 
Framework per la realizzazione di ria
Framework per la realizzazione di riaFramework per la realizzazione di ria
Framework per la realizzazione di riaLorenzo Bortolotto
 
e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)Sabino Labarile
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webLuca Milan
 
Osd 2016 Middleware Track
Osd 2016 Middleware TrackOsd 2016 Middleware Track
Osd 2016 Middleware TrackUgo Landini
 
Meetup Fluent Design e Progressive Web App
Meetup Fluent Design e Progressive Web AppMeetup Fluent Design e Progressive Web App
Meetup Fluent Design e Progressive Web Appdotnetcode
 
Roberta randazzo gnulinuxmeeting 2016
Roberta randazzo gnulinuxmeeting 2016Roberta randazzo gnulinuxmeeting 2016
Roberta randazzo gnulinuxmeeting 2016Roberta Randazzo
 
Stanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al PrgressiveStanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al PrgressiveCommit University
 

Similar to Un backend per tutte le stagioni con Spring (20)

Spring e Flex
Spring e FlexSpring e Flex
Spring e Flex
 
Rich Internet Application
Rich Internet ApplicationRich Internet Application
Rich Internet Application
 
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
#LRIS2014 - MessageBus, Cluster communication and Caching on B2B
 
Designing with microservices - Daniele Mondello
Designing with microservices - Daniele MondelloDesigning with microservices - Daniele Mondello
Designing with microservices - Daniele Mondello
 
Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)
 
OpenDevSecOps 2019 - Open devsecops un caso di studio
OpenDevSecOps 2019 - Open devsecops un caso di studioOpenDevSecOps 2019 - Open devsecops un caso di studio
OpenDevSecOps 2019 - Open devsecops un caso di studio
 
Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini
 
SVILUPPO DI SERVIZI REST PER ANDROID
SVILUPPO DI SERVIZI REST PER ANDROIDSVILUPPO DI SERVIZI REST PER ANDROID
SVILUPPO DI SERVIZI REST PER ANDROID
 
Presentazione Unibo
Presentazione UniboPresentazione Unibo
Presentazione Unibo
 
Tesi Discussione
Tesi DiscussioneTesi Discussione
Tesi Discussione
 
I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)
 
Framework per la realizzazione di ria
Framework per la realizzazione di riaFramework per la realizzazione di ria
Framework per la realizzazione di ria
 
e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni web
 
Osd 2016 Middleware Track
Osd 2016 Middleware TrackOsd 2016 Middleware Track
Osd 2016 Middleware Track
 
Meetup Fluent Design e Progressive Web App
Meetup Fluent Design e Progressive Web AppMeetup Fluent Design e Progressive Web App
Meetup Fluent Design e Progressive Web App
 
Roberta randazzo gnulinuxmeeting 2016
Roberta randazzo gnulinuxmeeting 2016Roberta randazzo gnulinuxmeeting 2016
Roberta randazzo gnulinuxmeeting 2016
 
Stanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al PrgressiveStanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al Prgressive
 
UI Composition
UI CompositionUI Composition
UI Composition
 
Acadevmy - PWA & Angular
Acadevmy - PWA & AngularAcadevmy - PWA & Angular
Acadevmy - PWA & Angular
 

More from Marcello Teodori

Anatomy of an APS 2 appication
Anatomy of an APS 2 appicationAnatomy of an APS 2 appication
Anatomy of an APS 2 appicationMarcello Teodori
 
JavaScript Power Tools 2015
JavaScript Power Tools 2015JavaScript Power Tools 2015
JavaScript Power Tools 2015Marcello Teodori
 
Wicket from Designer to Developer
Wicket from Designer to DeveloperWicket from Designer to Developer
Wicket from Designer to DeveloperMarcello Teodori
 
m2eclipse: integrazione maven2 in eclipse IDE
m2eclipse: integrazione maven2 in eclipse IDEm2eclipse: integrazione maven2 in eclipse IDE
m2eclipse: integrazione maven2 in eclipse IDEMarcello Teodori
 
JBoss Seam, un framework per Java EE 5
JBoss Seam, un framework per Java EE 5JBoss Seam, un framework per Java EE 5
JBoss Seam, un framework per Java EE 5Marcello Teodori
 
Sviluppare su OpenOffice.org con Java
Sviluppare su OpenOffice.org con JavaSviluppare su OpenOffice.org con Java
Sviluppare su OpenOffice.org con JavaMarcello Teodori
 
Streaming in Java e Flex con Red5
Streaming in Java e Flex con Red5Streaming in Java e Flex con Red5
Streaming in Java e Flex con Red5Marcello Teodori
 

More from Marcello Teodori (11)

Anatomy of an APS 2 appication
Anatomy of an APS 2 appicationAnatomy of an APS 2 appication
Anatomy of an APS 2 appication
 
Refactoring to a SPA
Refactoring to a SPARefactoring to a SPA
Refactoring to a SPA
 
JavaScript Power Tools 2015
JavaScript Power Tools 2015JavaScript Power Tools 2015
JavaScript Power Tools 2015
 
Wicket from Designer to Developer
Wicket from Designer to DeveloperWicket from Designer to Developer
Wicket from Designer to Developer
 
Software Factory in a Box
Software Factory in a BoxSoftware Factory in a Box
Software Factory in a Box
 
Groovy & Grails
Groovy & GrailsGroovy & Grails
Groovy & Grails
 
m2eclipse: integrazione maven2 in eclipse IDE
m2eclipse: integrazione maven2 in eclipse IDEm2eclipse: integrazione maven2 in eclipse IDE
m2eclipse: integrazione maven2 in eclipse IDE
 
JBoss Seam, un framework per Java EE 5
JBoss Seam, un framework per Java EE 5JBoss Seam, un framework per Java EE 5
JBoss Seam, un framework per Java EE 5
 
Java sul tuo Mac
Java sul tuo MacJava sul tuo Mac
Java sul tuo Mac
 
Sviluppare su OpenOffice.org con Java
Sviluppare su OpenOffice.org con JavaSviluppare su OpenOffice.org con Java
Sviluppare su OpenOffice.org con Java
 
Streaming in Java e Flex con Red5
Streaming in Java e Flex con Red5Streaming in Java e Flex con Red5
Streaming in Java e Flex con Red5
 

Un backend per tutte le stagioni con Spring

  • 1. Un backend per tutte le stagioni con Spring Marcello Teodori marcello.teodori@jugmilano.it Java User Group Milano http://www.jugmilano.it
  • 2. Due parole sul JUG Milano ● Il JUG Milano nasce il 18 Dicembre 2002 ad opera di Filippo Diotalevi e dopo un periodo di incubazione ne esce il primo meeting ufficiale il 16 Dicembre 2003 ● Lo scopo è quello di favorire l'interscambio di conoscenze informatiche e creare un punto di riferimento nel panorama degli sviluppatori Java locale ● La partecipazione alle attività è del tutto gratuita e libera ● Il JUG gestisce una serie di attività tra cui meeting con cadenza regolare, scrittura di articoli, tutorial e recensioni libri sul nostro sito web, e partecipazione ad avvenimenti di rilevanza tecnologica JUG Milano – Meeting 33 - All4Web 2
  • 3. Il Nostro Curriculum ● Mailing list su Yahoo! Groups con più di 400 iscritti: http://tech.groups.yahoo.com/group/it-milano-java-jug/ ● wiki web site: http://www.jugmilano.it/ ● meeting mensili con ospiti italiani ed internazionali ● Partecipazione alle principali conferenze italiane ed europee su Java, OpenSource e Metodi Agili ● Collaborazione e Promozioni con Sun, Manning, Apress ed O'Reilly ● Facciamo parte della Top 50 dei JUG mondiali! JUG Milano – Meeting 33 - All4Web 3
  • 4. Definizione di Rich Internet Application "web applications have extended the reach of enterprises to customers, offering anywhere and anytime access. However, this has been at the expense of the overall user-experience, which is diminished by delivery through the web browser" Steven Webster e Alistair McLeod, autori del libro Flex Integration with J2EE http://www.theserverside.com/articles/article.tss?l=Flex => un nuovo tipo di web application che ne superi i limiti? Caratteristiche: ● web deployment ● logica applicativa suddivisa fra client (desktop-based) e server (browser- based) ● interazione immediata senza percezione di un roundtrip sul server ● flussi di esecuzione multipli ● accesso a rich content: audio/video JUG Milano – Meeting 33 - All4Web 4
  • 5. Architettura di Riferimento JUG Milano – Meeting 33 - All4Web 5
  • 6. Client Runtime La scelta del runtime: ● JVM/JavaFX Il ritorno delle Applet in una veste più adatta al mondo RIA... ● AJAX Magia tramie JavaScript e XMLHttpRequest... ● Flash VM/Flex Browser plugin per animazioni vettoriali, via via arrichitosi nelle versioni recenti di funzionalità applicative. ● Silverlight Browser plugin che implementa una versione ridotta del runtime di .NET con funzioni GUI e media avanzate. JUG Milano – Meeting 33 - All4Web 6
  • 7. Backend Qual è il backend più adatto per le RIA? Va bene qualsiasi soluzione, purchè esponga le proprie funzionalità in: ● XML over HTTP (ReST) ● web service “standard” SOAP ● formati “nativi” in base al runtime scelto – Java Serialization Protocol ed RMI over HTTP per JVM – AMF per Flash – JSON per AJAX JUG Milano – Meeting 33 - All4Web 7
  • 8. Elementi di scelta per backend RIA ● Modalità di remoting già supportate dal runtime o disponibili tramite librerie aggiuntive o sviluppo custom ● Serializzazione dati nativa o parsing ● Compromesso fra effort di implementazione e performance, intesa come tempo di processing lato client e dati scambiati su rete ● Se non ho ancora deciso cosa usare sul client, le opzioni si moltiplicano ancora!!! JUG Milano – Meeting 33 - All4Web 8
  • 9. Benchmarking http://www.jamesward.com/census/ JUG Milano – Meeting 33 - All4Web 9
  • 10. Implementare Servizi con Spring ● Servizi = POJO (Plain Old Java Object) ● Java EE è opzionale ● Il core di Spring è l'ApplicationContext container IOC ed implementazione di Registry e ObjectFactory ● Configurazione tramite XML o Annotation o entrambe ● I servizi Spring sono facili da testare ● ma... uno strato servizi spring “vive” nella JVM dell'ApplicationContext, per accedervi da un'applicazione RIA devo “esportarlo”! JUG Milano – Meeting 33 - All4Web 10
  • 11. Spring Remoting ● Modello generale per rendere accessibili esternamente i servizi Spring ● Adatto ad interazioni sincrone request- response ● Permette di implementare facilmente il backend di un'applicazione RIA ● Grazie alle funzionalità offerte da Spring, NON devo necessariamente pensare la mia applicazione in funzione della tecnologia con cui il client può accedere JUG Milano – Meeting 33 - All4Web 11
  • 12. Spring Remoting - Exporter ● Supponiamo di aver sviluppato un'intera applicazione destinata al web (client jsp/jsf) usando Spring. ● Posso rendere accessibili i servizi offerti dai nostri bean Spring a client RIA senza modificare nulla del codice né della configurazione esistente (e funzionante), ma semplicemente aggiungendo opportune configurazioni. ● La chiave è il concetto di Spring Exporter ● Noi useremo principalmente questo approccio per le RIA JUG Milano – Meeting 33 - All4Web 12
  • 13. Spring Remoting - Exporter ● Consente, semplicemente tramite configurazione, di rendere un servizio esistente accessibile remotamente tramite una delle tecnologie previste ● Al momento si può scegliere tra: – Remote Method Invocation (RMI) – Spring's HTTP invoker – Hessian (o Burlap, alternativa ad Hessian Xml based) – JAX-RPC, JAX-WS – JMS JUG Milano – Meeting 33 - All4Web 13
  • 14. Spring Remoting - Exporter ● Per toccare con mano la semplicità dell'approccio, immaginiamo di avere nella nostra applicazione il seguente servizio: <bean id="bookService" class="BookServiceImpl"> <!-- eventuali proprietà addizionali --> </bean> // ed una implementazione qualsiasi...... public class BookServiceImpl implements BookService { public List<Book> getAllBooks() { //........ } ● Nella definizione del servizio (e nell'implementazione) non c'è nulla che rimandi al remoting JUG Milano – Meeting 33 - All4Web 14
  • 15. Spring Remoting - Exporter ● Immaginiamo ora di voler rendere il bean accessibile remotamente via RMI o Hessian. Tutto quello che dobbiamo fare lato server è aggiungere una delle due configurazioni seguenti: <bean class="org.springframework.remoting.rmi.RmiServiceExporter"> <property name="remoteServiceName" value="RemoteBookService"/> <property name="service" ref="bookService"/> <property name="serviceInterface" value="BookService"/> </bean> <bean name="/RemoteBookService" class="org.springframework.remoting.caucho.HessianServiceExporter"> <property name="service" ref="accountService"/> <property name="serviceInterface" value="BookService"/> </bean> ● Per utilizzare Hessian occorre naturalmente aver configurato opportunamente la DispatcherServlet JUG Milano – Meeting 33 - All4Web 15
  • 16. E sul client? ● Dopo aver esposto il nostro servizio, occorre naturalmente mettere il client in grado di invocarlo. Grazie ai servizi offerti da Spring, anche questa è un'operazione banale public class JavaClient { private BookService bookService; public void setBookService(BookService bookService) { this.accountService = accountService; } ● Tramite il reference iniettato bookService, il client può invocare i metodi di BookServiceImpl (è del tutto trasparente il fatto che sia una chiamata remota) JUG Milano – Meeting 33 - All4Web 16
  • 17. E sul client? Per iniettare il riferimento corretto al JavaClient, è sufficiente aggiungere nel contesto del client una delle due configurazioni seguenti (per RMI ed Hessian) <bean class="JavaClient"> <property name="bookService" ref="bookService"/> </bean> <bean id="bookService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <property name="serviceUrl" value="rmi://HOST:1199/BookService"/> <property name="serviceInterface" value="BookService"/> </bean> <bean id="bookService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> <property name="serviceUrl" value="http://remotehost:8080/remoting/BookService"/ > <property name="serviceInterface" value="BookService"/> </bean> JUG Milano – Meeting 33 - All4Web 17
  • 18. Spring Remoting - Proxy ● L'approccio dell'esempio precedente, sul client sfrutta il pattern Proxy. ● Spring, per ognuna delle tecnologie elencate in precedenza, fornisce un proxy che nasconde al client tutti i dettagli della comunicazione remota. ● Pur essendo un approccio estremamente semplice e diretto, va bene solo per client java- based, perché richiede Spring sul Client ● Esistono comunque implementazioni di Spring anche per .NET, Python e ActionScript JUG Milano – Meeting 33 - All4Web 18
  • 19. Spring Remoting e Java FX ● Alla luce di quanto visto, una RIA con Java FX sul client non è assolutamente complicata da integrare con i servizi remoti, essendo full java. ● Ad esempio si potrebbe scegliere la strada forse più semplice e sicura in un contesto Internet con Java su ambo i lati: HttpInvoker ● A differenza di Hessian,Sspring HttpInvoker usa il meccanismo Java di serializzazione per esporre i servizi su HTTP. Questo si rivela assai vantaggioso se si vogliono scambiare tipi java complessi che non potrebbero essere serializzati via Hessian. JUG Milano – Meeting 33 - All4Web 19
  • 20. Spring Remoting e Java FX ● L'uso di HttpInvoker sul server prevede l'ormai familiare configurazione: <bean name="/BookService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"> <property name="service" ref="bookService"/> <property name="serviceInterface" value="BookService"/> </bean> ● Mentre sul client potremmo utilizzare l'apposito proxy <bean id="bookService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean"> <property name="serviceUrl" value="http://remotehost:8080/remoting/BookService"/> <property name="serviceInterface" value="BookService"/> </bean> JUG Milano – Meeting 33 - All4Web 20
  • 21. Apache CXF ● Merger dei progetti XFire e Celtix su Apache: http://cxf.apache.org/ ● Implementa Spring Remoting per Web Service ● WS “standard” SOAP con JAX-WS ● WS “freeform” REST con JAX-RS – serializzazione XML via JAXB – serializzazione JSON via Jettison => adatta a RIA realizzate in AJAX! JUG Milano – Meeting 33 - All4Web 21
  • 22. Spring BlazeDS Integration ● Progetto congiunto SpringSource e Adobe http://www.springsource.org/spring-flex ● Implementa Spring Remoting per Flex ● Semplifica la configurazione di BlazeDS ● Usa di BlazeDS la serializzazione AMF3, tralasciando le funzionalità da “application server” => la scelta migliore per applicazioni RIA realizzate con Flex JUG Milano – Meeting 33 - All4Web 22
  • 23. Un esempio Realizzazione di un semplice servizio di gestione di una libreria: ● Interfaccia LibraryService ● Implementazione LibraryServiceImpl ● Configurazione Exporter CXF su JSON => per client AJAX ● Configurazione Exporter BlazeDS => per client Flex JUG Milano – Meeting 33 - All4Web 23
  • 24. AOP e Spring Security ● Come proteggere il nostro backend RIA? ● Integro Spring Security via AOP non modificando la mia implementazione! ● Spring Security supporta tutti i più noti meccanismi di autenticazione: su database, LDAP, NTLM e anche SSO come CAS ● Integrazione con applicazioni web “classiche” su Spring MVC tramite la DispatcherServlet, implementazione del pattern FrontController JUG Milano – Meeting 33 - All4Web 24
  • 25. AOP e Spring Security http://www.mindtheflex.com/?p=67 JUG Milano – Meeting 33 - All4Web 25
  • 26. Spring Remoting Proxy server-side ● I Proxy di Spring Remoting possono essere utilizzati anche server-side per “adattare” servizi remoti esistenti “legacy” a client RIA ● Casi d'uso: – integro un servizio EJB 2.1 – proxy verso webservice non accessibile a Flex per mancanza di un file crossdomain.xml – caching di un servizio esterno molto lento a rispondere o non sempre accessibile JUG Milano – Meeting 33 - All4Web 26
  • 27. Spring Remoting vs. Hibernate ● Caso d'uso: devo pubblicare un servizio Spring che accede a database tramite Hibernate ● Problema: come faccio a gestire le relazioni “lazy” nell'interazione con un client RIA senza avere la malefica LazyInitializationException? ● Soluzione: tramite Spring AOP serializzo solo i dati che posso effettivamente spedire e ricevere, ad esempio solo gli ID degli oggetti! JUG Milano – Meeting 33 - All4Web 27
  • 28. Altri spunti... ● Spring Remoting va bene per interazioni sincrone stile request-response, e per interazioni asincrone stile publish-subscribe? ● Spring Integration è il nuovo progetto di Spring che definisce il modello astratto per gestirle e contiene implementazioni su JMS e thread pool ● Spring Integration è già supportato nella nuova release 1.0.0.RC1 di Spring BlazeDS Integration, seguiranno presto connettori per Jabber ecc. JUG Milano – Meeting 33 - All4Web 28
  • 29. Riferimenti ● Spring Framework http://www.springsource.org/ ● Cristophe Coenraets Blog – esempi su Spring BlazeDS Integration http://coenraets.org/blog/ ● Flex-Mojos – plugin Maven per Flex http://flexmojos.sonatype.org/ ● FNA – archetype Maven per Flex e Spring http://code.google.com/p/fna/ ● CXF JSON Support http://cwiki.apache.org/CXF20DOC/json-support.html JUG Milano – Meeting 33 - All4Web 29
  • 30. Q&A JUG Milano – Meeting 33 - All4Web 30