SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Downloaden Sie, um offline zu lesen
 

                               




Google Web Toolkit 
Tutorial   
 
Anişoara Sava, OC2 
Marcela Daniela Mihai, OC2 
 
 
10/19/2009 
 
Table of Contents 
 

1.  Prezentare generală ................................................................................................................ 3 

2.  Principii de bază GWT .............................................................................................................. 3 

3.  Arhitectura GWT ...................................................................................................................... 4 

    3.1  Structura unui proiect GWT ................................................................................................. 6 

    3.2 Interoperabilitatea cu Standardele Web şi Serviciile Web ................................................... 8 

4.  Instrumente GWT .................................................................................................................... 8 

    4.1 Compilatorul Java‐to‐JavaScript ........................................................................................... 9 

    4.2 JSNI (JavaScript Native Interface) ....................................................................................... 11 

    4.3 Widget‐uri  şi  Panel Library ................................................................................................ 12 

    4.4 Protocolul Remote Procedure Call (RPC) ............................................................................ 13 

    4.5 Managementul butonului “Back” al browser‐ului / Browser History ................................ 16 

    4.6 Integrarea JUnit cu  GWT .................................................................................................... 17 

5.  Modul Host vs Modul Web .................................................................................................... 18 

6.  Utilitatea GWT ....................................................................................................................... 23 

7.  Comparație cu alte framework‐uri ........................................................................................ 24 

    7.1 GWT vs SWING .................................................................................................................... 24 

    7.2 GWT vs. Echo2 .................................................................................................................... 25 

    7.3 GWT vs JSF .......................................................................................................................... 25 

    7.4 GWT vs Ruby on Rails .......................................................................................................... 26 

 

 

 
 

 


    1. Prezentare generală 
        Platforma Web 2.0 împreună cu tehnologia Ajax din cadrul acesteia, a câştigat tot mai 
multă  atenție  datorită  faptului  că  pentru  aplicațiile  web,  cel  mai  important  beneficiu  adus  de 
Ajax îl constituie îmbunătățirea experienței utilizatorilor.  

        Deşi JavaScript şi DHTML ‐ limbaje aflate la baza tehnologiei Ajax ‐ sunt disponibile de 
câțiva  ani,  cei  mai  mulți  programatori  încearcă  să  le  evite  datorită  dificultății  de  folosire  a 
acestora.  Astăzi,  framework‐uri  scrise  în  JavaScript  precum  Dojo,  pot  fi  folosite  pentru 
realizarea aplicațiilor Ajax, însă, acest fapt necesită cunoştințe solide de JavaScript. Ca soluție la 
acestă  problemă,  Google  vine  în  sprijinul  programatorilor  Java,  cu  un  nou  framework  pentru 
crearea de aplicații Ajax mult mai productive: Google Web Toolkit (GWT). 


    2. Principii de bază GWT  
Pe  parcursul  ultimilor  ani,  s‐au  dezvoltat  numeroase  framework‐uri  Java  pentru  realizarea 
aplicațiilor  web. Din prima generație de astfel de framework‐uri face parte venerabilul Apache 
Struts,  iar  a  doua  generație  cuprinde  framework‐uri  precum  Tapestry  şi  JavaServerFaces. 
Google Web Toolkit dă startul celei de‐a treia generații de framework‐uri, oferind, la fel ca cea 
de‐a  doua  generație,  suport  pentru  folosirea  componentelor  (componentele  pot  fi  folosite  de 
dezvoltatori  pentru  crearea  de  noi  componente  care  pot  fi  adăugate  în  aplicație  pentru 
îmbunătățirea  funcționalității  paginlor  web),  numite  în  GWT  widgets,  însă  se  diferențiază  de 
predecesorii săi prin faptul că nu este o tehnologie care foloseşte  clasicele  form‐uri. GWT este 
primul framework pentru crearea de aplicații web folosind limbajul Java care permite realizarea 
de aplicații asemănătoare cu cele pentru desktop, dar care sunt rulate în browser. Cu această 
inovație,  dezvoltatorii  pot  renunța  la  construcția  de  aplicații  web  compuse  din  “arhaicele” 
pagini,  trecând  la  aplicații  care  rulează  într‐o  singură  fereastră  a  browserului,  similar  cu 
aplicațiile pentru desktop construite cu AWT, Swing sau SWT. Astfel, GWT nu e o evoluție, ci o 
revoluție  deoarece  desființează  în  totalitate  fundamentele  modalității  de  construire  a 
aplicațiilor web. 

        Google Web Toolkit(GWT) este un set de unelte de dezvoltare, utilități de programare şi 
widget‐uri  care  permit  crearea  cu  uşurință  a  aplicațiilor  AJAX.  Această  tehnologie  este 
disponibilă open‐souce sub licență Apache 2.0 pentru platformele: Windows, Mac OS X şi Linux. 

        Cea  mai  importantă  parte  a  GWT‐ului  poate  fi  considerat  compilatorul  responsabil  cu 
transformarea codului Java în cod JavaScript pentru a putea fi rulat in browser. Această inovație 
adusă  de  GWT  este  foarte  importantă,  însă  nu  este  singurul  lucru  care  face  ca  această  nouă 
tehnologie să fie deosebită.  

GWT  vine  şi  cu:  un  echipament  de  testare  folosit  pentru  depanarea  bytecodului  Java  în  mod 
direct atunci când este rulat în mediul oferit de GWT ce simulează browserul,  un set de widget‐
uri  principale  pentru  construirea  interfeței  cu  utilizatorul,  precum  şi  un  sistem  Remote 
Procedure  Call  pentru  realizarea  comunicației  cu  serverul  web.  Pe  scurt,  GWT  reuneşte 
avantajele  oferite  de  librăriile  JavaScript,  abilitățile  de  comunicare  ale  DWR  –ului,  precum  şi 
avantajele uneltelor Java din Echo2 sau XML11, într‐un singur pachet. 


    3. Arhitectura GWT 
        GWT continuă să folosească HTML şi CSS deoarece sunt relativ simple, încă eficiente şi 
suportate  în  mod  nativ  de  browsere.  O  aplicație  GWT  bine  realizată  se  va  baza  pe  patternul 
MVC, însă se va întoarce şi la modelul de programare client‐server. 

        Cu  GWT  se  va  folosi  MVC  pe  partea  de  client.  MVC  este  un  şablon  architectural  
proiectat  pentru  separarea  responsabilităților  în  cadrul  aplicațiilor  software.  Pentru  aplicațiile 
web,  MVC  presupune  o  defalcare  în  trei  straturi:  modelul  reprezentat  de  informațiile  de  pe 
partea de server, view‐ul oferit de către HTML şi controller‐ul reprezentat de o pagină sau un 
servlet de pe server, acestea având propriile responsabilități.  

În  mediul  GWT  (similar  cu  alte  aplicații  bazate  pe  AJAX),  toate  aceste  responsabilități  ale 
aplicației sunt mutate de pe server pe client.  
View‐ul generat de server prin tehnologii de genul JSP, este înlocuit cu componente pentru UI 
inteligente care leagă informațiile din cadrul lor de modelul aplicației.  

Modelul  este  sincronizat  cu  serverul  prin  intermediul  unor  tehnici  tradiționale  care  permit 
comunicarea dintre server şi client.  

Această modalitate de a folosi MVC pe client  oferă posibilitatea clientului de a coordona cele 
mai multe tranziții de stare din UI precum şi relaționarea logică a interfeței, fără a mai apela la 
serviciile serverului.  

Acest lucru presupune îmbunătățirea performanței şi a scalabilității chiar dacă lățimea de bandă 
sau latența rețelei prezintă probleme. Această îmbunătățire derivă din faptul că clientul poate 
să dirijeze mai multe responsabilități, fără a fi nevoit să comunice cu serverul pentru a modifica 
view‐ul  pentru  acelaşi  set  de  date.  Mai  mult,  se  pot  obține  infomații  ale  aplicației  sau 
sincronizări cu serverul printr‐o metodă elegantă, asincronă, care oferă la rândul ei avantaje.  

        O caracteristică a GWT‐ului este că trebuie să fie prezentă şi pe server o reprezentare a 
modelului,  iar  modelul  de  pe  client  trebuie  să  comunice  cu  serverul  pentru  a  obține  sau 
sincroniza informațiile; acesta comunicare este realizată prin intermediul mecanismului RPC şi a 
facilităților oferite de serializarea obiectelor.  

Pentru  a  face  posibilă  comunicarea  dintre  server  şi  client,  GWT  foloseşte  implementarea 
serviciul  SOA  (Service  Oriented  Arhitecture),  permițând  astfel  controller‐ului  de  pe  client  să 
invoce seviciile puse la dispoziție de către server şi să actualizeze modelul de pe client când este 
nevoie.  Reprezentările  modelului  de  pe  client  şi  server  pot  folosi  aceleaşi  obiecte,  sau  copii 
exacte ale acestora, GWT putând serializa şi deserializa automat datele din JavaScript în Java şi 
viceversa.  

Următoarea figură este o diagramă simplificată care descrie modalitatea de sincronizare între 
serverul şi clientul GWT, facilitată de mecanismul RPC oferit de GWT şi capabilitățile oferite de 
serializarea/deserializarea obiectelor. 
 

        

       Din 
       D mai  mu
               ulte  puncte  de  vedere GWT  rep
                                      e,       prezintă  o  reîntoarcere la  tradițio
                                                                       e            onala 
arhitectu
        ură cu trei st
                     traturi, unde
                                 e aplicația cl
                                              lient este res
                                                           sponsabilă c
                                                                      cu tratarea t
                                                                                  tuturor acțiu
                                                                                              unilor 
efectuate
        e de utilizator şi cu com
                                municarea cu
                                           u serverul ca
                                                       are oferă accesul asupra
                                                                              a datelor sto
                                                                                          ocate 
într‐un m
        mod persistent de genul RDBMS (Rel
                                         lational Data
                                                     abase Management Syst
                                                                         tem).  

Acest mo
       odel împreună cu avanta
                             ajul de a nu avea nevoie
                                                    e de altceva
                                                               a înafară de  browser instalat, 
duce  la  o îmbunătăț consider
          o         țire     rabilă  a  experienței  util
                                                        lizatorului  asupra  utiliză aplicațiilor  ce 
                                                                                   ării 
conțin se
        ervere web. 

 

       3.1  Structu
       3          ura unui p
                           proiect GW
                                    WT 
       Un 
       U proiect  GWT  are  o  st
                  G             tructură  sim
                                            milară  cu  stru
                                                           uctura  unui  pachet  Java Pachetul  GWT 
                                                                                    a. 
inițial,  ge
           enerat  atunci  când  con
                                   nstruim  un  p
                                                proiect  GWT nou,  difer
                                                           T           rențiază  în  m vizibil  unde 
                                                                                     mod 
trebuie  s se  afle  co
         să           odul  sursă  p
                                   pentru  partea  de  client față  de  co
                                                            t            odul  sursă  p
                                                                                      pentru  parte de 
                                                                                                  ea 
server şi față de resu
                     urse. 

Un proiect GWT arat
                  tă în felul urm
                                mător: 
Pachetul  principal  al  proiectului.  Acesta  conține 
com/example/app                                        toate  modulele  proiectului,  şi  nu  poate  conține 
                                                       fişiere cu cod. 
                                                       Subpachetul  care  conține  toate  fişierele  cu  codul 
com/example/app/client 
                                                       sursă pentru partea de client. 
                                                       Subpachetul  care  conține  toate  fişierele  cu  codul 
com/example/app/server 
                                                       sursă pentru server. 
                                                       Subpachetul  care  conține  toate  resursele  statice 
com/example/app/public 
                                                       de care este nevoie în aplicație. 

 

Fiecare proiect GWT poate fi alcătuit din unul sau mai multe module. Citând definiția dată de 
Google, un “modul GWT este pur şi simplu o încapsulare a funcționalității”. Modulul reuneşte 
toate  configurările  necesare  pentru  a  utiliza  codul  pe  care  îl  scriem  într‐un  proiect  GWT. 
Modulele  sunt  definite  în  aplicație  în  cadrul  fişierelor  descriptor  XML  a  căror  denumire  se 
termină  cu  extensia  .gwt.xml.  Conceptul  descriptorului  de  modul  din  GWT  este  similar 
descriptorilor din Tomcat sau alte servere de aplicații.   

Conținutul unui fişier descriptor XML este folosit pentru a specifica: 

        Modulele moştenite, cele din care aplicația  moşteneşte setări şi cod. 
        Numele unei clase ce reprezintă punctul de intrare în aplicație (opțional);  o clasă de tip 
        entry  point  este  o  clasă  ce  implementeză  interfața  EntryPoint.  Când  un  modul  este 
        încărcat, fiecare clasă entry point definită în fişierul .gwt.xml este instanțiată şi apelată 
        metoda  onModuleLoad()  din  cadrul  acesteia.  Este  posibil  să  creăm  un  modul  cu  mai 
        mult  de  o  clasă  entry  point,  şi  de  asemenea  este  posibil  să  creăm  un  modul  cu    nicio 
        clasă  de  tip  entry  point,  acest  tip  de  modul  fiind  folosit  ca  o  librărie  GWT  de  cod 
        reutilizabil. 
        Intrările Source Path, folosite pentru a specifica care subpachet conține codul sursă care 
        urmează a fi transformat în JavaScript. Subpachetul care conține codul pentru client este 
        inclus automat în source path. 
Intrările Public Path, folosite pentru a specifica care subpachete sunt publice (vizibile în 
        toată aplicația). Toate fişierele aflate in Public Path vor fi copiate în directorul de ieşire a 
        modulului în momentul când aplicația este compilată. 

         

        3.2 Interoperabilitatea cu Standardele Web şi Serviciile Web 
        GWT nu încearcă să fie doar un framework cu care se pot construi aplicații; el se vrea a fi 
un  set  de  unelte  care  îmbunătățeşte  vizibil    posibilitatea  de  a  crea  aplicații  Ajax.  Pentru  a 
îndeplini acesta este necesar să fie îmbinate standardele web actuale şi serviciile web. Astfel, 
GWT nu îndrumă spre o singură tehnologie, ci permite folosirea oricărei tehnologii. 

        În particular, GWT furnizează librăriile JSON şi XML care permit translatarea datelor în 
alte  tipuri  de  obiecte.  De  asemeni  GWT  oferă  o  modalitate  de  a  conecta  componentele  care 
alcătuiesc  interfața  cu  fişierul  CSS  pentru  a  putea  profita  de  beneficiile  aduse  de  această 
tehnologie. Pentru a obține efecte mai spectaculoase acest toolkit permite integrarea cu alte 
librării JavaScript existente prin intermediul JavaScript Native Interface (JSNI), o modalitate de 
a utiliza cod JavaScript în cadrul codului Java. 

 


    4. Instrumente GWT 
        GWT  oferă  un  set  amplu  de  unelte  necesare  pentru  rezolvarea  problemei  mutării 
aplicațiilor  tip  desktop  în  browser.  Toolbox‐ul  GWT  conține  un  parser  XML,  mai  multe 
instrumente  pentru  comunicarea  cu  serverul,  unelte  pentru  configurare  şi  internaționalizare 
precum şi un sistem de  management al istoriei paginilor vizualizate în browser.  

Următoarea  figură  constituie  o  hartă  vizuală  a aspectelor  centrale  ale GWT‐ului,  acestea  fiind 
împărțite  în  două  categorii:  cele  legate  de  compilator  şi  librăriile  Java  care  alcătuiesc  API‐uri 
GWT. 
 

        4.1 Compilatorul Jav
        4                  va­to­JavaS
                                     Script 
        Responsabilit
                    tatea compil
                               latorului GW
                                          WT este să co
                                                      onvertească codul Java î
                                                                             în cod JavaScript, 
într‐o  m                                atorul  care  transformă codul  Jav în  bytec
        maniera  asemănătoare  cu  compila                      ă          va        code. 
Compilar
       rea         pro
                     oiectului         se     face 
                                              f           de       către
                                                                       e       prog
                                                                                  gramul         Java 
com.go
     oogle.gwt       TCompiler căruia  i  se dă  ca  para
             t.dev.GWT       r             e            ametru  loca unde  se află 
                                                                   ația     e 
fişierul de definiție al modulului. 

Procesul  de compilare începe cu
                               u clasa entry
                                           y‐point, urm
                                                      mând apoi de
                                                                 ependințele  necesare pe
                                                                                        entru 
a  compila  codul  Java Compilato GWT  lu
                      a.        orul    ucrează  diferit  față  de  u compilator  standard  Java 
                                                                    un 
deoarece acesta  nu  compilează tot  ce  se  gaseşte  în  modul,  ci  n
       e                      ă                                       numai  ceea ce  este  fo
                                                                                a            olosit. 
Acesta  lucru  este  avantajos  deoarece  pe
                     a                     ermite  să  se poată  de
                                                        e                       brarie  amplă  de 
                                                                  ezvolta  o  lib
      ente  şi  tool‐uri,  iar  com
compone                           mpilatorul  v include  n
                                              va         numai  acele clase  şi  m
                                                                    e            metode  care  sunt 
folosite d
         de clasa entr
                     ry‐point. 

Compilat
       torul are trei tipuri de st
                                 tiluri care de
                                              etermina cum
                                                         m va arăta c
                                                                    codul Java Sc
                                                                                cript rezultat
                                                                                             t: 

                      plicit  este  cel  obfusca   şi  face  ca  codul  JavaScript  să  arate  ca  o 
            stilul  imp                        ate 
            amesteca            re ceea ce îl face a fi imp
                   atură de liter                         posibil de de            pul acestui stil nu 
                                                                      escifrat. Scop
este de a face imposibil de citit codul ci pentru a menține fişierul JavaScript cât mai 
            mic posibil.  
            Un exemplu de cod care are acest stil arată în felul următor: 

                              function b(){return this.c + '@' + this.d();}
 

            stilul pretty,  generează cod JavaScript care poate fi citit cu uşurința.  
        Pentru exemplificare vom folosi acelaşi cod ca la stilul anterior. De acesta dată ne putem 
        da seama că este metoda toString(), însă încă nu putem şti din care clasă este această 
        metoda: 

                        function _toString(){

                        return this._typeName + '@' + this._hashCode();

                        }
         
         
            stilul  detailed,  care  seamănă  cu  stilul  pretty,  cu  completarea  că,  vom  avea  numele 
            complet al clasei din care face parte metoda, ca parte a numelui metodei JavaScript 

                 function java_lang_Object_toString__(){

                 return this.java_lang_Object_typeName + '@' +this.hashCode__();

                 }
         

Stilurile  pretty  şi  detailed  sunt  folosite  îndeosebi  în  procesul  de  dezvoltare  pentru  a  putea 
detecta cu uşurința eventualele erori JavaScript apărute în browser. 

        Un alt aspect important al compilatorului GWT este că acesta foloseşte codul sursă Java, 
nu  codul  Java  binar.  Acesta  presupune  că,  codul  sursă  pentru  toate  clasele  Java  să  fie 
disponibile. Acest lucru este important şi atunci când vrem să distribuim cod GWT pentru a fi 
refolosit. Când se construiesc fişiere .jar, care urmează a fi distribuite, trebuie să fie incluse atât 
clasele Java cât şi fişierele cu cod sursă. 

        O  ultimă  caracteristică  notabilă  este  aceea  că  după  compilarea  codului  Java  în 
JavaScript, rezultă un singur fişier JavaScript pentru fiecare tip de browser. Browser‐ele pentru 
care  se  generează  fişiere  JavaScript  sunt:  Internet  Explorer,  Firefox,  Mozillla,  Opera  şi  Safari. 
Când  este  rulat  scriptul  de  pornire  pentru  browser  (bootstrap),  acesta  încarcă  fişierul 
corespunzător pentru browserul respectiv. Avantajul este că nu se va mai încarca cod pe care 
browserul nu va putea să îl folosească. 

 

        4.2 JSNI (JavaScript Native Interface) 
        Cu toate că codul GWT trebuie scris in Java, uneori pot apărea situații cand trebuie să 
facem apeluri directe la cod JavaScript. O astfel de situație este atunci când trebuie să facem 
apel la API‐ul browser‐ului pentru care nu există echivalent în GWT. O altă situație poate apărea 
atunci când vrem să utilizăm în aplicația noastră anumite librării  JavaScript mai deosebite. 

        Accesând JavaScript direct, aplicația este expusă incompatibilităților dintre browsere. Va 
fi  nevoie  de  teste  extra  pentru  a  avea  siguranța  că,  codul  JSNI  va  funcționa  pe  mai  multe 
browsere. 

        JSNI permite execuția codului JavaScript din codul Java, precum şi viceversa. Acest lucru 
este  făcut  posibil  de  către  compilatorul  GWT  care  poate  îmbina  cod  nativ  JavaScript  cu  cod 
JavaScript generat dupa compilarea codului Java.  

Pentru  a  scrie  o  metodă  pură  JavaScript  prin  intermediul  JSNI  trebuie  doar  să  declarăm  acea 
metodă ca native şi să furnizăm implementarea în JavaScript între comentarii: 

                                public native void fillData (String msg)
                                /*-{
                                $wnd.alert(msg);
                                }-*/; 
 
        De  asemenea,  GWT  oferă  şi  o  modalitate  pentru  a  apela  cod  Java  în  cadrul  codului 
JavaScript.  Signatura  unei  astfel  de  metode  este  următoarea:  [instance-expr.]@class-
name::method-name(param-signature)(arguments), unde [instance-expr.] specifică 

faptul că este vorba de o metodă ne‐statică. 

 

        4.3 Widget­uri  şi  Panel Library 
        GWT vine cu o gamă largă de  widget‐uri şi panel‐uri care pot fi folosite în codul Java al 
aplicațiilor  Ajax.  Acestea  sunt  construite  cu  HTML,  iar  JavaScript  este  folosit  pentru  tratarea 
evenimentelor; atunci când codul aplicației este compilat şi transformat în JavaScript, browserul 
încarcă aceste componente în cadrul unei pagini web tradiționale, fără a fi nevoie de plugin‐uri 
sau  JRE. 

 Există trei categorii de componente pentru crearea interfeței cu utilizatorul: widget‐uri, panel‐
uri pentru aşezare şi panel‐uri interactive.  

        Lucrul  cu  aceste  componente  este  asemănator  cu  cel  din  Swing  şi  AWT  (Abstract 
Window  Toolkit),  cu  diferența  că  GWT  oferă  în  loc  de  layout‐manageri,  un  set  de  panel‐uri 
care  afişează  elementele  componente  într‐o  maniera  anume.  De  exemplu,  HorizontalPanel 
afişează  elementele  de  la  stânga  la  dreapta,  FlowPanel  afişează  folosind  regulile  de  la  fluxul 
HTML, iar AbsolutePanel foloseşte poziția exactă a componentelor pe care le conține.  

Pentru  a  crea  o  interfață  cu  utilizatorul,  trebuie  să  instanțiem  aceste  widget‐uri,  apoi  să  le 
adăugăm  panel‐urilor,  care  la  rândul  lor  trebuiesc  adaugate  panelului  principal  al  aplicației 
(Root  Panel).  Panelul  principal  este  un  container  de  nivel  înalt,  care  conține  toate 
componentele unei interfețe. 

        GWT‐ul vine cu componente care sunt deseori intâlnite la aplicațiile desktop şi mai rar la 
cele  web.  Un  astfel  de  exemplu  este  TabPanel  care  permite  plasarea  widget‐urilor  în  taburi 
diferite, fiind vizibile la un moment dat doar widget‐urile de pe un singur tab.  
Alte exemple de acest fel de componente sunt: MenuBar, care oferă o cale usoară de a crea un 
meniu cu mai multe nivele, PopupPanel, StackPanel etc.  

Trebuie să observăm, însă, că widget‐urile din GWT nu intenționează să semene perfect cu cele 
dintr‐o aplicație pentru desktop; astfel, ele se integrează bine cu browserul şi oferă o experiență 
familială utilizatorului. De asemenea, aplicația creată cu GWT poate fi integrată cu oricare parte 
a unei pagini HTML, însă permițându‐i să arate ca o pagină web obişnuită.   

        Există    peste     30    de     widget‐uri     şi    panel‐uri    conținute     în    pachetul 
com.google.gwt.user.client.ui din GWT, însă e puțin probabil ca acestea să satisfacă toate 
nevoile  dezvoltatorilor.  Lista  widget‐urilor  din  GWT  cuprinde  calendare,  tabele  sortabile, 
calculatoare,  panel‐uri  pentru  desenare,  panel‐uri  cu  rol  de  tooltip  etc.  Există,  de  asemeni, 
widget‐uri  care  includ  librării  JavaScript,  cum  sunt  Google  Maps  API,  Google  Search  API,  sau 
efecte obținute cu Scriptaculous. Înafara widget‐urilor de bază pentru HTML, există şi widget‐
uri disponibile pentru Scalar Vector Graphics (SVG).  

        Există şi posibilitatea să ne creem propriile noastre widget‐uri extinzându‐le pe cele din 
GWT, însă este recomandat ca atunci când recurgem la această posibilitate să accesăm obiecte 
JavaScript care se află la baza browser‐elor. 

 

        4.4 Protocolul Remote Procedure Call (RPC) 
        Din punctul de vedere al locului unde este rulat codul, aplicațiile Ajax în general şi cele 
GWT  în  particular  se  încadrează  în  categoria  Rich  Internet  Applications(RIA).  Acest  tip  de 
aplicații  sunt  o  combinație  între  Fat  client  applications,  unde  codul  rulează  doar  pe  maşina 
utilizatorului (ex. Microsoft Word), şi Thin client applications unde codul rulează pe o maşină 
server, iar desktopul clientului este folosit doar pentru afişarea interfeței prin intermediul unui 
browser (aici se încadrează majoritatea aplicațiilor web: Ebay, Amazon etc).   

Faptul  că  se  încadrează  în  ambele  categorii  oferă  GWT‐ului  complexitate  şi  interactivitate, 
deoarece poate profita de anumite puteri de procesare pe partea de client.  
        De  fiecare  dată  când  avem  cod  care  rulează  în  doua  părți  diferite, avem  nevoie  de  un 
mecanism pentru a comunica între cele două. Cea mai simplă modalitate în această situație o 
reprezintă apelul procedurilor la distanță (Remote Procedure Call), care presupune o cale prin 
care clientul să execute codul pe server şi să primească rezultatul execuției; în acestă situație 
poate fi folosit oricare dintre următoarele protocoalele RPC: RMI, .NET Remoting, SOAP, REST 
sau  XML‐RPC.  Însă  GWT  nu  foloseşte  nici  unul  dintre  acestea,  având  implementat  propriul 
protocol de tip RPC, aceasta pentru a putea realiza apelurile asincrone de la browser. 

        În GWT librăria RPC este divizată în două pachete:  

            pachetul com.google.gwt.user.client.rpc folosit pe partea de client şi  
            pachetul com.google.gwt.user.server.rpc folosit pe partea de server.  

Partea  pentru  client  oferă  interfețele  necesare  pentru    interconectarea  interfețelor  aplicației 
care vor fi folosite pentru implementarea RPC‐ului. Când este transformat codul de pe client în 
cod  JavaScript  de  către  compilatorul  GWT,  codul  folosit  pentru  RPC  este  generat  pe  baza 
interfețelor interconectate.  

Pachetul  pentru  partea  de  server  folosit  pentru  implementarea  RPC‐ului  este  construit  astfel 
încât să fie folosit într‐un container de servleturi Java cum este Tomcat sau Jetty. Din fericire, 
browser‐ul  host  oferit  de  GWT  conține  un  server  Tomcat  integrat,  şi  astfel  pot  fi  testate  şi 
depanate apelurile RPC de pe server în orice IDE care oferă suport pentru GWT. 

        S‐a mers pe ideea ca protocolul trebuie să fie simplu. Browser‐ul descarcă tot codul de 
la client când acesta porneşte aplicația , iar dacă codul depăşeşte 100K atunci se va observa o 
pauză.  De  astfel,  codul  JavaScript  care  rulează  în  browser  este  destul  de  lent,  aşa  încât 
implementarea  unui  protocol  complex  precum  SOAP  ar  presupune  descărcarea  unei  cantități 
mari de cod care ar incetini considerabil execuția. Astfel, când  mecanismul oferit de RPC este 
folosit  în  mod  corespunzător,  oferă  avantajul  de  a  muta  tot  codul  pentru  logica  UI  pe  client, 
obținând astfel vizibile creşteri de performanță, reducerea încărcării serverului web, precum şi 
o experiență plăcută pentru utilizator. Prin acest mecanism, codul de pe partea de server este 
invocat ş
        şi referit de  către client  precum un  serviciu, îns
                                  t                         să în acest c
                                                                        context, term
                                                                                    menul de ser
                                                                                               rviciu 
(service) nu are acela
                     aşi înțeles cu
                                  u conceptul general de “
                                                         “serviciu web
                                                                     b”. 




                                                                                                          

       Fi
        igura  anteri
                    ioară  reprez
                                zintă  o  descriere  vizua a  ceea  c înseamnă    crearea  unui 
                                                         ală        ce 
serviciu c
         cu mecanism
                   mul pus la dis
                                spoziție de G
                                            GWT‐RPC.  

Fiecare s
        serviciu dețin
                     ne un set de
                                e interfețe şi clase ajutătoare. Unele
                                                                     e dintre aceste clase, cu
                                                                                             um ar 
fi serviciu
          u proxy, est
                     te generat a
                                automat în s
                                           spate fără ca
                                                       a programat
                                                                 torul să ştie de existenț
                                                                                         ța sa. 
Primul pa
        as pentru crearea unui a
                               apel RPC est
                                          te să definim
                                                      m un templat
                                                                 te care să de
                                                                             escrie apelul. Din 
păcate ac
        cest lucru tr
                    rebuie făcut de trei ori: o
                                              o dată pe pa
                                                         artea de serv
                                                                     ver, o data p
                                                                                 pe client şi o dată 
în interfa
         ața care este
                     e partajată d            client. GWT foloseşte o convenție de nume pen
                                 de server şi c                                           ntru a 
le conect
        ta pe toate. 

Problema care  poat să  apară  este  serializ
       a          te                        zarea  obiect
                                                        telor  care  sunt  trimise/
                                                                                  /recepționat În 
                                                                                             te. 
mod  ide
       entic  cu  RM şi  .NET  R
                   MI          Remoting,  G
                                          GWT‐RPC  nu este  limita doar  la  primitive  pe
                                                    u            at                      entru 
serializare.  Orice  tip  de  dată  care  este  serializabil  poate  fi  trimis/returnat  ca  parametrul  în 
apelul la distanță. 

 Trebuie  să  se  țină  seama  că  ideea  de  tip  “GWT  serializabil”  diferă  de  ideea  de  tip  “Java 
serializabil”. Un tip este “GWT serializabil” dacă: 

             este primitivă, precum: char, byte, short, int, long, boolean, float sau double; 
             este primitivă de tip wrapper(Character, Byte, etc); 
             este String sau Date; 
             este un vector de tipuri serializabile (incluzând vectori de vectori); 
             este un tip declarat de utilizator, a cărui clasă are toate câmpurile serializabile; 
             implementează interfața IsSerializable. 

Colecțiile precum Set, List, Map şi HashMap sunt problematice; trebuie să folosim o adnotare 
specială  în  JavaDoc  pentru  a‐i  spune  compilatorului  GWT  ce  tip  de  obiecte  vor  fi  incluse  în 
colecție. 

 

        4.5 Managementul butonului “Back” al browser­ului / Browser History 
        Una dintre cele mai acute probleme ale aplicațiilor Ajax este acțiunea care se execută la 
apăsarea butonului “Back” al browser‐ului. Aceasta presupune că dacă înlocuim dinamic o parte 
a conținutului paginii web cu JavaScript, browser‐ul nu îşi poate da seama că s‐a schimbat ceva 
în conținutul paginii.  

Ceea ce se întâmplă cel mai adesea este că utilizatorul observă faptul că pagina s‐a schimbat, şi 
îşi  imaginează  că  dacă acționează butonul  “Back”  se  va întoarce  la  vechiul  conținut  al  paginii, 
însă  această  presupunere  este  falsă.  Pentru  a  putea  ajuta  utilizatorii,  dezvoltatorii  trebuie  să 
găsească o modalitate de a rezolva problema într‐un mod cât mai transparent pentru utilizator. 

Soluția  cea  mai  populară  pentru  această  problemă  tinde  să  fie  destul  de  complicată  de 
implementat şi folosit. Ea presupune adăugarea unui frame ascuns şi a unui număr de scripturi 
pentru  a  obține  funcționarea  corectă.  Folosind  GWT  programatorul  nu  trebuie  să  facă  el 
această  muncă,  totul  fiind  rezolvat  de  framework,  dezvoltatorul  trebuie  doar  să  creeze  un 
obiect  history  token  căruia  să  îi  asocieze  un  listener  care  implementează  interfața 
HistoryListen şi să‐l înregistreze ca un obiect de tip History. 

Acest  history  token  este  un  string  în  care  se  memorează  orice  stare  a  aplicației  cum  ar  fi 
numele  tabului  curent  dintr‐o  pagină  care  conține  mai  multe  taburi.  Google  nu  precizează 
dimensiunea  maximă  a  acestui  token,  însă  este  recomandat  să  nu  se  depăşească  100  de 
caractere.  

Tokenul curent este modificat atunci când utilizatorul face click pe un obiect Hyperlink sau când 
acționeză butoanele Back sau Forward din browser, sau poate fi modificat în mod programatic 
apelând History.newItem(), History.back() sau History.forward(). 

Cu  ajutorul  listener‐ului  înregistrat,  putem  depista  schimbările  apărute  în  tokenul  înregistrat. 
Pentru utilizator, token‐ul va apărea afişat în bara de adrese a browser‐ului ca parte a URL‐ului, 
sub forma: http://www.gwtpowered.org/#Xyzzy.  

Intern,  managementul  paginilor  accesate  este  înregistrat  în  fişierul  html  al  aplicației  printr‐un 
tag  special  numit  <iframe>.  Când  se  crează  acest  token  se  crează  un  frame  ascuns 
programatorului  care  va    fi  încărcat  cu  o  nouă  pagină.  Deoarece  frame‐ul  este  încărcat  cu  o 
nouă pagină, browser‐ul o va considera o pagină diferită şi o va adăuga la history. Astfel, prin 
faptul  că  modificarea  conținutului  frame‐ului  ascuns  este  semnalată  de  metoda 
onHistoryChange()  din  HistoryListener,  toate  stările  prin  care  trece  aplicația  sunt  salvate, 
fiind posibil astfel ca atunci când utilizatorul face click pe butonul “Back” al browser‐ului să  fie 
încărcată vechea pagină, producându‐se comportamentul aşteptat de utilizator. La fel se petrec 
lucrurile şi pentru butonul “Forward”. 

 

        4.6 Integrarea JUnit cu  GWT 
        Deoarece JUnit  este instrumentul de testare cel mai popular, fiind integrat şi în cadrul 
unor IDE‐uri, GWT oferă suport pentru folosirea acestuia pentru a permite testarea codului Ajax 
cu aceiaşi uşurință cu care este facută testarea codului Java. 
       Pentru a crea un test, trebuie sa creem o clasă pe care să o extindem din GWTTestCase, 
care  extinde  la  rândul  ei  clasa  TestCase,  apoi  să  implementăm  o  anumită  metodă, 
getModuleName(), urmată de un număr de teste efective. Numele modulului este folosit de 
GWT pentru a localiza fişierul de configurare. 

            public class MathTest extends GWTTestCase
                           {
                                    public String getModuleName ()
                                    {
                                            return
                                    "org.mycompany.MyApplication";
                                    }
                                    public void testAbsoluteValue ()
                                    {
                                            int absVal = Math.abs(-5);
                                            assertEquals(5, absVal);
                                    }
                            }    
        

       Înafară  de  testele  obişnuite,  GWT  permite  şi  testarea  apelurile  RPC  către  server.  În 
această situație GWT va porni propria versiune de Tomcat, va executa codul GWT compilat, şi 
va testa dacă codul apelat de client va primi rezultatul aşteptat de la server. 

 


    5. Modul Host vs Modul Web 
       Pe lângă suportul pentru JUnit sau compilatorul Java‐To‐JavaScript, Google Web Toolkit 
oferă şi alte instrumente care să uşureze munca programatorilor web, şi anume un shell pentru 
dezvoltarea şi testarea aplicațiilor, GWTShell , precum şi un browser web propriu numit Hosted 
Mode Browser.  
        GWTShell est
        G          te o aplicație
                                e de tipul “Eclipse Rich C
                                                         Client application”  sub f
                                                                                  formă de consolă 
grafică  c
         care  atunci  când  este  la
                                    ansată  invocă  resursele din  proiec
                                                            e           ctul  GWT,  afişează  mes
                                                                                                sajele 
informaționale şi lansează brows
                               ser‐ul care p
                                           permite afişa
                                                       area paginii î
                                                                    în modul host. 

        Hosted  Mode  Browser    permite  testarea  codu Java  în  timpul  dezv
        H                                              ului                   voltării  aplic
                                                                                            cației, 
într‐un  m
         mediu  de  dezvoltare  hibrid  asemă
                                            ănător  cu  ce al  browser‐ului,  însă înainte  de a  fi 
                                                         el                      ă           e 
transform
        mat în cod JavaScript. A
                               Aceasta însea
                                           amnă că JRE
                                                     E‐ul este cel  care execut
                                                                              tă componentele 
Ajax  ale  aplicației,  permițând  d
                        p          depanarea  c
                                              claselor  dire din  IDE‐le  în  care  s lucreză.  A
                                                           ect                      se          Acest 
browser  caracterist
                   tic  GWT‐ul
                             lui  este  o compone
                                        o       entă  bazată pe  SWT şi  simulează 
                                                           ă       T 
comportamentul bro
                 owserul implicit de pe fi                     emeni, este  de un real a
                                         iecare patformă. De ase                       ajutor 
        dezvoltarea  aplicației  şi  obținerea  de  feedback  prin  inte
pentru  d                                                                          apelurilor  de  tip 
                                                                       erpretarea  a
callback  către codul  Java al aplic
                                   cației ce rule
                                                ează pe platforma de de
                                                                      ezvoltare. Următoarea f
                                                                                            figură 
înfățişeaz shell‐ul  GWT    precum şi  browse
         ză          G           m          er‐ul    host  în timpul  rul
                                                            n           lării  aplicație “Kitchen  Sink” 
                                                                                       ei 
oferită ca
         a exemplu de GWT. 




                                                                                                
        Browser‐ul host din figură  are două conexiuni cu shell‐ul de dezvoltare din spate: una 
dintre ele este o conexiune HTTP obişnuită pentru a încărca paginile web, fişierele .css, imagini, 
servleturi  folosite  pentru  apelul  serviciilor  de  la  server  şi  alte  resurse.  Toate  aceste  sunt 
administrate  de  către  serverul  Apache  Tomcat  inclus  în  GWT  folosind  un  servlet  numit 
com.google.gwt.dev.shell.GWTShellServlet. În  cazul  când  pe  server  sunt  integrate  alte 

componente,  trebuie  configurată  corespunzător  această  variantă  de  Tomcat  internă,  sau 
trebuie folosită o versiune externă. 

        Cea  de‐a    doua  conexiune  este  un  fel  de  “uşă  din  spate”  care  interceptează  toate 
interacțiunile  care  apar  în  browser‐ul  host  şi  le  redirecționează  către  codul  java  din  shell  (nu 
către codul JavaScript). Acest cod Java apelează codul de la client care a fost compilat anterior 
de  către  IDE.  Detaliile  cum  se  executa  aceste  acțiuni  sunt  ascunse  in  codul  shell‐ului  care  nu 
este open‐source. 

        Atunci  când  se  acționează  butonul  Compile/Browse  din  browser‐ul  host,  compilatorul 
GWT  translatează  codul  din  pachetul  .client  în  cod  JavaScript  pe  care  îl  deschide  într‐un 
browser  web  normal  pentru  a  putea  vizualiza  aplicația.  La  acest  punct  paginile  sunt  încă 
furnizate  de  instanța  Tomcat‐ului  inclus  în  shell,  dar  la  fel  de  bine  pot  fi  furnizate  din  fişiere 
sistem sau un server web obişnuit. O altă modalitate de a invoca compilatorul GWT este prin 
intermediul scriptului  aflat  la  baza aplicației  (MyApp-compile).  De  asemeni  se  poate  scrie  un 
script care sa fie rulat cu Ant.  

        De  fiecare  dată  cand  este  invocat,  compilatorul  GWT  combină  codul  nostru  cu  o 
versiune JavaScript a API‐ului GWT (echivalentul pentru gwt-user.jar) într‐un fişier JavaScript. 
Acest  cod  împreună  cu  alte  fişiere  auxiliare  sunt  plasate  în  diectorul  www  al  proiectului.  De 
asemeni, tot ce se găseşte în directorul public al proiectului va fi copiat. 
Figura de
        e mai sus pre
                    ezintă paşii p
                                 pentru încăr
                                            rcarea unei p
                                                        pagini în mo
                                                                   odul host: 


   1. programul sh
                 hell deschide
                             e o fereastră care conțin
                                                     ne un browse
                                                                er de tip hos
                                                                            st, în care încarcă 
       pagina  MyAp
                  pp.html; 
   2. M
      MyApp.html încarcă gwt.
                            .js printr‐un tag <script>
                                                     >; 
   3. gw
       wt.js  scanează  MyApp
                            p.html  pentru  a  extrag numele  modului  din  tagul:  <meta 
                                                    ge 
       name=’gwtm
                module’>; 
   4. G
      GWT  citeşte  fişierul  modul  M
                                     MyApp.gwt.x
                                               xml  pentru a  găsi  numele  c
                                                         u                  clasei 
       EntryPoint(M
                  MyApp); 
   5. cl
       lasa  MyApp  este  instan
                               nțiată  şi  este apelată  m
                                              e          metoda  onMo
                                                                    oduleLoad.  De  aici  porn
                                                                                             neşte 
       aplicația; 
   6. co
       odul aplicați
                   iei apelează librăria din G
                                             GWT (gwt‐user.jar); 
       odul din gwt‐user.jar manipulează  DOM‐ul bro
   7. co                                           owser‐ului pe
                                                               entru a adău
                                                                          uga compon
                                                                                   nente 
       UI pe pagina web şi pentru a redirect
       U                                   ta toate evenimentele d
                                                                 din browser c
                                                                             către aplicaț
                                                                                         ție. 
Urmă
       ătoarea figur
                   ră prezintă f
                               fluxul execuț
                                           țiilor pentru
                                                       u a încărca o
                                                                   o pagină în m
                                                                               modul  web: 




    1. browser‐ul w
                  web încarcă M
                              MyApp.html; 
    2. M
       MyApp.html încarcă gwt.
                             .js folosind t
                                          tag‐ul <scrip>
                                                       >; 
    3. gw
        wt.js  parcu
                   urge  MyAp
                            pp.html  pe
                                      entru  a  a
                                                afla  numele modulului  din:  <meta 
                                                           e 
       name=’gwtm
                module’>; 
    4. gw
        wt.js modifică pagina pentru a include un <ifra
                                                      ame> care c
                                                                cauzează încărcarea fişie
                                                                                        erului 
       module‐name
       m         e.nochache.
                           .html; 
    5. co
        odul  JavaScript  din  fişie
                                   erul  module
                                              e‐name.noca
                                                        ache.html  d
                                                                   determină  tipul  browser‐ului 
       apoi selectează fişierul co
                                 orect pentru
                                            u acel browser; 
    6. este  executa codul    JavaScript  ehivalent  m
                   at                                metodei  on
                                                               nModuleLoad
                                                                         d(),  lansând
                                                                                     du‐se 
       aplicația.  Manipularea  D
                                DOM‐ului  din browser  e
                                            n          este  făcută  prin  apeluri  HTML  dina
                                                                                             amice  
       din codul Java
                    aScript compilat. 
 

 

 
6. Utilitatea GWT 
        Premisa care a stat la baza GWT‐ului a fost simplă: dezvoltarea de aplicații Ajax într‐un 
mod mult mai simplu, şi anume scutindu‐i pe programatori de incompabilitatea dintre browser‐
e  şi  permițând  dezvoltatorului  să  lucreze  într‐un  mediu  de  dezvoltare  Java  familiar  (fără  a  fi 
nevoie de cunoştințe solide de JavaScript si DHTML). 

        După  cum  aminteam  mai  sus,  GWT  este  primul  framework  pentru  crearea  de  aplicații 
web  folosind  limbajul  Java  care  permite  realizarea  de  aplicații  asemănătoare  cu  cele  pentru 
desktop, dar care sunt rulate în browser. 

        Google  Web  Toolkit    unifică  codul  pentru  client  şi  server  într‐o  singură  aplicație  scrisă 
într‐un singur limbaj: Java. Acest lucru are numeroase avantaje. Unul dintre acestea ar fi că mai 
mulți dezvoltatori folosesc Java față de JavaScript sau Flash. Un alt motiv ar fi acela că pentru 
Java  există numeroase medii  de  dezvoltare:  Eclipse,  NetBeans,  IntelliJ IDEA  etc.  GWT  permite 
crearea unei aplicații web într‐un mod asemănător cu crearea unei aplicații Swing – crearea de 
componente vizuale, setarea event‐handler‐ilor, depanare etc – toate aceste în IDE‐ul preferat. 
Prin folosirea aceluiaşi limbaj se poate folosi acelaşi cod atât pentru server cât şi pentru client. 
De exemplu, se poate rula acelaşi cod de validare odată pe partea de client pentru feed‐back 
imediat, precum şi pe partea de server pentru securitate maximă. De asemeni, se poate muta 
cod între “straturile” aplicației în momentul când rearanjăm structura aplicației. 

        Nevoia  de  a  scrie  cod  in  Java,  şi  nu  în  JavaScript,  este  fundamentală  pentru  aplicațiile 
Web  complexe,  deoarece  se  reduce  dimensiunea  aplicației,  aceasta  devenind  mai  uşor  de 
administrat. Însă, GWT permite integrarea codului JavaScript în aplicație, precum şi integrarea 
unor servicii pentru partea de server. 

        GWT este construit deasupra tehnologiilor web, conferindu‐i astfel o mai mare putere. 
Această putere provine din faptul că aplicațiile GWT pot rula pe orice tip de browser şi pe mai 
multe sisteme de operare, precum şi din faptul că acest gen de aplicații pot fi rulate cu uşurință 
pe  mai  multe  calculatoare.  Totuşi,  dezvoltatorii  de  aplicații  care  folosesc  acest  toolkit,  nu 
trebuie  să  folosească  direct  tehnologiile  web,  GWT  “ascunzând”  aceste  tehnologii  din  fața 
programatorului  prin  folosirea  unei  abstracții  de  genul  unui  framework  ce  foloseşte  limbajul 
Java. 

 


    7. Comparaţie cu alte framework­uri 
         Google Web Toolkit nu este primul set de unelte care încearcă să uşureze modalitate de 
construcție a aplicațiilor de tip RIA, şi după ritmul de evoluție al tehnologiilor web, este evident 
că  nu  va  fi  nici  ultimul.  În  cele  ce  urmează,  se  vor  prezenta  diferențele  dintre  GWT  şi  alte 
framework‐uri    din  aceeaşi  categorie,  avându‐se  în  vedere că  fiecare  astfel  de  framework  are 
puncte  tari  şi  slabe.  (Diferența  principală  între  GWT  şi  celelate  framework‐uri  existente  este 
aceea că folosind GWT, codul pentru partea de browser este scris in Java, nu in JavaScript.) 

 

         7.1 GWT vs SWING 
         Swing  este  toolkit‐ul  standart  pentru  construcția  aplicațiilor  GUI  în  limbajul  Java.  La  o 
primă  vedere  s‐ar  putea  afirma  că  nu  este  o  idee  bună  comparația  dintre  acestea  două 
deoarece  Swing‐ul  nu  este  asociat  aplicațiilor  web,  însă  analizând  mai  de  aproape  cele  două 
framework‐uri, se observă că se aseamănă datorită modalității similare, sau chiar identice, de 
scriere a codului. Ceea ce diferă sunt cateva denumiri, cum ar fi numele interfeței ClickListener 
din GWT, care are ca echivalentă în Swing, interfața ActionListener. 

         Pentru programatorii Swing, sunt câteva diferențe importante între GWT şi Swing. 

 Prima  ar  fi  aceea  că,  componentele  echivalente  cu  cele  din  GWT  nu  respectă  şablonul  de 
proiectare MVC. Aceasta înseamnă că nu există un obiect model care să poate fi partiționat de 
mai multe componente şi astfel, ele să fie ținute în sincronicitate. 

 A  doua  diferență  notabilă  este  aceea  că  GWT  nu  foloseşte  managerii  de  afişare  (layout 
managers)  pentru organizarea componentelor în interfață. În schimb, GWT foloseşte panel‐uri, 
care sunt construite într‐o manieră asemănătoare cu managerii de afişare.  
        Aceste  diferențe  minore  fac  din  GWT  un  mediu  de  dezvoltare  destul  de  familiar 
dezvoltatorilor de aplicații Swing. 

 

        7.2 GWT vs. Echo2 
        Echo2  este  un  alt  toolkit  popular  în  rândul  dezvoltatorilor  de  aplicații  web  ce  folosesc 
limbajul  Java.  Acesta  se  aseamănă  cu  GWT  datorită  modalității  asemănătoare  de  a  construi 
interfața  cu  utilizatorul.  Echo2  foloseşte  clasele  din  API  pentru  crearea  de  instanțe  a 
componentelor, apoi le adaugă view‐ului. 

        Deşi  cele  două  framework‐uri  folosesc  API‐uri  similare,  ele  lucrează  în  maniere  total 
diferite.  

Aplicațiile Echo2 rulează pe server, față de aplicațiile GWT care rulează pe client.  

Cu  GWT  codul  sursă  Java  este  compilat  şi  transformat  în  JavaScript  pentru  a  putea  fi  rulat  în 
browser, pe când cu Echo2 codul sursă Java este compilat în clase Java apoi este rulat pe server, 
această obligând programatorul să trateze pe server eventualele evenimente apărute pe client. 
Aceasta duce la consecința de a se face mai multe apeluri la server în Echo2, însă nu este nevoie 
de a fi implementat un mecanism de tip RPC, deoarece totul se petrece pe server.  

O alta consecintă a modului de funcționare a Echo2, este aceea că nu este nevoie să fie trimis  
browser‐ului  tot  codul  JavaScript  rezultat  în  urma  compilării,  ci  doar  ceea  ce  este  nevoie 
pentru stadiul curent al aplicației.  

 

        7.3 GWT vs JSF 
        Java  Server  Faces  (JSF)  este  un  framework  pentru  crearea  aplicațiilor  web  bazate  pe 
limbajul  Java  în  cadrul căruia  se  folosesc  bean‐uri  pe  server  pentru  reprezentarea  modelului, 
plus un set de librării de taguri folosite  în paginile JSP pentru a referi proprietățile modelului. 
În implementarea JSF standard, toate procesările sunt făcute de către server, iar paginile web 
sunt reîncărcate după fiecare tranzacție, ceea ce nu face ca JSF să fie viabil pentru construirea 
componentelor pentru aplicații RIA, însă cu puțin efort este posibil. 

        Primul pas pentru crearea unei aplicații folosind JSF este să creem clasa care reprezintă 
modelul, apoi să înregistrăm în fişierul de configurare acea clasă ca fiind de tip managed‐bean. 
Următorul pas este să construim pagina JSP care va reprezenta view‐ul aplicației. 

        JSF diferă foarte mult de GWT prin faptul că JSF oferă puține avantaje pentru crearea 
suportului  pentru  funcționalitatea  pe  partea  de  client  a  unei  aplicații  RIA;  este  posibilă 
construcția de componente reutilizabile pentru partea de client apelându‐se la JavaScript, însă 
componentele custom au puține şanse de a fi reutilizate. Datorită faptului că JSF integrează şi 
partea client, poate fi considerată o tehnologie în competiție cu GWT, însă există şanse ca cele 
două să fie integrate. 

 

        7.4 GWT vs Ruby on Rails 
        Acest  titlu  poate  să  ducă  în  eroare  deoarece  GWT  şi  Ruby  on  Rails  (RoR)  nu  se  află  în 
competiție cu toate că la unele aspecte se pot suprapune.  

Ruby on Rails este un framework care foloseşte limbajul Ruby pentru a implementa partea de 
server  a  aplicației,  fiind  special  creat  pentru  a  executa  automat  o  mare  parte  din  munca  din 
spate. Pe partea de server,  RoR oferă suport pentru Ajax, permițând să fie folosit în codul HTML 
echivalentul  Java  pentru  o  librarie  de  taguri.  Rezultatul  final  este  acela  că  RoR  poate  trimite 
informații către server când este declanşată o acțiune a utilizatorului, iar răspunsul este afişat în 
pagină. RoR nu este creat pentru tratarea interacțiunilor complexe dintre server şi client. 

        Analizând puterea celor două limbaje, se poate afirma ca în locul unei competiții dintre 
cele  două,  ar  putea  lua  naştere  o  colaborare.  La  această  concluzie  se  poate  ajunge  datorită 
faptului ca GWT deține unele avantaje privitoare la mecanismele de transmitere a informațiilor 
între  server  şi  client.  S‐a  observat  că  din  ce  în  ce  mai  mulți  programatori  care  folosesc  alte 
tehnologii decât Java pe partea de server, sunt mulțumiți de rezultate pe care GWT le oferă 
pe partea de client prin integrarea cu alte tehnologii pe partea de server. 

Weitere ähnliche Inhalte

Ähnlich wie Google Web Toolkit - technical report

Cloud computing caracteristici si modele v greavu
Cloud computing caracteristici si modele   v greavuCloud computing caracteristici si modele   v greavu
Cloud computing caracteristici si modele v greavuMalairauValeria
 
Date structurate, aplicarea modelului linked data
Date structurate, aplicarea modelului linked dataDate structurate, aplicarea modelului linked data
Date structurate, aplicarea modelului linked dataionut_ignatescu
 
WADe 2014—2015 (02/12): Dezvoltarea de servicii Web în stilul REST
WADe 2014—2015 (02/12): Dezvoltarea de servicii Web în stilul RESTWADe 2014—2015 (02/12): Dezvoltarea de servicii Web în stilul REST
WADe 2014—2015 (02/12): Dezvoltarea de servicii Web în stilul RESTSabin Buraga
 
Javascript ajax tutorial
Javascript ajax tutorialJavascript ajax tutorial
Javascript ajax tutorialVlad Posea
 
Model View Controller și ASP.NET MVC + AJAX
Model View Controller și ASP.NET MVC + AJAXModel View Controller și ASP.NET MVC + AJAX
Model View Controller și ASP.NET MVC + AJAXEnea Gabriel
 
Cloud Computing -everything you want to know
Cloud Computing -everything you want to knowCloud Computing -everything you want to know
Cloud Computing -everything you want to knowLupu Cosmin
 
Dezvoltarea Aplicatiilor Web
Dezvoltarea Aplicatiilor WebDezvoltarea Aplicatiilor Web
Dezvoltarea Aplicatiilor Webdanielnastase
 
Dezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul REST
Dezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul RESTDezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul REST
Dezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul RESTSabin Buraga
 
WADe 2017-2018 (2/12) Service-based Web Application Development. REST
WADe 2017-2018 (2/12) Service-based Web Application Development. RESTWADe 2017-2018 (2/12) Service-based Web Application Development. REST
WADe 2017-2018 (2/12) Service-based Web Application Development. RESTSabin Buraga
 
Dezvoltare Web Folosind Java
Dezvoltare Web Folosind JavaDezvoltare Web Folosind Java
Dezvoltare Web Folosind Javacolaru
 
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...Sabin Buraga
 
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2Diana Tataran
 
Documentatie Your Academic Tasks
Documentatie Your Academic TasksDocumentatie Your Academic Tasks
Documentatie Your Academic TasksAlice Burdujanu
 
Carte catia gratuita
Carte catia gratuitaCarte catia gratuita
Carte catia gratuitaIonut Ghionea
 
Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...
Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...
Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...Sabin Buraga
 
CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5
CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5
CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5Sabin Buraga
 

Ähnlich wie Google Web Toolkit - technical report (20)

MOBILI-AR.pptx
MOBILI-AR.pptxMOBILI-AR.pptx
MOBILI-AR.pptx
 
Cloud computing caracteristici si modele v greavu
Cloud computing caracteristici si modele   v greavuCloud computing caracteristici si modele   v greavu
Cloud computing caracteristici si modele v greavu
 
Date structurate, aplicarea modelului linked data
Date structurate, aplicarea modelului linked dataDate structurate, aplicarea modelului linked data
Date structurate, aplicarea modelului linked data
 
Cap.1
Cap.1Cap.1
Cap.1
 
WADe 2014—2015 (02/12): Dezvoltarea de servicii Web în stilul REST
WADe 2014—2015 (02/12): Dezvoltarea de servicii Web în stilul RESTWADe 2014—2015 (02/12): Dezvoltarea de servicii Web în stilul REST
WADe 2014—2015 (02/12): Dezvoltarea de servicii Web în stilul REST
 
Javascript ajax tutorial
Javascript ajax tutorialJavascript ajax tutorial
Javascript ajax tutorial
 
Model View Controller și ASP.NET MVC + AJAX
Model View Controller și ASP.NET MVC + AJAXModel View Controller și ASP.NET MVC + AJAX
Model View Controller și ASP.NET MVC + AJAX
 
Music Finder
Music FinderMusic Finder
Music Finder
 
Cloud Computing -everything you want to know
Cloud Computing -everything you want to knowCloud Computing -everything you want to know
Cloud Computing -everything you want to know
 
FlexDoc
FlexDocFlexDoc
FlexDoc
 
Dezvoltarea Aplicatiilor Web
Dezvoltarea Aplicatiilor WebDezvoltarea Aplicatiilor Web
Dezvoltarea Aplicatiilor Web
 
Dezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul REST
Dezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul RESTDezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul REST
Dezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul REST
 
WADe 2017-2018 (2/12) Service-based Web Application Development. REST
WADe 2017-2018 (2/12) Service-based Web Application Development. RESTWADe 2017-2018 (2/12) Service-based Web Application Development. REST
WADe 2017-2018 (2/12) Service-based Web Application Development. REST
 
Dezvoltare Web Folosind Java
Dezvoltare Web Folosind JavaDezvoltare Web Folosind Java
Dezvoltare Web Folosind Java
 
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...
 
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
 
Documentatie Your Academic Tasks
Documentatie Your Academic TasksDocumentatie Your Academic Tasks
Documentatie Your Academic Tasks
 
Carte catia gratuita
Carte catia gratuitaCarte catia gratuita
Carte catia gratuita
 
Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...
Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...
Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...
 
CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5
CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5
CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5
 

Google Web Toolkit - technical report

  • 1.       Google Web Toolkit  Tutorial      Anişoara Sava, OC2  Marcela Daniela Mihai, OC2      10/19/2009   
  • 2. Table of Contents    1.  Prezentare generală ................................................................................................................ 3  2.  Principii de bază GWT .............................................................................................................. 3  3.  Arhitectura GWT ...................................................................................................................... 4  3.1  Structura unui proiect GWT ................................................................................................. 6  3.2 Interoperabilitatea cu Standardele Web şi Serviciile Web ................................................... 8  4.  Instrumente GWT .................................................................................................................... 8  4.1 Compilatorul Java‐to‐JavaScript ........................................................................................... 9  4.2 JSNI (JavaScript Native Interface) ....................................................................................... 11  4.3 Widget‐uri  şi  Panel Library ................................................................................................ 12  4.4 Protocolul Remote Procedure Call (RPC) ............................................................................ 13  4.5 Managementul butonului “Back” al browser‐ului / Browser History ................................ 16  4.6 Integrarea JUnit cu  GWT .................................................................................................... 17  5.  Modul Host vs Modul Web .................................................................................................... 18  6.  Utilitatea GWT ....................................................................................................................... 23  7.  Comparație cu alte framework‐uri ........................................................................................ 24  7.1 GWT vs SWING .................................................................................................................... 24  7.2 GWT vs. Echo2 .................................................................................................................... 25  7.3 GWT vs JSF .......................................................................................................................... 25  7.4 GWT vs Ruby on Rails .......................................................................................................... 26       
  • 3.     1. Prezentare generală    Platforma Web 2.0 împreună cu tehnologia Ajax din cadrul acesteia, a câştigat tot mai  multă  atenție  datorită  faptului  că  pentru  aplicațiile  web,  cel  mai  important  beneficiu  adus  de  Ajax îl constituie îmbunătățirea experienței utilizatorilor.     Deşi JavaScript şi DHTML ‐ limbaje aflate la baza tehnologiei Ajax ‐ sunt disponibile de  câțiva  ani,  cei  mai  mulți  programatori  încearcă  să  le  evite  datorită  dificultății  de  folosire  a  acestora.  Astăzi,  framework‐uri  scrise  în  JavaScript  precum  Dojo,  pot  fi  folosite  pentru  realizarea aplicațiilor Ajax, însă, acest fapt necesită cunoştințe solide de JavaScript. Ca soluție la  acestă  problemă,  Google  vine  în  sprijinul  programatorilor  Java,  cu  un  nou  framework  pentru  crearea de aplicații Ajax mult mai productive: Google Web Toolkit (GWT).  2. Principii de bază GWT   Pe  parcursul  ultimilor  ani,  s‐au  dezvoltat  numeroase  framework‐uri  Java  pentru  realizarea  aplicațiilor  web. Din prima generație de astfel de framework‐uri face parte venerabilul Apache  Struts,  iar  a  doua  generație  cuprinde  framework‐uri  precum  Tapestry  şi  JavaServerFaces.  Google Web Toolkit dă startul celei de‐a treia generații de framework‐uri, oferind, la fel ca cea  de‐a  doua  generație,  suport  pentru  folosirea  componentelor  (componentele  pot  fi  folosite  de  dezvoltatori  pentru  crearea  de  noi  componente  care  pot  fi  adăugate  în  aplicație  pentru  îmbunătățirea  funcționalității  paginlor  web),  numite  în  GWT  widgets,  însă  se  diferențiază  de  predecesorii săi prin faptul că nu este o tehnologie care foloseşte  clasicele  form‐uri. GWT este  primul framework pentru crearea de aplicații web folosind limbajul Java care permite realizarea  de aplicații asemănătoare cu cele pentru desktop, dar care sunt rulate în browser. Cu această  inovație,  dezvoltatorii  pot  renunța  la  construcția  de  aplicații  web  compuse  din  “arhaicele”  pagini,  trecând  la  aplicații  care  rulează  într‐o  singură  fereastră  a  browserului,  similar  cu  aplicațiile pentru desktop construite cu AWT, Swing sau SWT. Astfel, GWT nu e o evoluție, ci o 
  • 4. revoluție  deoarece  desființează  în  totalitate  fundamentele  modalității  de  construire  a  aplicațiilor web.    Google Web Toolkit(GWT) este un set de unelte de dezvoltare, utilități de programare şi  widget‐uri  care  permit  crearea  cu  uşurință  a  aplicațiilor  AJAX.  Această  tehnologie  este  disponibilă open‐souce sub licență Apache 2.0 pentru platformele: Windows, Mac OS X şi Linux.    Cea  mai  importantă  parte  a  GWT‐ului  poate  fi  considerat  compilatorul  responsabil  cu  transformarea codului Java în cod JavaScript pentru a putea fi rulat in browser. Această inovație  adusă  de  GWT  este  foarte  importantă,  însă  nu  este  singurul  lucru  care  face  ca  această  nouă  tehnologie să fie deosebită.   GWT  vine  şi  cu:  un  echipament  de  testare  folosit  pentru  depanarea  bytecodului  Java  în  mod  direct atunci când este rulat în mediul oferit de GWT ce simulează browserul,  un set de widget‐ uri  principale  pentru  construirea  interfeței  cu  utilizatorul,  precum  şi  un  sistem  Remote  Procedure  Call  pentru  realizarea  comunicației  cu  serverul  web.  Pe  scurt,  GWT  reuneşte  avantajele  oferite  de  librăriile  JavaScript,  abilitățile  de  comunicare  ale  DWR  –ului,  precum  şi  avantajele uneltelor Java din Echo2 sau XML11, într‐un singur pachet.  3. Arhitectura GWT    GWT continuă să folosească HTML şi CSS deoarece sunt relativ simple, încă eficiente şi  suportate  în  mod  nativ  de  browsere.  O  aplicație  GWT  bine  realizată  se  va  baza  pe  patternul  MVC, însă se va întoarce şi la modelul de programare client‐server.    Cu  GWT  se  va  folosi  MVC  pe  partea  de  client.  MVC  este  un  şablon  architectural   proiectat  pentru  separarea  responsabilităților  în  cadrul  aplicațiilor  software.  Pentru  aplicațiile  web,  MVC  presupune  o  defalcare  în  trei  straturi:  modelul  reprezentat  de  informațiile  de  pe  partea de server, view‐ul oferit de către HTML şi controller‐ul reprezentat de o pagină sau un  servlet de pe server, acestea având propriile responsabilități.   În  mediul  GWT  (similar  cu  alte  aplicații  bazate  pe  AJAX),  toate  aceste  responsabilități  ale  aplicației sunt mutate de pe server pe client.  
  • 5. View‐ul generat de server prin tehnologii de genul JSP, este înlocuit cu componente pentru UI  inteligente care leagă informațiile din cadrul lor de modelul aplicației.   Modelul  este  sincronizat  cu  serverul  prin  intermediul  unor  tehnici  tradiționale  care  permit  comunicarea dintre server şi client.   Această modalitate de a folosi MVC pe client  oferă posibilitatea clientului de a coordona cele  mai multe tranziții de stare din UI precum şi relaționarea logică a interfeței, fără a mai apela la  serviciile serverului.   Acest lucru presupune îmbunătățirea performanței şi a scalabilității chiar dacă lățimea de bandă  sau latența rețelei prezintă probleme. Această îmbunătățire derivă din faptul că clientul poate  să dirijeze mai multe responsabilități, fără a fi nevoit să comunice cu serverul pentru a modifica  view‐ul  pentru  acelaşi  set  de  date.  Mai  mult,  se  pot  obține  infomații  ale  aplicației  sau  sincronizări cu serverul printr‐o metodă elegantă, asincronă, care oferă la rândul ei avantaje.     O caracteristică a GWT‐ului este că trebuie să fie prezentă şi pe server o reprezentare a  modelului,  iar  modelul  de  pe  client  trebuie  să  comunice  cu  serverul  pentru  a  obține  sau  sincroniza informațiile; acesta comunicare este realizată prin intermediul mecanismului RPC şi a  facilităților oferite de serializarea obiectelor.   Pentru  a  face  posibilă  comunicarea  dintre  server  şi  client,  GWT  foloseşte  implementarea  serviciul  SOA  (Service  Oriented  Arhitecture),  permițând  astfel  controller‐ului  de  pe  client  să  invoce seviciile puse la dispoziție de către server şi să actualizeze modelul de pe client când este  nevoie.  Reprezentările  modelului  de  pe  client  şi  server  pot  folosi  aceleaşi  obiecte,  sau  copii  exacte ale acestora, GWT putând serializa şi deserializa automat datele din JavaScript în Java şi  viceversa.   Următoarea figură este o diagramă simplificată care descrie modalitatea de sincronizare între  serverul şi clientul GWT, facilitată de mecanismul RPC oferit de GWT şi capabilitățile oferite de  serializarea/deserializarea obiectelor. 
  • 6.         Din  D mai  mu ulte  puncte  de  vedere GWT  rep e,  prezintă  o  reîntoarcere la  tradițio e  onala  arhitectu ură cu trei st traturi, unde e aplicația cl lient este res sponsabilă c cu tratarea t tuturor acțiu unilor  efectuate e de utilizator şi cu com municarea cu u serverul ca are oferă accesul asupra a datelor sto ocate  într‐un m mod persistent de genul RDBMS (Rel lational Data abase Management Syst tem).   Acest mo odel împreună cu avanta ajul de a nu avea nevoie e de altceva a înafară de  browser instalat,  duce  la  o îmbunătăț consider o  țire  rabilă  a  experienței  util lizatorului  asupra  utiliză aplicațiilor  ce  ării  conțin se ervere web.      3.1  Structu 3 ura unui p proiect GW WT    Un  U proiect  GWT  are  o  st G tructură  sim milară  cu  stru uctura  unui  pachet  Java Pachetul  GWT  a.  inițial,  ge enerat  atunci  când  con nstruim  un  p proiect  GWT nou,  difer T  rențiază  în  m vizibil  unde  mod  trebuie  s se  afle  co să  odul  sursă  p pentru  partea  de  client față  de  co t  odul  sursă  p pentru  parte de  ea  server şi față de resu urse.  Un proiect GWT arat tă în felul urm mător: 
  • 7. Pachetul  principal  al  proiectului.  Acesta  conține  com/example/app  toate  modulele  proiectului,  şi  nu  poate  conține  fişiere cu cod.  Subpachetul  care  conține  toate  fişierele  cu  codul  com/example/app/client  sursă pentru partea de client.  Subpachetul  care  conține  toate  fişierele  cu  codul  com/example/app/server  sursă pentru server.  Subpachetul  care  conține  toate  resursele  statice  com/example/app/public  de care este nevoie în aplicație.    Fiecare proiect GWT poate fi alcătuit din unul sau mai multe module. Citând definiția dată de  Google, un “modul GWT este pur şi simplu o încapsulare a funcționalității”. Modulul reuneşte  toate  configurările  necesare  pentru  a  utiliza  codul  pe  care  îl  scriem  într‐un  proiect  GWT.  Modulele  sunt  definite  în  aplicație  în  cadrul  fişierelor  descriptor  XML  a  căror  denumire  se  termină  cu  extensia  .gwt.xml.  Conceptul  descriptorului  de  modul  din  GWT  este  similar  descriptorilor din Tomcat sau alte servere de aplicații.    Conținutul unui fişier descriptor XML este folosit pentru a specifica:  Modulele moştenite, cele din care aplicația  moşteneşte setări şi cod.  Numele unei clase ce reprezintă punctul de intrare în aplicație (opțional);  o clasă de tip  entry  point  este  o  clasă  ce  implementeză  interfața  EntryPoint.  Când  un  modul  este  încărcat, fiecare clasă entry point definită în fişierul .gwt.xml este instanțiată şi apelată  metoda  onModuleLoad()  din  cadrul  acesteia.  Este  posibil  să  creăm  un  modul  cu  mai  mult  de  o  clasă  entry  point,  şi  de  asemenea  este  posibil  să  creăm  un  modul  cu    nicio  clasă  de  tip  entry  point,  acest  tip  de  modul  fiind  folosit  ca  o  librărie  GWT  de  cod  reutilizabil.  Intrările Source Path, folosite pentru a specifica care subpachet conține codul sursă care  urmează a fi transformat în JavaScript. Subpachetul care conține codul pentru client este  inclus automat în source path. 
  • 8. Intrările Public Path, folosite pentru a specifica care subpachete sunt publice (vizibile în  toată aplicația). Toate fişierele aflate in Public Path vor fi copiate în directorul de ieşire a  modulului în momentul când aplicația este compilată.      3.2 Interoperabilitatea cu Standardele Web şi Serviciile Web    GWT nu încearcă să fie doar un framework cu care se pot construi aplicații; el se vrea a fi  un  set  de  unelte  care  îmbunătățeşte  vizibil    posibilitatea  de  a  crea  aplicații  Ajax.  Pentru  a  îndeplini acesta este necesar să fie îmbinate standardele web actuale şi serviciile web. Astfel,  GWT nu îndrumă spre o singură tehnologie, ci permite folosirea oricărei tehnologii.    În particular, GWT furnizează librăriile JSON şi XML care permit translatarea datelor în  alte  tipuri  de  obiecte.  De  asemeni  GWT  oferă  o  modalitate  de  a  conecta  componentele  care  alcătuiesc  interfața  cu  fişierul  CSS  pentru  a  putea  profita  de  beneficiile  aduse  de  această  tehnologie. Pentru a obține efecte mai spectaculoase acest toolkit permite integrarea cu alte  librării JavaScript existente prin intermediul JavaScript Native Interface (JSNI), o modalitate de  a utiliza cod JavaScript în cadrul codului Java.    4. Instrumente GWT    GWT  oferă  un  set  amplu  de  unelte  necesare  pentru  rezolvarea  problemei  mutării  aplicațiilor  tip  desktop  în  browser.  Toolbox‐ul  GWT  conține  un  parser  XML,  mai  multe  instrumente  pentru  comunicarea  cu  serverul,  unelte  pentru  configurare  şi  internaționalizare  precum şi un sistem de  management al istoriei paginilor vizualizate în browser.   Următoarea  figură  constituie  o  hartă  vizuală  a aspectelor  centrale  ale GWT‐ului,  acestea  fiind  împărțite  în  două  categorii:  cele  legate  de  compilator  şi  librăriile  Java  care  alcătuiesc  API‐uri  GWT. 
  • 9.      4.1 Compilatorul Jav 4 va­to­JavaS Script    Responsabilit tatea compil latorului GW WT este să co onvertească codul Java î în cod JavaScript,  într‐o  m atorul  care  transformă codul  Jav în  bytec maniera  asemănătoare  cu  compila ă  va  code.  Compilar rea  pro oiectului  se  face  f de  către e  prog gramul  Java  com.go oogle.gwt TCompiler căruia  i  se dă  ca  para t.dev.GWT r  e  ametru  loca unde  se află  ația  e  fişierul de definiție al modulului.  Procesul  de compilare începe cu u clasa entry y‐point, urm mând apoi de ependințele  necesare pe entru  a  compila  codul  Java Compilato GWT  lu a.  orul  ucrează  diferit  față  de  u compilator  standard  Java  un  deoarece acesta  nu  compilează tot  ce  se  gaseşte  în  modul,  ci  n e  ă  numai  ceea ce  este  fo a  olosit.  Acesta  lucru  este  avantajos  deoarece  pe a ermite  să  se poată  de e  brarie  amplă  de  ezvolta  o  lib ente  şi  tool‐uri,  iar  com compone mpilatorul  v include  n va  numai  acele clase  şi  m e  metode  care  sunt  folosite d de clasa entr ry‐point.  Compilat torul are trei tipuri de st tiluri care de etermina cum m va arăta c codul Java Sc cript rezultat t:  plicit  este  cel  obfusca   şi  face  ca  codul  JavaScript  să  arate  ca  o  stilul  imp ate  amesteca re ceea ce îl face a fi imp atură de liter posibil de de pul acestui stil nu  escifrat. Scop
  • 10. este de a face imposibil de citit codul ci pentru a menține fişierul JavaScript cât mai  mic posibil.   Un exemplu de cod care are acest stil arată în felul următor:  function b(){return this.c + '@' + this.d();}   stilul pretty,  generează cod JavaScript care poate fi citit cu uşurința.   Pentru exemplificare vom folosi acelaşi cod ca la stilul anterior. De acesta dată ne putem  da seama că este metoda toString(), însă încă nu putem şti din care clasă este această  metoda:  function _toString(){ return this._typeName + '@' + this._hashCode(); }     stilul  detailed,  care  seamănă  cu  stilul  pretty,  cu  completarea  că,  vom  avea  numele  complet al clasei din care face parte metoda, ca parte a numelui metodei JavaScript  function java_lang_Object_toString__(){ return this.java_lang_Object_typeName + '@' +this.hashCode__(); }   Stilurile  pretty  şi  detailed  sunt  folosite  îndeosebi  în  procesul  de  dezvoltare  pentru  a  putea  detecta cu uşurința eventualele erori JavaScript apărute în browser.    Un alt aspect important al compilatorului GWT este că acesta foloseşte codul sursă Java,  nu  codul  Java  binar.  Acesta  presupune  că,  codul  sursă  pentru  toate  clasele  Java  să  fie  disponibile. Acest lucru este important şi atunci când vrem să distribuim cod GWT pentru a fi 
  • 11. refolosit. Când se construiesc fişiere .jar, care urmează a fi distribuite, trebuie să fie incluse atât  clasele Java cât şi fişierele cu cod sursă.    O  ultimă  caracteristică  notabilă  este  aceea  că  după  compilarea  codului  Java  în  JavaScript, rezultă un singur fişier JavaScript pentru fiecare tip de browser. Browser‐ele pentru  care  se  generează  fişiere  JavaScript  sunt:  Internet  Explorer,  Firefox,  Mozillla,  Opera  şi  Safari.  Când  este  rulat  scriptul  de  pornire  pentru  browser  (bootstrap),  acesta  încarcă  fişierul  corespunzător pentru browserul respectiv. Avantajul este că nu se va mai încarca cod pe care  browserul nu va putea să îl folosească.       4.2 JSNI (JavaScript Native Interface)    Cu toate că codul GWT trebuie scris in Java, uneori pot apărea situații cand trebuie să  facem apeluri directe la cod JavaScript. O astfel de situație este atunci când trebuie să facem  apel la API‐ul browser‐ului pentru care nu există echivalent în GWT. O altă situație poate apărea  atunci când vrem să utilizăm în aplicația noastră anumite librării  JavaScript mai deosebite.    Accesând JavaScript direct, aplicația este expusă incompatibilităților dintre browsere. Va  fi  nevoie  de  teste  extra  pentru  a  avea  siguranța  că,  codul  JSNI  va  funcționa  pe  mai  multe  browsere.    JSNI permite execuția codului JavaScript din codul Java, precum şi viceversa. Acest lucru  este  făcut  posibil  de  către  compilatorul  GWT  care  poate  îmbina  cod  nativ  JavaScript  cu  cod  JavaScript generat dupa compilarea codului Java.   Pentru  a  scrie  o  metodă  pură  JavaScript  prin  intermediul  JSNI  trebuie  doar  să  declarăm  acea  metodă ca native şi să furnizăm implementarea în JavaScript între comentarii:  public native void fillData (String msg) /*-{ $wnd.alert(msg); }-*/;   
  • 12.   De  asemenea,  GWT  oferă  şi  o  modalitate  pentru  a  apela  cod  Java  în  cadrul  codului  JavaScript.  Signatura  unei  astfel  de  metode  este  următoarea:  [instance-expr.]@class- name::method-name(param-signature)(arguments), unde [instance-expr.] specifică  faptul că este vorba de o metodă ne‐statică.       4.3 Widget­uri  şi  Panel Library    GWT vine cu o gamă largă de  widget‐uri şi panel‐uri care pot fi folosite în codul Java al  aplicațiilor  Ajax.  Acestea  sunt  construite  cu  HTML,  iar  JavaScript  este  folosit  pentru  tratarea  evenimentelor; atunci când codul aplicației este compilat şi transformat în JavaScript, browserul  încarcă aceste componente în cadrul unei pagini web tradiționale, fără a fi nevoie de plugin‐uri  sau  JRE.   Există trei categorii de componente pentru crearea interfeței cu utilizatorul: widget‐uri, panel‐ uri pentru aşezare şi panel‐uri interactive.     Lucrul  cu  aceste  componente  este  asemănator  cu  cel  din  Swing  şi  AWT  (Abstract  Window  Toolkit),  cu  diferența  că  GWT  oferă  în  loc  de  layout‐manageri,  un  set  de  panel‐uri  care  afişează  elementele  componente  într‐o  maniera  anume.  De  exemplu,  HorizontalPanel  afişează  elementele  de  la  stânga  la  dreapta,  FlowPanel  afişează  folosind  regulile  de  la  fluxul  HTML, iar AbsolutePanel foloseşte poziția exactă a componentelor pe care le conține.   Pentru  a  crea  o  interfață  cu  utilizatorul,  trebuie  să  instanțiem  aceste  widget‐uri,  apoi  să  le  adăugăm  panel‐urilor,  care  la  rândul  lor  trebuiesc  adaugate  panelului  principal  al  aplicației  (Root  Panel).  Panelul  principal  este  un  container  de  nivel  înalt,  care  conține  toate  componentele unei interfețe.    GWT‐ul vine cu componente care sunt deseori intâlnite la aplicațiile desktop şi mai rar la  cele  web.  Un  astfel  de  exemplu  este  TabPanel  care  permite  plasarea  widget‐urilor  în  taburi  diferite, fiind vizibile la un moment dat doar widget‐urile de pe un singur tab.  
  • 13. Alte exemple de acest fel de componente sunt: MenuBar, care oferă o cale usoară de a crea un  meniu cu mai multe nivele, PopupPanel, StackPanel etc.   Trebuie să observăm, însă, că widget‐urile din GWT nu intenționează să semene perfect cu cele  dintr‐o aplicație pentru desktop; astfel, ele se integrează bine cu browserul şi oferă o experiență  familială utilizatorului. De asemenea, aplicația creată cu GWT poate fi integrată cu oricare parte  a unei pagini HTML, însă permițându‐i să arate ca o pagină web obişnuită.      Există  peste  30  de  widget‐uri  şi  panel‐uri  conținute  în  pachetul  com.google.gwt.user.client.ui din GWT, însă e puțin probabil ca acestea să satisfacă toate  nevoile  dezvoltatorilor.  Lista  widget‐urilor  din  GWT  cuprinde  calendare,  tabele  sortabile,  calculatoare,  panel‐uri  pentru  desenare,  panel‐uri  cu  rol  de  tooltip  etc.  Există,  de  asemeni,  widget‐uri  care  includ  librării  JavaScript,  cum  sunt  Google  Maps  API,  Google  Search  API,  sau  efecte obținute cu Scriptaculous. Înafara widget‐urilor de bază pentru HTML, există şi widget‐ uri disponibile pentru Scalar Vector Graphics (SVG).     Există şi posibilitatea să ne creem propriile noastre widget‐uri extinzându‐le pe cele din  GWT, însă este recomandat ca atunci când recurgem la această posibilitate să accesăm obiecte  JavaScript care se află la baza browser‐elor.      4.4 Protocolul Remote Procedure Call (RPC)    Din punctul de vedere al locului unde este rulat codul, aplicațiile Ajax în general şi cele  GWT  în  particular  se  încadrează  în  categoria  Rich  Internet  Applications(RIA).  Acest  tip  de  aplicații  sunt  o  combinație  între  Fat  client  applications,  unde  codul  rulează  doar  pe  maşina  utilizatorului (ex. Microsoft Word), şi Thin client applications unde codul rulează pe o maşină  server, iar desktopul clientului este folosit doar pentru afişarea interfeței prin intermediul unui  browser (aici se încadrează majoritatea aplicațiilor web: Ebay, Amazon etc).    Faptul  că  se  încadrează  în  ambele  categorii  oferă  GWT‐ului  complexitate  şi  interactivitate,  deoarece poate profita de anumite puteri de procesare pe partea de client.  
  • 14.   De  fiecare  dată  când  avem  cod  care  rulează  în  doua  părți  diferite, avem  nevoie  de  un  mecanism pentru a comunica între cele două. Cea mai simplă modalitate în această situație o  reprezintă apelul procedurilor la distanță (Remote Procedure Call), care presupune o cale prin  care clientul să execute codul pe server şi să primească rezultatul execuției; în acestă situație  poate fi folosit oricare dintre următoarele protocoalele RPC: RMI, .NET Remoting, SOAP, REST  sau  XML‐RPC.  Însă  GWT  nu  foloseşte  nici  unul  dintre  acestea,  având  implementat  propriul  protocol de tip RPC, aceasta pentru a putea realiza apelurile asincrone de la browser.    În GWT librăria RPC este divizată în două pachete:   pachetul com.google.gwt.user.client.rpc folosit pe partea de client şi   pachetul com.google.gwt.user.server.rpc folosit pe partea de server.   Partea  pentru  client  oferă  interfețele  necesare  pentru    interconectarea  interfețelor  aplicației  care vor fi folosite pentru implementarea RPC‐ului. Când este transformat codul de pe client în  cod  JavaScript  de  către  compilatorul  GWT,  codul  folosit  pentru  RPC  este  generat  pe  baza  interfețelor interconectate.   Pachetul  pentru  partea  de  server  folosit  pentru  implementarea  RPC‐ului  este  construit  astfel  încât să fie folosit într‐un container de servleturi Java cum este Tomcat sau Jetty. Din fericire,  browser‐ul  host  oferit  de  GWT  conține  un  server  Tomcat  integrat,  şi  astfel  pot  fi  testate  şi  depanate apelurile RPC de pe server în orice IDE care oferă suport pentru GWT.    S‐a mers pe ideea ca protocolul trebuie să fie simplu. Browser‐ul descarcă tot codul de  la client când acesta porneşte aplicația , iar dacă codul depăşeşte 100K atunci se va observa o  pauză.  De  astfel,  codul  JavaScript  care  rulează  în  browser  este  destul  de  lent,  aşa  încât  implementarea  unui  protocol  complex  precum  SOAP  ar  presupune  descărcarea  unei  cantități  mari de cod care ar incetini considerabil execuția. Astfel, când  mecanismul oferit de RPC este  folosit  în  mod  corespunzător,  oferă  avantajul  de  a  muta  tot  codul  pentru  logica  UI  pe  client,  obținând astfel vizibile creşteri de performanță, reducerea încărcării serverului web, precum şi  o experiență plăcută pentru utilizator. Prin acest mecanism, codul de pe partea de server este 
  • 15. invocat ş şi referit de  către client  precum un  serviciu, îns t să în acest c context, term menul de ser rviciu  (service) nu are acela aşi înțeles cu u conceptul general de “ “serviciu web b”.      Fi igura  anteri ioară  reprez zintă  o  descriere  vizua a  ceea  c înseamnă    crearea  unui  ală  ce  serviciu c cu mecanism mul pus la dis spoziție de G GWT‐RPC.   Fiecare s serviciu dețin ne un set de e interfețe şi clase ajutătoare. Unele e dintre aceste clase, cu um ar  fi serviciu u proxy, est te generat a automat în s spate fără ca a programat torul să ştie de existenț ța sa.  Primul pa as pentru crearea unui a apel RPC est te să definim m un templat te care să de escrie apelul. Din  păcate ac cest lucru tr rebuie făcut de trei ori: o o dată pe pa artea de serv ver, o data p pe client şi o dată  în interfa ața care este e partajată d client. GWT foloseşte o convenție de nume pen de server şi c ntru a  le conect ta pe toate.  Problema care  poat să  apară  este  serializ a  te  zarea  obiect telor  care  sunt  trimise/ /recepționat În  te.  mod  ide entic  cu  RM şi  .NET  R MI  Remoting,  G GWT‐RPC  nu este  limita doar  la  primitive  pe u  at  entru 
  • 16. serializare.  Orice  tip  de  dată  care  este  serializabil  poate  fi  trimis/returnat  ca  parametrul  în  apelul la distanță.   Trebuie  să  se  țină  seama  că  ideea  de  tip  “GWT  serializabil”  diferă  de  ideea  de  tip  “Java  serializabil”. Un tip este “GWT serializabil” dacă:  este primitivă, precum: char, byte, short, int, long, boolean, float sau double;  este primitivă de tip wrapper(Character, Byte, etc);  este String sau Date;  este un vector de tipuri serializabile (incluzând vectori de vectori);  este un tip declarat de utilizator, a cărui clasă are toate câmpurile serializabile;  implementează interfața IsSerializable.  Colecțiile precum Set, List, Map şi HashMap sunt problematice; trebuie să folosim o adnotare  specială  în  JavaDoc  pentru  a‐i  spune  compilatorului  GWT  ce  tip  de  obiecte  vor  fi  incluse  în  colecție.      4.5 Managementul butonului “Back” al browser­ului / Browser History    Una dintre cele mai acute probleme ale aplicațiilor Ajax este acțiunea care se execută la  apăsarea butonului “Back” al browser‐ului. Aceasta presupune că dacă înlocuim dinamic o parte  a conținutului paginii web cu JavaScript, browser‐ul nu îşi poate da seama că s‐a schimbat ceva  în conținutul paginii.   Ceea ce se întâmplă cel mai adesea este că utilizatorul observă faptul că pagina s‐a schimbat, şi  îşi  imaginează  că  dacă acționează butonul  “Back”  se  va întoarce  la  vechiul  conținut  al  paginii,  însă  această  presupunere  este  falsă.  Pentru  a  putea  ajuta  utilizatorii,  dezvoltatorii  trebuie  să  găsească o modalitate de a rezolva problema într‐un mod cât mai transparent pentru utilizator.  Soluția  cea  mai  populară  pentru  această  problemă  tinde  să  fie  destul  de  complicată  de  implementat şi folosit. Ea presupune adăugarea unui frame ascuns şi a unui număr de scripturi  pentru  a  obține  funcționarea  corectă.  Folosind  GWT  programatorul  nu  trebuie  să  facă  el 
  • 17. această  muncă,  totul  fiind  rezolvat  de  framework,  dezvoltatorul  trebuie  doar  să  creeze  un  obiect  history  token  căruia  să  îi  asocieze  un  listener  care  implementează  interfața  HistoryListen şi să‐l înregistreze ca un obiect de tip History.  Acest  history  token  este  un  string  în  care  se  memorează  orice  stare  a  aplicației  cum  ar  fi  numele  tabului  curent  dintr‐o  pagină  care  conține  mai  multe  taburi.  Google  nu  precizează  dimensiunea  maximă  a  acestui  token,  însă  este  recomandat  să  nu  se  depăşească  100  de  caractere.   Tokenul curent este modificat atunci când utilizatorul face click pe un obiect Hyperlink sau când  acționeză butoanele Back sau Forward din browser, sau poate fi modificat în mod programatic  apelând History.newItem(), History.back() sau History.forward().  Cu  ajutorul  listener‐ului  înregistrat,  putem  depista  schimbările  apărute  în  tokenul  înregistrat.  Pentru utilizator, token‐ul va apărea afişat în bara de adrese a browser‐ului ca parte a URL‐ului,  sub forma: http://www.gwtpowered.org/#Xyzzy.   Intern,  managementul  paginilor  accesate  este  înregistrat  în  fişierul  html  al  aplicației  printr‐un  tag  special  numit  <iframe>.  Când  se  crează  acest  token  se  crează  un  frame  ascuns  programatorului  care  va    fi  încărcat  cu  o  nouă  pagină.  Deoarece  frame‐ul  este  încărcat  cu  o  nouă pagină, browser‐ul o va considera o pagină diferită şi o va adăuga la history. Astfel, prin  faptul  că  modificarea  conținutului  frame‐ului  ascuns  este  semnalată  de  metoda  onHistoryChange()  din  HistoryListener,  toate  stările  prin  care  trece  aplicația  sunt  salvate,  fiind posibil astfel ca atunci când utilizatorul face click pe butonul “Back” al browser‐ului să  fie  încărcată vechea pagină, producându‐se comportamentul aşteptat de utilizator. La fel se petrec  lucrurile şi pentru butonul “Forward”.      4.6 Integrarea JUnit cu  GWT    Deoarece JUnit  este instrumentul de testare cel mai popular, fiind integrat şi în cadrul  unor IDE‐uri, GWT oferă suport pentru folosirea acestuia pentru a permite testarea codului Ajax  cu aceiaşi uşurință cu care este facută testarea codului Java. 
  • 18.   Pentru a crea un test, trebuie sa creem o clasă pe care să o extindem din GWTTestCase,  care  extinde  la  rândul  ei  clasa  TestCase,  apoi  să  implementăm  o  anumită  metodă,  getModuleName(), urmată de un număr de teste efective. Numele modulului este folosit de  GWT pentru a localiza fişierul de configurare.  public class MathTest extends GWTTestCase { public String getModuleName () { return "org.mycompany.MyApplication"; } public void testAbsoluteValue () { int absVal = Math.abs(-5); assertEquals(5, absVal); } }       Înafară  de  testele  obişnuite,  GWT  permite  şi  testarea  apelurile  RPC  către  server.  În  această situație GWT va porni propria versiune de Tomcat, va executa codul GWT compilat, şi  va testa dacă codul apelat de client va primi rezultatul aşteptat de la server.    5. Modul Host vs Modul Web    Pe lângă suportul pentru JUnit sau compilatorul Java‐To‐JavaScript, Google Web Toolkit  oferă şi alte instrumente care să uşureze munca programatorilor web, şi anume un shell pentru  dezvoltarea şi testarea aplicațiilor, GWTShell , precum şi un browser web propriu numit Hosted  Mode Browser.  
  • 19.   GWTShell est G te o aplicație e de tipul “Eclipse Rich C Client application”  sub f formă de consolă  grafică  c care  atunci  când  este  la ansată  invocă  resursele din  proiec e  ctul  GWT,  afişează  mes sajele  informaționale şi lansează brows ser‐ul care p permite afişa area paginii î în modul host.    Hosted  Mode  Browser    permite  testarea  codu Java  în  timpul  dezv H ului  voltării  aplic cației,  într‐un  m mediu  de  dezvoltare  hibrid  asemă ănător  cu  ce al  browser‐ului,  însă înainte  de a  fi  el  ă  e  transform mat în cod JavaScript. A Aceasta însea amnă că JRE E‐ul este cel  care execut tă componentele  Ajax  ale  aplicației,  permițând  d p depanarea  c claselor  dire din  IDE‐le  în  care  s lucreză.  A ect  se  Acest  browser  caracterist tic  GWT‐ul lui  este  o compone o  entă  bazată pe  SWT şi  simulează  ă  T  comportamentul bro owserul implicit de pe fi emeni, este  de un real a iecare patformă. De ase ajutor  dezvoltarea  aplicației  şi  obținerea  de  feedback  prin  inte pentru  d apelurilor  de  tip  erpretarea  a callback  către codul  Java al aplic cației ce rule ează pe platforma de de ezvoltare. Următoarea f figură  înfățişeaz shell‐ul  GWT    precum şi  browse ză  G m  er‐ul    host  în timpul  rul n  lării  aplicație “Kitchen  Sink”  ei  oferită ca a exemplu de GWT.   
  • 20.   Browser‐ul host din figură  are două conexiuni cu shell‐ul de dezvoltare din spate: una  dintre ele este o conexiune HTTP obişnuită pentru a încărca paginile web, fişierele .css, imagini,  servleturi  folosite  pentru  apelul  serviciilor  de  la  server  şi  alte  resurse.  Toate  aceste  sunt  administrate  de  către  serverul  Apache  Tomcat  inclus  în  GWT  folosind  un  servlet  numit  com.google.gwt.dev.shell.GWTShellServlet. În  cazul  când  pe  server  sunt  integrate  alte  componente,  trebuie  configurată  corespunzător  această  variantă  de  Tomcat  internă,  sau  trebuie folosită o versiune externă.  Cea  de‐a    doua  conexiune  este  un  fel  de  “uşă  din  spate”  care  interceptează  toate  interacțiunile  care  apar  în  browser‐ul  host  şi  le  redirecționează  către  codul  java  din  shell  (nu  către codul JavaScript). Acest cod Java apelează codul de la client care a fost compilat anterior  de  către  IDE.  Detaliile  cum  se  executa  aceste  acțiuni  sunt  ascunse  in  codul  shell‐ului  care  nu  este open‐source.    Atunci  când  se  acționează  butonul  Compile/Browse  din  browser‐ul  host,  compilatorul  GWT  translatează  codul  din  pachetul  .client  în  cod  JavaScript  pe  care  îl  deschide  într‐un  browser  web  normal  pentru  a  putea  vizualiza  aplicația.  La  acest  punct  paginile  sunt  încă  furnizate  de  instanța  Tomcat‐ului  inclus  în  shell,  dar  la  fel  de  bine  pot  fi  furnizate  din  fişiere  sistem sau un server web obişnuit. O altă modalitate de a invoca compilatorul GWT este prin  intermediul scriptului  aflat  la  baza aplicației  (MyApp-compile).  De  asemeni  se  poate  scrie  un  script care sa fie rulat cu Ant.     De  fiecare  dată  cand  este  invocat,  compilatorul  GWT  combină  codul  nostru  cu  o  versiune JavaScript a API‐ului GWT (echivalentul pentru gwt-user.jar) într‐un fişier JavaScript.  Acest  cod  împreună  cu  alte  fişiere  auxiliare  sunt  plasate  în  diectorul  www  al  proiectului.  De  asemeni, tot ce se găseşte în directorul public al proiectului va fi copiat. 
  • 21. Figura de e mai sus pre ezintă paşii p pentru încăr rcarea unei p pagini în mo odul host:  1. programul sh hell deschide e o fereastră care conțin ne un browse er de tip hos st, în care încarcă  pagina  MyAp pp.html;  2. M MyApp.html încarcă gwt. .js printr‐un tag <script> >;  3. gw wt.js  scanează  MyApp p.html  pentru  a  extrag numele  modului  din  tagul:  <meta  ge  name=’gwtm module’>;  4. G GWT  citeşte  fişierul  modul  M MyApp.gwt.x xml  pentru a  găsi  numele  c u  clasei  EntryPoint(M MyApp);  5. cl lasa  MyApp  este  instan nțiată  şi  este apelată  m e  metoda  onMo oduleLoad.  De  aici  porn neşte  aplicația;  6. co odul aplicați iei apelează librăria din G GWT (gwt‐user.jar);  odul din gwt‐user.jar manipulează  DOM‐ul bro 7. co owser‐ului pe entru a adău uga compon nente  UI pe pagina web şi pentru a redirect U ta toate evenimentele d din browser c către aplicaț ție. 
  • 22. Urmă ătoarea figur ră prezintă f fluxul execuț țiilor pentru u a încărca o o pagină în m modul  web:  1. browser‐ul w web încarcă M MyApp.html;  2. M MyApp.html încarcă gwt. .js folosind t tag‐ul <scrip> >;  3. gw wt.js  parcu urge  MyAp pp.html  pe entru  a  a afla  numele modulului  din:  <meta  e  name=’gwtm module’>;  4. gw wt.js modifică pagina pentru a include un <ifra ame> care c cauzează încărcarea fişie erului  module‐name m e.nochache. .html;  5. co odul  JavaScript  din  fişie erul  module e‐name.noca ache.html  d determină  tipul  browser‐ului  apoi selectează fişierul co orect pentru u acel browser;  6. este  executa codul    JavaScript  ehivalent  m at  metodei  on nModuleLoad d(),  lansând du‐se  aplicația.  Manipularea  D DOM‐ului  din browser  e n  este  făcută  prin  apeluri  HTML  dina amice   din codul Java aScript compilat.       
  • 23. 6. Utilitatea GWT    Premisa care a stat la baza GWT‐ului a fost simplă: dezvoltarea de aplicații Ajax într‐un  mod mult mai simplu, şi anume scutindu‐i pe programatori de incompabilitatea dintre browser‐ e  şi  permițând  dezvoltatorului  să  lucreze  într‐un  mediu  de  dezvoltare  Java  familiar  (fără  a  fi  nevoie de cunoştințe solide de JavaScript si DHTML).    După  cum  aminteam  mai  sus,  GWT  este  primul  framework  pentru  crearea  de  aplicații  web  folosind  limbajul  Java  care  permite  realizarea  de  aplicații  asemănătoare  cu  cele  pentru  desktop, dar care sunt rulate în browser.    Google  Web  Toolkit    unifică  codul  pentru  client  şi  server  într‐o  singură  aplicație  scrisă  într‐un singur limbaj: Java. Acest lucru are numeroase avantaje. Unul dintre acestea ar fi că mai  mulți dezvoltatori folosesc Java față de JavaScript sau Flash. Un alt motiv ar fi acela că pentru  Java  există numeroase medii  de  dezvoltare:  Eclipse,  NetBeans,  IntelliJ IDEA  etc.  GWT  permite  crearea unei aplicații web într‐un mod asemănător cu crearea unei aplicații Swing – crearea de  componente vizuale, setarea event‐handler‐ilor, depanare etc – toate aceste în IDE‐ul preferat.  Prin folosirea aceluiaşi limbaj se poate folosi acelaşi cod atât pentru server cât şi pentru client.  De exemplu, se poate rula acelaşi cod de validare odată pe partea de client pentru feed‐back  imediat, precum şi pe partea de server pentru securitate maximă. De asemeni, se poate muta  cod între “straturile” aplicației în momentul când rearanjăm structura aplicației.    Nevoia  de  a  scrie  cod  in  Java,  şi  nu  în  JavaScript,  este  fundamentală  pentru  aplicațiile  Web  complexe,  deoarece  se  reduce  dimensiunea  aplicației,  aceasta  devenind  mai  uşor  de  administrat. Însă, GWT permite integrarea codului JavaScript în aplicație, precum şi integrarea  unor servicii pentru partea de server.    GWT este construit deasupra tehnologiilor web, conferindu‐i astfel o mai mare putere.  Această putere provine din faptul că aplicațiile GWT pot rula pe orice tip de browser şi pe mai  multe sisteme de operare, precum şi din faptul că acest gen de aplicații pot fi rulate cu uşurință  pe  mai  multe  calculatoare.  Totuşi,  dezvoltatorii  de  aplicații  care  folosesc  acest  toolkit,  nu  trebuie  să  folosească  direct  tehnologiile  web,  GWT  “ascunzând”  aceste  tehnologii  din  fața 
  • 24. programatorului  prin  folosirea  unei  abstracții  de  genul  unui  framework  ce  foloseşte  limbajul  Java.    7. Comparaţie cu alte framework­uri    Google Web Toolkit nu este primul set de unelte care încearcă să uşureze modalitate de  construcție a aplicațiilor de tip RIA, şi după ritmul de evoluție al tehnologiilor web, este evident  că  nu  va  fi  nici  ultimul.  În  cele  ce  urmează,  se  vor  prezenta  diferențele  dintre  GWT  şi  alte  framework‐uri    din  aceeaşi  categorie,  avându‐se  în  vedere că  fiecare  astfel  de  framework  are  puncte  tari  şi  slabe.  (Diferența  principală  între  GWT  şi  celelate  framework‐uri  existente  este  aceea că folosind GWT, codul pentru partea de browser este scris in Java, nu in JavaScript.)      7.1 GWT vs SWING    Swing  este  toolkit‐ul  standart  pentru  construcția  aplicațiilor  GUI  în  limbajul  Java.  La  o  primă  vedere  s‐ar  putea  afirma  că  nu  este  o  idee  bună  comparația  dintre  acestea  două  deoarece  Swing‐ul  nu  este  asociat  aplicațiilor  web,  însă  analizând  mai  de  aproape  cele  două  framework‐uri, se observă că se aseamănă datorită modalității similare, sau chiar identice, de  scriere a codului. Ceea ce diferă sunt cateva denumiri, cum ar fi numele interfeței ClickListener  din GWT, care are ca echivalentă în Swing, interfața ActionListener.    Pentru programatorii Swing, sunt câteva diferențe importante între GWT şi Swing.   Prima  ar  fi  aceea  că,  componentele  echivalente  cu  cele  din  GWT  nu  respectă  şablonul  de  proiectare MVC. Aceasta înseamnă că nu există un obiect model care să poate fi partiționat de  mai multe componente şi astfel, ele să fie ținute în sincronicitate.   A  doua  diferență  notabilă  este  aceea  că  GWT  nu  foloseşte  managerii  de  afişare  (layout  managers)  pentru organizarea componentelor în interfață. În schimb, GWT foloseşte panel‐uri,  care sunt construite într‐o manieră asemănătoare cu managerii de afişare.  
  • 25.   Aceste  diferențe  minore  fac  din  GWT  un  mediu  de  dezvoltare  destul  de  familiar  dezvoltatorilor de aplicații Swing.      7.2 GWT vs. Echo2    Echo2  este  un  alt  toolkit  popular  în  rândul  dezvoltatorilor  de  aplicații  web  ce  folosesc  limbajul  Java.  Acesta  se  aseamănă  cu  GWT  datorită  modalității  asemănătoare  de  a  construi  interfața  cu  utilizatorul.  Echo2  foloseşte  clasele  din  API  pentru  crearea  de  instanțe  a  componentelor, apoi le adaugă view‐ului.    Deşi  cele  două  framework‐uri  folosesc  API‐uri  similare,  ele  lucrează  în  maniere  total  diferite.   Aplicațiile Echo2 rulează pe server, față de aplicațiile GWT care rulează pe client.   Cu  GWT  codul  sursă  Java  este  compilat  şi  transformat  în  JavaScript  pentru  a  putea  fi  rulat  în  browser, pe când cu Echo2 codul sursă Java este compilat în clase Java apoi este rulat pe server,  această obligând programatorul să trateze pe server eventualele evenimente apărute pe client.  Aceasta duce la consecința de a se face mai multe apeluri la server în Echo2, însă nu este nevoie  de a fi implementat un mecanism de tip RPC, deoarece totul se petrece pe server.   O alta consecintă a modului de funcționare a Echo2, este aceea că nu este nevoie să fie trimis   browser‐ului  tot  codul  JavaScript  rezultat  în  urma  compilării,  ci  doar  ceea  ce  este  nevoie  pentru stadiul curent al aplicației.       7.3 GWT vs JSF    Java  Server  Faces  (JSF)  este  un  framework  pentru  crearea  aplicațiilor  web  bazate  pe  limbajul  Java  în  cadrul căruia  se  folosesc  bean‐uri  pe  server  pentru  reprezentarea  modelului,  plus un set de librării de taguri folosite  în paginile JSP pentru a referi proprietățile modelului.  În implementarea JSF standard, toate procesările sunt făcute de către server, iar paginile web 
  • 26. sunt reîncărcate după fiecare tranzacție, ceea ce nu face ca JSF să fie viabil pentru construirea  componentelor pentru aplicații RIA, însă cu puțin efort este posibil.    Primul pas pentru crearea unei aplicații folosind JSF este să creem clasa care reprezintă  modelul, apoi să înregistrăm în fişierul de configurare acea clasă ca fiind de tip managed‐bean.  Următorul pas este să construim pagina JSP care va reprezenta view‐ul aplicației.    JSF diferă foarte mult de GWT prin faptul că JSF oferă puține avantaje pentru crearea  suportului  pentru  funcționalitatea  pe  partea  de  client  a  unei  aplicații  RIA;  este  posibilă  construcția de componente reutilizabile pentru partea de client apelându‐se la JavaScript, însă  componentele custom au puține şanse de a fi reutilizate. Datorită faptului că JSF integrează şi  partea client, poate fi considerată o tehnologie în competiție cu GWT, însă există şanse ca cele  două să fie integrate.      7.4 GWT vs Ruby on Rails    Acest  titlu  poate  să  ducă  în  eroare  deoarece  GWT  şi  Ruby  on  Rails  (RoR)  nu  se  află  în  competiție cu toate că la unele aspecte se pot suprapune.   Ruby on Rails este un framework care foloseşte limbajul Ruby pentru a implementa partea de  server  a  aplicației,  fiind  special  creat  pentru  a  executa  automat  o  mare  parte  din  munca  din  spate. Pe partea de server,  RoR oferă suport pentru Ajax, permițând să fie folosit în codul HTML  echivalentul  Java  pentru  o  librarie  de  taguri.  Rezultatul  final  este  acela  că  RoR  poate  trimite  informații către server când este declanşată o acțiune a utilizatorului, iar răspunsul este afişat în  pagină. RoR nu este creat pentru tratarea interacțiunilor complexe dintre server şi client.    Analizând puterea celor două limbaje, se poate afirma ca în locul unei competiții dintre  cele  două,  ar  putea  lua  naştere  o  colaborare.  La  această  concluzie  se  poate  ajunge  datorită  faptului ca GWT deține unele avantaje privitoare la mecanismele de transmitere a informațiilor  între  server  şi  client.  S‐a  observat  că  din  ce  în  ce  mai  mulți  programatori  care  folosesc  alte  tehnologii decât Java pe partea de server, sunt mulțumiți de rezultate pe care GWT le oferă  pe partea de client prin integrarea cu alte tehnologii pe partea de server.