Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit •...

21
Google Web Toolkit Angelo Di Iorio

Transcript of Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit •...

Page 1: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Google  Web  Toolkit  

Angelo  Di  Iorio  

Page 2: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Google  Web  Toolkit  

•  GWT  è  un  framework  open-­‐source  per  costruire  e  ges<re  applicazioni  Ajax  in  Java  –  hCps://developers.google.com/web-­‐toolkit/  

•  Sia  i  moduli  server-­‐side  che  client-­‐side  sono  scriI  in  Java:  –  Il  framework  “compila”  la  parte  client-­‐side  in  HMTL  +  Javascript  

–  La  parte  server-­‐side  è  tradoCa  in  Servlet  Java  –  La  comunicazione,  sia  sincrona  che  asincrona,  è  in  HTTP  ma  in  modo  trasparente  all’utente  aCraverso  GWT  RPC  •  Gli  oggeI  sono  spedi<  direCamente  dal  client  al  server  e  il  framework  si  occupa  della  serializzazione/deserializzazione  e  trasmissione  via  HTTP    

Page 3: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,
Page 4: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Toolkit  

•  La  distribuzione  GWT  include  un  set  di  tool:  

–  SDK:  le  librerie  core  e  il  compilatore  

–  GWT  Plugin  Eclipse:  supporto  per  sviluppo,  debug  e  deploy  dire;amente  in  Eclipse  

–  webAppCreator:  comman-­‐line  tool  per  generare  tuI  i  file  necessari  per  un  progeCo  GWT  

–  SpeedTracer:  estensione  del  browser  Chrome  per  monitorare  le  performance  

–  GWT  Designer:  Java  GUI  per  creare  interfacce  e  layout  delle  applicazioni  GWT  e  generare  automa<camente  il  codice  rela<vo    

Page 5: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

GWT  in  Eclipse  

•  hCps://developers.google.com/web-­‐toolkit/usingeclips  

Page 6: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Web  Applica<on  Project  

Il  plugin  Eclipse  genera  automa<camente  un’applicazione  di  esempio,  completa.  Un  buon  punto  di  partenza.  

[vedi  demo]  

Page 7: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Debug  e  Produc<on  mode  

•  Development  mode  –  Codice  compilato  ed  eseguite  direCamente  sulla  JVM  –  Semplifica  il  debug,  non  richiede  compilazione    – Web  Container  locale  (JeCy  o  Tomcat)  –  Richiede  installazione  di  un  plug-­‐in  per  il  browser  –  Interamente  integrato  in  Eclipse  

•  Produc<on  mode  –  Il  sorgen<  del  client  sono  compila<  in  HTML  +  JS  – Non  richiede  un  Web  Container  

•  Deploy  on  Google  App  Engine  

[vedi  demo]  

Page 8: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

StruCura  di  un  progeCo  GWT  File  di  configurazione  e  dichiarazione  dei  moduli  GWT  

Sorgen<  del  client  

Sorgen<  del  server  

Classi  e  moduli  condivisi  

Test  

Host  Page  

Foglio  di  s<le  principale  

Directory  di  deploy  e  risorse  web  pubbliche  

EntryPoint  

Page 9: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Host  page,  Entry  Point  e  onModuleLoad  

/** * This is the entry point method. */public void onModuleLoad() {final Button sendButton = new Button("Send");final TextBox nameField = new TextBox();nameField.setText("GWT User");final Label errorLabel = new Label();

// We can add style names to widgetssendButton.addStyleName("sendButton");

// Add the nameField and sendButton to the RootPanel// Use RootPanel.get() to get the entire body elementRootPanel.get("nameFieldContainer").add(nameField);…  

<tr> <td id="nameFieldContainer"></td>

<td id="sendButtonContainer"></td> </tr>

Creazione    Widgets  

S<le  CSS  

Bind  HTML  

Page 10: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Widgets  and  Panels  

•  GWT  fornisce  un  set  esteso  di  classi  per  costruire  l’interfaccia  dell’applicazione:  –  Panels:  per  organizzare  gli  oggeI  nello  spazio  (TabPanel,  FlowPanel,  Ver<calPanel,  HorizontalPanel,  etc.)  •  RootPanel:  container  per  gli  elemen<  dinamici,  può  essere  usato  per  generare  il  body  della  pagina  o  elemen</containers  specifici  

– Widget:  oggeI  atomici  dell’interfaccia  (BuCon,  Label,  ListBox,  PushBuCon,  RadioBuCon,  etc.)  

•  hCps://developers.google.com/web-­‐toolkit/doc/latest/RefWidgetGallery    

Page 11: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Events  

•  I  comportamen<  dinamici  client-­‐side  si  definiscono  tramite  even<  e  event  handlers  –  Si  associa  al  widget  su  cui  si  vuole  caCurare  un  evento  l’handler  corrispondente,  che  implementa  una  o  più  interfacce  

–  Ogni  interfaccia  definisce  uno  o  più  metodi  che  il  widget  richiama  al  verificarsi  dell’evento  

•  Gli  Event  Handlers  possono  essere  anonimi  (passa<  direCamente  al  widget)  o  defini<  in  classi  (riusabili  da  più  widget)  

Page 12: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Events  // Add a handler to send the name to the serverMyHandler handler = new MyHandler();sendButton.addClickHandler(handler);

// Create a handler for the sendButton and nameFieldclass MyHandler implements ClickHandler, KeyUpHandler {

/** * Fired when the user clicks on the sendButton. */public void onClick(ClickEvent event) {sendNameToServer();}

/** * Fired when the user types in the nameField. */public void onKeyUp(KeyUpEvent event) {if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {sendNameToServer();}

}  

Page 13: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

GWT  RPC  •  GWT  RPC  (Remote  Procedure  Call)  permeCe  di  trasferire  oggeI  Java  

dal  client  al  server,  e  viceversa,  usando  HTTP  in  modo  trasparente  

•  Il  client  invoca  direCamente  un  metodo  del  server  chiamato  service  •  E’  necessario  definire:  

–  L’interfaccia  del  service  –  L’interfaccia  asincrona  del  service  (che  verrà  richiamata  dal  client)  

–  L’implementazione  del  service  

•  GWT  si  occupa  di:  –  Generare  una  classe  Proxy  che  esegue  la  chiamata  al  service  (via  HTTP)  

–  Ges<re  la  serializzazione/deserializzazione  degli  oggeI  e  il  loro  trasferimento  (tramite  metodi  e  parametri  HTTP)  

–  Tradurre  il  service  in  Servlet  

•  hCps://developers.google.com/web-­‐toolkit/doc/latest/DevGuideServerCommunica<on  

Page 14: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

RPC  Plumbing  Diagram  

Page 15: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

@RemoteServiceRelativePath("color")public interface ColorService extends RemoteService {

Color translate(String color) throws IllegalArgumentException;}  

ColorService.java  

public interface ColorServiceAsync {

void translate(String color, AsyncCallback<Color> callback);

}  

ColorServiceAsync.java  

public class ColorServiceImpl extends RemoteServiceServlet implementsColorService {

public Color translate(String color) throws IllegalArgumentException{

//implementazione del servizio}  

ColorServiceImpl.java  

SERV

ER  

CLIENT  

[vedi  demo  Eclipse]  

Page 16: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Chiamata  RPC  private final ColorServiceAsync colorService = GWT.create(ColorService.class);

colorService.translate(color,

new AsyncCallback<Color>() {

public void onFailure(Throwable caught) {// gestione errori}

public void onSuccess(Color result) {

// leggi e usa output del servizio, istanza di Color// es: aggiunge widget (frammento HTML) al bodyRootPanel.get().add(new HTML(result.getName()));}

});  

Page 17: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Chiamata  RPC  in  un  EventHandler  @Overridepublic void onClick(ClickEvent event) {

String color = ((RadioButton) event.getSource()).getText();

colorService.translate(color,

new AsyncCallback<Color>() {

public void onFailure(Throwable caught) {// gestione errori}public void onSuccess(Color result) {

// leggi e usa output del servizio, istanza di Color// es: aggiunge widget (frammento HTML) al bodyRootPanel.get().add(new HTML(result.getName()));}

});}  

Page 18: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

GWT  Serializa<on  •  Gli  oggeI  spedi<  tramite  RPC  devono  essere  serializzabili  

•  GWT  definisce  alcuni  <pi  serizalizzabili  (primi<vi,  String,  Boolean,  Float,  or  Double,  Enumera<on,  etc.)  e  può  serializzare/deserializzare  le  classi  defini<  dagli  uten<,  se  si  verificano  alcune  condizioni  –  hCps://developers.google.com/web-­‐toolkit/doc/latest/

DevGuideServerCommunica<on#DevGuideSerializableTypes  

import java.io.Serializable;

@SuppressWarnings("serial")public class Color implements Serializable{

private String name;

public String getName() {return name;}

public void setName(String name) {this.name = name;}

}  

Page 19: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

GWT  e  Persistenza  (e  Hibernate)  

•  GWT  non  si  occupa  direCamente  della  persistenza  dei  da<  •  I  moduli  server-­‐side  possono  usare  tuCe  le  comuni  librerie  

Java,  ad  esempio:  –  JDBC,  Java  DataBase  Connec<vity  –  ORM,  Object-­‐Rela<onal  Mapping  –  DTO,  Data  Transfer  Object  –  Hibernate  

•  Warning:  gli  oggeI    client-­‐side  GWT  non  sono  compa<bili  con  gli  oggeI  Hibernate    –  Necessario  creare  due  classi,  una  server  e  una  client-­‐side,  e  

usare  DTO  per  trasferire  gli  oggeI  

•  Tutorial  su  GWT  e  Hibernate:  –  hCps://developers.google.com/web-­‐toolkit/ar<cles/using_gwt_with_hibernate  

Page 20: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

Tes<ng  su  GWT  •  GWT  include  una  classe  GWTTestCase  che  permeCe  di  eseguire  

test  in  JUnit  

–  GWTTestCase    estende  JUnit  TestCase  (e  può  essere  quindi  lanciata  da  command-­‐line,  Eclipse,  etc.)  ma  è  u<le  per  testare  i  moduli  client-­‐side    

–  GWTTestCase    permeCe  anche  di  eseguire  chiamate  RPC  e  verificare  il  risultato  •  API  estesa  (metodi  delayTestFinish()  e  finishTest())  per  eseguire  il  test  i  modalità  asincrona    

–  GWTTestSuite  permeCe  di  aggregare  GWTTestCase    

•  Il  codice  server-­‐side  può  e  deve  essere  testato  con  JUnit  TestCase  

•  hCps://developers.google.com/web-­‐toolkit/doc/latest/DevGuideTes<ng    

Page 21: Google&Web&Toolkitsweng.web.cs.unibo.it/wp-content/uploads/2013/05/gwt.pdf · Toolkit • Ladistribuzione&GWT&include&un&setdi& tool: – SDK:lelibrerie" coreeilcompilatore – GWT"Plugin"Eclipse:supportopersviluppo,

GWT  Tutorial  e  Development  Guide    

•  hCps://developers.google.com/web-­‐toolkit/doc/latest/tutorial/  

•  hCps://developers.google.com/web-­‐toolkit/doc/latest/DevGuide