SlideShare una empresa de Scribd logo
1 de 49
YA GWT O GOOGLE WEB TOOLKIT
YA GWT O GOOGLE WEB TOOLKIT
RIA? RICH INTERNET APPLICATION UNA NUOVA USER EXPERIENCE!
Problematiche Gli sviluppatori possono impiegare anche il 90% del loro tempo per: ,[object Object]
mantenere molto codice Javascript
gestire il ciclo di vita del software
utilizzare correttamente AJAX
La risposta è GWT Cosa non saranno più nostre preoccupazioni?  ,[object Object]
gestione corretta della history del browser
localizzazione senza refresh della pagina
offuscamento del codice
riduzione del codice
image bundle   in poche parole OTTIMIZZAZIONE
GWT = JAVA TO JAVASCRIPT Perchè Java? Una sola risposta: TOOL
GWT contro tutti VS.
Hello JUG! applicationCreator it.pronetics.gwt. client .HelloJUGApp  
Moduli *.gwt.xml In GWT è possibile definire dei  moduli . Ogni modulo è configurato in un file  con estensione:   gwt.xml     < module >     < inherits   name =&quot;com.google.gwt.user.User&quot;/>     < entry-point   class =&quot;com.example.foo.MyModule&quot;/>  </ module >    Qui definiamo l'entry-point MyModule che sarà il &quot;main&quot; del nostro applicativo
Tags *.gwt.xml <inherits name=&quot;logical-module-name&quot; /> : Per importare altri moduli   <entry-point class=&quot;classname&quot; /> : La classe entry point dell'applicazione   <source path=&quot;path&quot; //> : Definisce in quale package riesodo i sorgenti della parte client, per default il package è  client   <public path=&quot;path&quot;/> : Il percorso dove risiedono le componenti statiche e componenti di terze parti (javascript, html, immagini, etc, etc).    <servlet path=&quot;url-path&quot; class=&quot;classname&quot;/> : Definisce il componente lato server per le chiamate RPC.   <script src=&quot;js-url&quot;/>,<stylesheet src=&quot;css-url&quot;/> : Per includere javascript e css   <extend-property name=&quot;client-property-name&quot; values=&quot;comma-separated-values&quot;/> : Per aggiungere delle proprietà
Creare moduli esterni ,[object Object]
Hanno in comune l'estensione  JAR
Il nostro progetto li può includere tramite il tag  inherits . Nelle prossime slide useremo:  ,[object Object]
<inherits name=&quot;com.google.gwt.http.HTTP&quot; /> ,[object Object],[object Object]
it/pronetics/module/client/.../*.java
it/pronetics/module/client/.../*.class ,[object Object],[object Object]
EntryPoint ,[object Object]
RootPanel rappresenta, nella pagina, il contenitore di più alto livello (body html o un elemento div da noi definito). Per aggiungere elementi a RootPanel è sufficente chiamare:        RootPanel.get().add(myPanel);
Vi ricordate Swing?
Hello JUG! ./HelloJUG-shell
Ecco il codice!   public void  onModuleLoad() { Image img =  new  Image( &quot;http://code.google.com/webtoolkit/logo-185x175.png&quot; ); Button button =  new  Button( &quot;Click me&quot; ); ... VerticalPanel vPanel =  new  VerticalPanel(); ... vPanel.add(button); // Add image and button to the RootPanel RootPanel.get().add(vPanel); // Create the dialog box final DialogBox dialogBox =  new  DialogBox(); dialogBox.setText( &quot;Welcome to GWT!&quot; ); dialogBox.setAnimationEnabled(true); Button closeButton =  new  Button( &quot;close&quot; ); VerticalPanel dialogVPanel =  new  VerticalPanel(); ... closeButton.addClickListener( new  ClickListener() { public void  onClick(Widget sender) { dialogBox.hide(); } }); dialogBox.setWidget(dialogVPanel); button.addClickListener( new  ClickListener() { public void  onClick(Widget sender) { dialogBox.center(); dialogBox.show(); } }); } }
Architettura classica
Remote Procedure Call Una Remote Procedure Call è una funzione implementata lato server invocata dal client.   GWT RPC NON è la stessa tecnologia su cui sono basati i web services  SOAP  o  REST .
RPC gwt.xml   Nel nostro file gwt.xml dovremmo configurare la classe che implementa il servizio lato server.   Dobbiamo mappare inoltre anche la path alla quale tale implementazione risponderà   ... <servlet path=&quot; /countVisitors &quot;  class=&quot; it.jk.server.VisitorsCountServiceImpl &quot;/> ...
RPC diagrama del'interazione Cosa ci serve? ,[object Object]
L'interfaccia  MyServiceAsync
L'implementazione lato server  MyServiceImpl
RPC interfaccie package it.jk.client; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;   @RemoteServiceRelativePath(&quot;countVisitors&quot;) public   interface  VisitorsCountService  extends  RemoteService {      public  String  getVisitors (String name); } package it.jk.client; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; import com.google.gwt.user.client.rpc.AsyncCallback; public   interface  VisitorsCountServiceAsync {     void  getVisitors (String name,  AsyncCallback  async); }
RPC Server package it.jk.server; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import it.jk.client.VisitorsCountService; @RemoteServiceRelativePath(&quot;countVisitors&quot;) public   class  VisitorsCountServiceImpl  extends  RemoteServiceServlet  implements  VisitorsCountService {      public  String  getVisitors (String name) {         VISITORS++;         return &quot;Ciao &quot; + name + &quot; è il click numero &quot; + VISITORS;     }      private   static  int VISITORS = 0; }
RPC Client private   void  getVisitorInfo(String userName) {         // Iniziallizza il proxy per il servizio          if  (visitorCountService == null) {             visitorCountService =  GWT.create(VisitorsCountService.class) ;         }         // Prepara l'ogetto per la callback          AsyncCallback <String> callback =  new   AsyncCallback <String>() {             public void onFailure(Throwable caught) {                 // TODO: Gestione errore             }              public   void  onSuccess(String result) {                 salutoLabel.setText(result);             }         };         // Chiama il metodo per sapere quante visite ci sono state         visitorCountService.getVisitors(userName, callback);     }
Screenshot esempio RPC  
Maven?   Archetype per la generazione del progetto mvn archetype:create -DarchetypeGroupId=com.totsp.gwt -DarchetypeArtifactId=maven-googlewebtoolkit2-archetype -DarchetypeVersion=1.0.4 -DremoteRepositories=http://gwt-maven.googlecode.com/svn/trunk/mavenrepo -DgroupId=myGroupId -DartifactId=myArtifactId Comando per eseguire l'applicazione mvn com.totsp.gwt:maven-googlewebtoolkit2-plugin:gwt Vantaggi ,[object Object]
Generazione automatica file WAR
Gestione dipendenze
Scarica in automatico GWT da un repository di Maven
Flickr Mash-up Miliardi di informazioni sparse per la rete   Fare un applicativo Mash-up vuol dire sviluppare  un software capace di aggregarle in un solo punto
Ringraziamo le API...                 ...e vediamo quelle che usa Flickr http://www.flickr.com/services/api/   REST  +  JSON
Prima prova di contatto... String url =  &quot; http://www.flickr.com/services/rest/?format=json& method =flickr.interestingness.getList& api_key =a1234567a1ce1bd1aba1234 aaec123e1& user_id =1234567@N01 &quot;; RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, apiUrl); Request req = builder.sendRequest(null, new JsonRequestCallBack());     public class  JsonRequestCallBack  implements  RequestCallback {       public void  onError(Request request, Throwable exception) {              //gestisco richiesta in errore          }          public void  onResponseReceived(Request req, Response response) {              //gestisco richiesta avvenuta con successo         } }        
...ma non funziona AJAX  non permette richieste CROSS-SITE  Questo a causa del principio di sicurezza SOP (same origin policy)  Abbiamo 3 soluzioni:   1) configurare un  alias  dell'host remoto in modo da poterlo chiamare come se fosse localhost   2) Creare un componente server-side che faccia da  proxy   3)  Imbrogliare : l'unica risorsa che possiamo richiedere esternamente è Javascript...uhm...interessante
Ok, imbrogliamo! L'output dei servizi REST+JSON di Flickr (ma anche Google e altri) può avvenire in due modi:   ,[object Object]
  myCallbackFunction ({&quot;photos&quot;: {&quot;page&quot;:1, &quot;pages&quot;:5, &quot;perpage&quot;:100, &quot;total&quot;:500, ...)   myCallbackFunction  sarà il nome di una funzione Javascript a cui sarà passato l'oggetto JSON ritornato da Flickr   L'url è diventato: String url =  &quot; http://.../rest/?format=json& method =...& api_key =a...1& user_id =1234567@N01& jsoncallback = myCallbackFunction &quot;;

Más contenido relacionado

La actualidad más candente

Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacyTommaso Torti
 
Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5Pietro Polsinelli
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS BuildGian Maria Ricci
 
AngularJS: server communication
AngularJS: server communicationAngularJS: server communication
AngularJS: server communicationVittorio Conte
 
Spring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis WebSpring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis WebMassimiliano Dessì
 
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryAlberto Buschettu
 
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
Corso WebApp iOS - Lezione 06:   Web Development for iOS DevicesCorso WebApp iOS - Lezione 06:   Web Development for iOS Devices
Corso WebApp iOS - Lezione 06: Web Development for iOS DevicesAndrea Picchi
 
Introduzione a Sass e Less (ITA)
Introduzione a Sass e Less (ITA)Introduzione a Sass e Less (ITA)
Introduzione a Sass e Less (ITA)Valerio Radice
 
Marco Rho: Magento theme development workflow con Grunt
Marco Rho: Magento theme development workflow con GruntMarco Rho: Magento theme development workflow con Grunt
Marco Rho: Magento theme development workflow con GruntMeet Magento Italy
 
Simone Carletti: Zend Framework ed i Web Service
Simone Carletti: Zend Framework ed i Web ServiceSimone Carletti: Zend Framework ed i Web Service
Simone Carletti: Zend Framework ed i Web ServiceFrancesco Fullone
 
JAMP DAY 2010 - ROMA (3)
JAMP DAY 2010 - ROMA (3)JAMP DAY 2010 - ROMA (3)
JAMP DAY 2010 - ROMA (3)jampslide
 
Lezione12: Autenticazione e gestione delle sessioni in REST
Lezione12: Autenticazione e gestione delle sessioni in RESTLezione12: Autenticazione e gestione delle sessioni in REST
Lezione12: Autenticazione e gestione delle sessioni in RESTAndrea Della Corte
 
Ajax Primi Passi Per Iniziare
Ajax Primi Passi Per IniziareAjax Primi Passi Per Iniziare
Ajax Primi Passi Per Iniziareastanco
 
JAMP DAY 2010 - ROMA (4)
JAMP DAY 2010 - ROMA (4)JAMP DAY 2010 - ROMA (4)
JAMP DAY 2010 - ROMA (4)jampslide
 
Spring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis WebSpring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis WebMassimiliano Dessì
 

La actualidad más candente (20)

Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacy
 
Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS Build
 
AngularJS: server communication
AngularJS: server communicationAngularJS: server communication
AngularJS: server communication
 
Spring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis WebSpring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis Web
 
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in Jquery
 
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
Corso WebApp iOS - Lezione 06:   Web Development for iOS DevicesCorso WebApp iOS - Lezione 06:   Web Development for iOS Devices
Corso WebApp iOS - Lezione 06: Web Development for iOS Devices
 
Introduzione a Sass e Less (ITA)
Introduzione a Sass e Less (ITA)Introduzione a Sass e Less (ITA)
Introduzione a Sass e Less (ITA)
 
Marco Rho: Magento theme development workflow con Grunt
Marco Rho: Magento theme development workflow con GruntMarco Rho: Magento theme development workflow con Grunt
Marco Rho: Magento theme development workflow con Grunt
 
Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
Simone Carletti: Zend Framework ed i Web Service
Simone Carletti: Zend Framework ed i Web ServiceSimone Carletti: Zend Framework ed i Web Service
Simone Carletti: Zend Framework ed i Web Service
 
JAMP DAY 2010 - ROMA (3)
JAMP DAY 2010 - ROMA (3)JAMP DAY 2010 - ROMA (3)
JAMP DAY 2010 - ROMA (3)
 
Lezione12: Autenticazione e gestione delle sessioni in REST
Lezione12: Autenticazione e gestione delle sessioni in RESTLezione12: Autenticazione e gestione delle sessioni in REST
Lezione12: Autenticazione e gestione delle sessioni in REST
 
Corso angular js componenti
Corso angular js componentiCorso angular js componenti
Corso angular js componenti
 
Ajax Primi Passi Per Iniziare
Ajax Primi Passi Per IniziareAjax Primi Passi Per Iniziare
Ajax Primi Passi Per Iniziare
 
JAMP DAY 2010 - ROMA (4)
JAMP DAY 2010 - ROMA (4)JAMP DAY 2010 - ROMA (4)
JAMP DAY 2010 - ROMA (4)
 
Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
 
Angular js: routing
Angular js: routingAngular js: routing
Angular js: routing
 
Spring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis WebSpring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis Web
 

Destacado

Tapestry 5 in Action Introduzione
Tapestry 5 in Action IntroduzioneTapestry 5 in Action Introduzione
Tapestry 5 in Action Introduzionemaraexception
 
NHL Troubleshooting Tool
NHL Troubleshooting ToolNHL Troubleshooting Tool
NHL Troubleshooting Toolntufts
 
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica maraexception
 
Consumer Business Intelligence
Consumer Business IntelligenceConsumer Business Intelligence
Consumer Business Intelligenceguestee0806
 
Social Media in the enterprise
Social Media in the enterpriseSocial Media in the enterprise
Social Media in the enterprisechristian.kelley
 
Maraton Pisania Listów 2007 - Kogo bronimy
Maraton Pisania Listów 2007 - Kogo bronimyMaraton Pisania Listów 2007 - Kogo bronimy
Maraton Pisania Listów 2007 - Kogo bronimyamnesty07
 
Wicket Security Presentation
Wicket Security PresentationWicket Security Presentation
Wicket Security Presentationmrmean
 

Destacado (7)

Tapestry 5 in Action Introduzione
Tapestry 5 in Action IntroduzioneTapestry 5 in Action Introduzione
Tapestry 5 in Action Introduzione
 
NHL Troubleshooting Tool
NHL Troubleshooting ToolNHL Troubleshooting Tool
NHL Troubleshooting Tool
 
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
 
Consumer Business Intelligence
Consumer Business IntelligenceConsumer Business Intelligence
Consumer Business Intelligence
 
Social Media in the enterprise
Social Media in the enterpriseSocial Media in the enterprise
Social Media in the enterprise
 
Maraton Pisania Listów 2007 - Kogo bronimy
Maraton Pisania Listów 2007 - Kogo bronimyMaraton Pisania Listów 2007 - Kogo bronimy
Maraton Pisania Listów 2007 - Kogo bronimy
 
Wicket Security Presentation
Wicket Security PresentationWicket Security Presentation
Wicket Security Presentation
 

Similar a Yagwto

Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Fabrizio Bernabei
 
Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance OptimizationAlessandro Martin
 
Seam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoSeam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoJava User Group Roma
 
April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5JBug Italy
 
E suap - tecnologie client
E suap - tecnologie client E suap - tecnologie client
E suap - tecnologie client Sabino Labarile
 
Qt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt DesignerQt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt DesignerPaolo Sereno
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.jsMichele Capra
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con ScalaFranco Lombardo
 
Sviluppare estensioni per google chrome
Sviluppare estensioni per google chromeSviluppare estensioni per google chrome
Sviluppare estensioni per google chromeMarco Vito Moscaritolo
 
jQuery e i suoi plugin
jQuery e i suoi pluginjQuery e i suoi plugin
jQuery e i suoi pluginPasquale Puzio
 
Le novita di visual studio 2012
Le novita di visual studio 2012Le novita di visual studio 2012
Le novita di visual studio 2012Crismer La Pignola
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
Rich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsRich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsGiorgio Di Nardo
 

Similar a Yagwto (20)

Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010
 
Html5 e PHP
Html5 e PHPHtml5 e PHP
Html5 e PHP
 
Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance Optimization
 
Seam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoSeam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano Ciccazzo
 
April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5
 
E suap - tecnologie client
E suap - tecnologie client E suap - tecnologie client
E suap - tecnologie client
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
 
Qt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt DesignerQt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
 
Java lezione 14
Java lezione 14Java lezione 14
Java lezione 14
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
Hexagonal architecture ita
Hexagonal architecture itaHexagonal architecture ita
Hexagonal architecture ita
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Sviluppare estensioni per google chrome
Sviluppare estensioni per google chromeSviluppare estensioni per google chrome
Sviluppare estensioni per google chrome
 
jQuery e i suoi plugin
jQuery e i suoi pluginjQuery e i suoi plugin
jQuery e i suoi plugin
 
AngularJS-Intro
AngularJS-IntroAngularJS-Intro
AngularJS-Intro
 
Le novita di visual studio 2012
Le novita di visual studio 2012Le novita di visual studio 2012
Le novita di visual studio 2012
 
Java lezione 16
Java lezione 16Java lezione 16
Java lezione 16
 
Js intro
Js introJs intro
Js intro
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
Rich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsRich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.js
 

Yagwto

  • 1. YA GWT O GOOGLE WEB TOOLKIT
  • 2. YA GWT O GOOGLE WEB TOOLKIT
  • 3. RIA? RICH INTERNET APPLICATION UNA NUOVA USER EXPERIENCE!
  • 4.
  • 6. gestire il ciclo di vita del software
  • 8.
  • 9. gestione corretta della history del browser
  • 13. image bundle   in poche parole OTTIMIZZAZIONE
  • 14. GWT = JAVA TO JAVASCRIPT Perchè Java? Una sola risposta: TOOL
  • 16. Hello JUG! applicationCreator it.pronetics.gwt. client .HelloJUGApp  
  • 17. Moduli *.gwt.xml In GWT è possibile definire dei moduli . Ogni modulo è configurato in un file con estensione: gwt.xml     < module >     < inherits name =&quot;com.google.gwt.user.User&quot;/>     < entry-point class =&quot;com.example.foo.MyModule&quot;/>  </ module >   Qui definiamo l'entry-point MyModule che sarà il &quot;main&quot; del nostro applicativo
  • 18. Tags *.gwt.xml <inherits name=&quot;logical-module-name&quot; /> : Per importare altri moduli   <entry-point class=&quot;classname&quot; /> : La classe entry point dell'applicazione   <source path=&quot;path&quot; //> : Definisce in quale package riesodo i sorgenti della parte client, per default il package è client <public path=&quot;path&quot;/> : Il percorso dove risiedono le componenti statiche e componenti di terze parti (javascript, html, immagini, etc, etc).   <servlet path=&quot;url-path&quot; class=&quot;classname&quot;/> : Definisce il componente lato server per le chiamate RPC.   <script src=&quot;js-url&quot;/>,<stylesheet src=&quot;css-url&quot;/> : Per includere javascript e css   <extend-property name=&quot;client-property-name&quot; values=&quot;comma-separated-values&quot;/> : Per aggiungere delle proprietà
  • 19.
  • 20. Hanno in comune l'estensione JAR
  • 21.
  • 22.
  • 24.
  • 25.
  • 26. RootPanel rappresenta, nella pagina, il contenitore di più alto livello (body html o un elemento div da noi definito). Per aggiungere elementi a RootPanel è sufficente chiamare:        RootPanel.get().add(myPanel);
  • 29. Ecco il codice!   public void onModuleLoad() { Image img = new Image( &quot;http://code.google.com/webtoolkit/logo-185x175.png&quot; ); Button button = new Button( &quot;Click me&quot; ); ... VerticalPanel vPanel = new VerticalPanel(); ... vPanel.add(button); // Add image and button to the RootPanel RootPanel.get().add(vPanel); // Create the dialog box final DialogBox dialogBox = new DialogBox(); dialogBox.setText( &quot;Welcome to GWT!&quot; ); dialogBox.setAnimationEnabled(true); Button closeButton = new Button( &quot;close&quot; ); VerticalPanel dialogVPanel = new VerticalPanel(); ... closeButton.addClickListener( new ClickListener() { public void onClick(Widget sender) { dialogBox.hide(); } }); dialogBox.setWidget(dialogVPanel); button.addClickListener( new ClickListener() { public void onClick(Widget sender) { dialogBox.center(); dialogBox.show(); } }); } }
  • 31. Remote Procedure Call Una Remote Procedure Call è una funzione implementata lato server invocata dal client.   GWT RPC NON è la stessa tecnologia su cui sono basati i web services SOAP o REST .
  • 32. RPC gwt.xml   Nel nostro file gwt.xml dovremmo configurare la classe che implementa il servizio lato server.   Dobbiamo mappare inoltre anche la path alla quale tale implementazione risponderà   ... <servlet path=&quot; /countVisitors &quot;  class=&quot; it.jk.server.VisitorsCountServiceImpl &quot;/> ...
  • 33.
  • 36. RPC interfaccie package it.jk.client; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;   @RemoteServiceRelativePath(&quot;countVisitors&quot;) public interface VisitorsCountService extends RemoteService {     public String getVisitors (String name); } package it.jk.client; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; import com.google.gwt.user.client.rpc.AsyncCallback; public interface VisitorsCountServiceAsync {     void getVisitors (String name, AsyncCallback async); }
  • 37. RPC Server package it.jk.server; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import it.jk.client.VisitorsCountService; @RemoteServiceRelativePath(&quot;countVisitors&quot;) public class VisitorsCountServiceImpl extends RemoteServiceServlet implements VisitorsCountService {     public String getVisitors (String name) {         VISITORS++;         return &quot;Ciao &quot; + name + &quot; è il click numero &quot; + VISITORS;     }     private static int VISITORS = 0; }
  • 38. RPC Client private void getVisitorInfo(String userName) {         // Iniziallizza il proxy per il servizio         if (visitorCountService == null) {             visitorCountService = GWT.create(VisitorsCountService.class) ;         }         // Prepara l'ogetto per la callback         AsyncCallback <String> callback = new AsyncCallback <String>() {             public void onFailure(Throwable caught) {                 // TODO: Gestione errore             }             public void onSuccess(String result) {                 salutoLabel.setText(result);             }         };         // Chiama il metodo per sapere quante visite ci sono state         visitorCountService.getVisitors(userName, callback);     }
  • 40.
  • 43. Scarica in automatico GWT da un repository di Maven
  • 44. Flickr Mash-up Miliardi di informazioni sparse per la rete   Fare un applicativo Mash-up vuol dire sviluppare  un software capace di aggregarle in un solo punto
  • 45. Ringraziamo le API...                 ...e vediamo quelle che usa Flickr http://www.flickr.com/services/api/   REST + JSON
  • 46. Prima prova di contatto... String url =  &quot; http://www.flickr.com/services/rest/?format=json& method =flickr.interestingness.getList& api_key =a1234567a1ce1bd1aba1234 aaec123e1& user_id =1234567@N01 &quot;; RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, apiUrl); Request req = builder.sendRequest(null, new JsonRequestCallBack());     public class JsonRequestCallBack implements RequestCallback {      public void onError(Request request, Throwable exception) {             //gestisco richiesta in errore          }          public void onResponseReceived(Request req, Response response) {             //gestisco richiesta avvenuta con successo         } }        
  • 47. ...ma non funziona AJAX non permette richieste CROSS-SITE Questo a causa del principio di sicurezza SOP (same origin policy) Abbiamo 3 soluzioni:   1) configurare un alias dell'host remoto in modo da poterlo chiamare come se fosse localhost   2) Creare un componente server-side che faccia da proxy   3) Imbrogliare : l'unica risorsa che possiamo richiedere esternamente è Javascript...uhm...interessante
  • 48.
  • 49.   myCallbackFunction ({&quot;photos&quot;: {&quot;page&quot;:1, &quot;pages&quot;:5, &quot;perpage&quot;:100, &quot;total&quot;:500, ...)   myCallbackFunction sarà il nome di una funzione Javascript a cui sarà passato l'oggetto JSON ritornato da Flickr   L'url è diventato: String url =  &quot; http://.../rest/?format=json& method =...& api_key =a...1& user_id =1234567@N01& jsoncallback = myCallbackFunction &quot;;
  • 50.
  • 51. GWT rinomina i metodi per ridurre le dimensioni del js Soluzione   Con JSNI definiamo codice Javascript in una una classe public native static void getJson(String callback , String url, MyHandler h ) /*-{ var script = document.createElement(&quot;script&quot;);  script.setAttribute(&quot;src&quot;, url+ callback ); script.setAttribute(&quot;type&quot;, &quot;text/javascript&quot;); window[callback] = function(jsonObj){ h .@ it.pronetics.MyHandler::handle (Lcom/google/gwt/core/client/JavaScriptObject;)( obj );     window[callback + &quot;done&quot;] = true; }        document.body.appendChild(script); }-*/;
  • 52. Ancora J ava S cript N ative I nterface package it.pronetics; ...   public class MyHandler {      public void handle(JavaScriptObject javaScriptObject) {         //creiamo l'oggetto JSON         JSONObject object = new JSONObject(javaScriptObject);         // isObject() e isArray() ritornano null in caso di errore,         // il valore recuperato in caso di successo         JSONArray photos = object.get( &quot;photos&quot; ).isObject().get( &quot;photo&quot; ).isArray();         String thumbnail = buildPhotoUrl(photoJson, &quot;s&quot;);         ....         Image image = new Image(thumbnail);         gallery.setWidget(row, column, image);      } ... bla bla bla ... }
  • 54. Il mio widget public class ImageSlide extends Composite { //estendere la classe Composite come consigliato da GWT public ImageSlide(String thumbnail, String preview, final String link) {          VerticalPanel mainPanel = new VerticalPanel();         HorizontalPanel details = new HorizontalPanel();                  Image thumbnailImage = new Image(thumbnail);         mainPanel.add(thumbnailImage);         mainPanel.add(details);         mainPanel.setBorderWidth(1);                  Button show = new Button(&quot;Show&quot;);         Button open = new Button(&quot;Open&quot;);         details.add(show);         details.add(open);                  final PopupPanel popup = new PopupPanel();            Image previewImage = new Image(preview);         VerticalPanel imagePanel = new VerticalPanel();         imagePanel.add(previewImage);                  previewImage.addClickListener(new ClickListener(){ public void onClick(Widget sender) { popup.hide(); }  });         popup.setWidget(imagePanel);                  show.addClickListener(new ClickListener(){ public void onClick(Widget sender) { popup.show(); } });                  open.addClickListener(new ClickListener(){ public void onClick(Widget sender) { Window.open(link, &quot;_blank&quot;,&quot;enabled&quot;);}});                  initWidget(mainPanel); //chiamata obbligatoria!     } }
  • 56. ...ma questa è meglio...
  • 58. ...ma come abbiamo fatto?     public ImageSlide(String thumbnail, String preview, String title, final String link) {        ... creo vari panel ...                  Image thumbnailImage = new Image(thumbnail);         thumbnailImage.setStyleName(&quot;image-panel&quot;);         mainPanel.add(thumbnailImage);         mainPanel.setCellHorizontalAlignment(thumbnailImage, HasHorizontalAlignment.ALIGN_CENTER);         mainPanel.add(details);                  Button open = new Button(&quot;View on Flickr&quot;, new OpenLinkOnClick(link));         open.setWidth(&quot;100%&quot;);         Button close = new Button(&quot;Close me!&quot;, new ClosePopupPanelOnClick(popup));         close.setWidth(&quot;100%&quot;);                  Image previewImage = new Image(preview);         VerticalPanel imagePanel = new VerticalPanel();         imagePanel.add(previewImage);                  infoPanel.add(new Label(title, true));         infoPanel.add(open);         infoPanel.add(close);                  previewTab.add(imagePanel, &quot;Image&quot;);         previewTab.add(infoPanel, &quot;Get Info&quot;);         previewTab.selectTab(0);         previewTab.setAnimationEnabled(true);                  previewImage.addClickListener(new ClosePopupPanelOnClick(popup));             thumbnailImage.addClickListener(new DisplayPopupOnClick(popup));                  initWidget(mainPanel); //chiamata obbligatoria!     }
  • 59. Ma soprattutto CSS E' stato modificato il file FlickrGWT.css   .image-panel {     background: url('img/bg.png') no-repeat top center;     padding: 0px 10px 10px 10px; } Ricordate : GWT in fondo crea semplici pagine HTML i cui stili possono essere impostati con semplici CSS
  • 60.
  • 61. Specifichiamo l'id del div che conterrà la nostra applicazione: RootPanel.get(&quot;flickr-gallery&quot;).add(gallery);
  • 62. Scriviamo un po' di css e html e...
  • 63. Image Bundle? Problema Troppe request uccidono i nostri server Soluzione Una sola request per le immagini usate nel nostro applicativo
  • 64.
  • 65. Basta definire una interfaccia interface ToolBarImage extends ImageBundle {          @Resource ( &quot;img/open.png&quot; )         AbstractImagePrototype open();         ....         @Resource ( &quot;img/save.png&quot; )         AbstractImagePrototype save();  }
  • 66. L'utilizzo è ancora più semplice ToolBarImage bundle = (ToolBarImage)GWT.create(ToolBarImage. class ); Image save = bundle.save().createImage(); toolbar.add(save);
  • 67. Plugin e widget per la view
  • 68.
  • 69.
  • 70. SUCO - http://code.google.com/p/suco/
  • 71. RocketGWT - http://code.google.com/p/rocket-gwt/
  • 72.
  • 73. GWT Widget Library -http://gwt-widget.sourceforge.net/
  • 74.
  • 75. Usciamo dal browser con PRISM Mozilla Prism è un plugin per Firefox che permette la trasformazione di applicazioni web in applicazioni desktop
  • 76.
  • 79. Local server per file, immagini, javascript, css
  • 80. Una combinazione vincente GWT + GEAR + PRISM = COOL APPLICATION
  • 81.
  • 88.
  • 89. Stefano Linguerri stefano.linguerri @pronetics.it http://www.eljeko.net Contatti