martedì 15 gennaio 2008

GWT In Action


Nel week end sono riuscito a procurarmi una copia del libro che avevo presentato, GWT In Action.
Userò questo post per segnarmi gli appunti presi da questo libro che potranno servirmi in futuro.
Per prima cosa, bisogna modificare qualche cosettina nel codice scaricato dal sito (http://www.manning.com/hanson/), oltre ovviamente quello indicato nel file install.txt
Leggendo sul forum del libro
Now GWT 1.4 is out and final, there are a couple of changes required for the Dashboard download code; until we get chance to replace the downloadable version, here are the changes that are needed:

1) In ToolBarImageBundle.java replace the "import com.google.gwt.user.client.ImageBundle;" with "import com.google.gwt.user.client.ui.ImageBundle;"

2) In Dashboard.java, remove "import com.google.gwt.i18n.client.DateRecord;"

For me, at least, that seems the only changes needed to make the Dashboard work with the full 1.4 release. Feel free to post other issues you find below and we'll see if we can identify fixes if needed.
  • GWT accetta solo codice scritto in Java 1.4 (al momento). Per i componenti server invece si uò usare la versione che si vuole. PAG 7
  • ci sono 3 metodi di compilazione: obfuscate (che genera codice praticamente illeggibile, ma compresso), "pretty" (che genera codice intermedio), "detailed" (che genera codice leggibile e non compresso). PAG 6
  • JSON è un formato di messaggi per scambiare dati srutturati con il browser. Sul sito http://json.org esistono i formati per molti linguaggi. In questo modo si può integrare un qualsiasi linguaggio sul server e si può dialogare senza problemi, tramite il browser, con GWT. Si usa, per esempio, quando si gestiscono le RPC con il metodo RequestBuilder. Se sul server si usa Java, non ha molto senso usare JSON, perchè si tradurrebbe da Java a JSON e poi da JSON a Java... quindi è meglio usare direttamente GWT-RPC. PAG 15 e JSON a capitolo 12
  • I widget di GWT hanno delle classi css già assegnata... quindi se si vuole si possono usare direttamente quelle nei css legati alla pagina web (ai file gwt tramite l'xml di configurazione). Per sapere quali classi ci sono per ogni widget cercare nei java docs di gwt
  • la gerarchia dei widget:


    E la loro suddivisione in categorie:
  • I nomi dei package in gwt dovrebbero rispettare il classico nome dei package e le classi (come quelle usate nella creazione con applicationCreator) dovrebbero avere il nome del package, obbligatoriamente la parola client, e il none della classe.
    Ad esempio org.gwtbook.client.Dashboard

    Facendo un salto in avanti

  • Serializzazione di oggetti:
    • Si serializzano solo i campi non transient. Anche i campi definiti final non vengono serializzati, ma è meglio sempre dichiararli transient per chiarezza.
    • Se una classe implementa com.google.gwt.user.client.rpc.IsSerializable, anche le sottoclassi, anche se non la implementano specificatamente, sono serializzabili.
    • Ai fini di ottimizzare il codice javascript creato da GWT è sempre meglio specificare i tipi delle variabili. Perchè con oggetti poco tipizzati come ArrayList, Vector, HashSet ecc... il compilatore, non sapendo il tipo della variabile, genera codice javascript molto più grosso. GWT ci permette però di specificare il tipo di queste variabili con annotazioni commentate, in questo modo, per esempio

      /**
      * @gwt.typeArgs <java.lang.String>
      */
      private ArrayList listOfNames;
  • Servizi RPC
    • Anche in questo caso è sempre meglio definire bene i tipi delle variabili, dei parametri eccetera usati dai metodi sei servizi RPC
      /**
      * @gwt.typeArgs arg1 <java.lang.Integer>
      * @gwt.typeArgs arg2 <java.util.Date>
      * @gwt.typeArgs <java.lang.String>
      */
      ArrayList operationThree (List arg1, Vector arg2);
      in questo modo si è specificato il tipo dei due parametri e il tipo del parametro di risposta (il terzo)
    • Se si vogliono sollevare eccezioni, anche l'eccezione deve essere serializzabile
  • Quando si utilizzano gli array JSON, bisogna stare attenti, non essendoci il metodo add, ma dovendo inserire ogni elemento nell'array specificandone l'indice, poichè si potrebbe avere un array con dei "buchi", cioè senza valore per alcuni degli indici interni. Questo potrebbe portare a delle eccezioni nel codice, per esempio se si richiama il metodo toString() sull'array "bucato". Per risolvere questo problema si potrebbe usare questo codice per "riempire potenziali buchi" negli array
    private void fixJsonArray(JSONArray array){
    for (int i = 0; i < array.size(); i++) {
    JSONValue val = array.get(i);
    if (val == null) {
    array.set(i, JSONNull.getInstance());
    }
    }
    }

Nessun commento: