SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Downloaden Sie, um offline zu lesen
GWT, Google Web Toolkit
Parte 3: GWT Avanzado




           Manuel Carrasco Moñino
           Seminarios de JavaHispano (16-Abril-2010)
           manolo@apache.org
Testing y Depuración
Ejecutar tests (de Cliente JS)

    Dos modos de ejecución:
        – Desarrollo
                • Se compila la aplicación para HtmlUnit
                • Se ejecuta HtmlUnit y Jetty
                • Run As → GWT Junit Test
        – Producción
                • Se compila la aplicación para el browser por defecto
                • Se ejecuta automáticamente el navegador y Jetty
                • Run As → GWT Junit Test (Production Mode)
Otros modos de Test de cliente

    El resto de modos de Test requieren realizar algunas operaciones en eclipse:

    Lanzar el test en modo junit
         – Run As → Junit Test

    El test fallará porque le falta añadir al classpath los directorios de fuentes
         – Run → Run Configurations → HelloTest → ClassPath → User Entries → Advanced →
                Add Folders → (src y test)

    Probar el test que debe pasar

    Añadir las opciones que deseemos:
         – Run → Run Configurations → HelloTest → xArgument → VMArguments
             Nota: poner las siguientes opciones entre comillas dobles
         – Manual
             -Dgwt.args=-runStyle Manual:1
         – Selenium
             -Dgwt.args=-runStyle Selenium:myhost:4444/*firefox
         – BrowserManagerServer
             -Dgwt.args=-runStyle RemoteWeb:rmi://myhost/ie8
              java -cp gwt-user.jar;gwt-dev.jar 
                 com.google.gwt.junit.remote.BrowserManagerServer 
                ie8 "C:Program FilesInternet ExplorerIEXPLORE.EXE"
Depurar
• La depuración de aplicaciones GWT (cliente) es exactamente igual que para
     cualquier otra aplicación java:
       – Poner puntos de control
       – Debug As → (Web Application | GWT Junit Test | GWT Junit Test
            (Production Mode)
       – Conectar el browser
       – Utilizar la vista de depuración

•   Se puede mezclar depuración del lado cliente con lado servidor.
• Al igual que depurando aplicaciones gráficas, la depuración continúa cuando
     ocurre un evento.

• Recomendación: NO depurar → hacer TDD
El corazón de GWT:
        JSNI
  Deferred Binding
        Ajax
JSNI (JavaScript Native Interface)

• Código Javascript en comentarios java
• Permite utilizar Js dentro de GWT y al revés.
• Usa la declaración 'native' que indica a java que
    ese método se resolverá en tiempo de
    'runtime'
• Los métodos nativos se puede utilizar en los
    IDEs sin que marquen el código con error.
• El compilador GWT lo detecta y lo copia en el
    fichero javascript resultante
• Finalmente se comprime y obfusca junto con el
    resto de código
JSNI
## En este ejemplo exportamos un método creado en GWT y lo dejamos disponible en el objeto Window

public class HelloClass implements EntryPoint{

    String prefix = "Hello: ";

    // Al cargar la aplicacion, exportamos el metodo
    public void onModuleLoad() {
       exportHelloMethod(this);
    }

    // Metodo que queremos usar desde javascript
    public String helloMethod(String name) {
       return prefix + " " + name;
    }

    // JSNI: ponemos nuestro método en el objeto window
    private native void exportHelloMethod(HelloClass instance) /*-{
      $wnd.hello = function(name) {
        return instance.@jschismes.client.HelloClass::helloMethod(Ljava/lang/String;) (name);
      };
    }-*/;
}
Deferred Binding

• Son clases java que no se utilizan hasta el
    momento de compilación
• Se seleccionan diferentes implementaciones
    para cada navegador, lenguage …
• Hace posible el emulador JRE de GWT
• Elimina el código innecesario para cada
    plataforma.
• Es el principal responsable del rendimiento del
    código JS generado por GWT
Deferred Binding
# El modo de establecer la opacidad es diferente en IE y en otros navegadores
class DOM {
  private static CSSImpl cssImpl = GWT.create(CSSImpl.class);
  public void cssClearOpacity(Element e) {
    cssImpl.cssClearOpacity(e.getStyle();
  }
  public native void cssSetOpacity(Element e, double value) {
    cssImpl.cssSetOpacity(e.getStyle(), value;
  }
}

class CSSImpl {                                                                 <replace-with class="[...].CSSImplIE">
  public void cssClearOpacity(Style style) {                                      <when-type-is class="[...].CSSImpl"/>
    style.setProperty("opacity", "");                                             <any>
  }                                                                                <when-property-is name="user.agent" value="ie6"/>
  public native void cssSetOpacity(Style style, double value) {                    <when-property-is name="user.agent" value="ie8"/>
    style.setProperty("opacity", String.ValueOf(value);                           </any>
  }                                                                              </replace-with>
}

class CSSImplIE extends CSSImpl{
  @Override
  public native void cssClearOpacity(Style style) /*-{
   style.filter = '';
  }-*/;
  @Override
  public native void cssSetOpacity(Style style, double value) /*-{
   style.filter = 'alpha(opacity=' + (value * 100) + ')';
  }-*/;
}
AJAX, RPC

• GWT puede hacer llamadas Ajax de 4 tipos
    –   XML
    –   JSON
    –   TEXT o HTML
    –   RPC
• RPC es un contrato entre servidor (java) y cliente.
• Se pasan objetos (pojo) que se puedan serializar.
    – No todos los objetos serializables en JRE son serializables
    – Tienen que ser compatibles con la emulación JRE de GWT.
• En el servidor hay que extender RemoteServiceServlet
• Realmente se transfieren objetos jSON especiales que ambos
   extremos saben convertir en su propia representación de objeto
// Interfaces necesarios (Se ponen en la parte cliente)
      @RemoteServiceRelativePath ("greet")
      public interface GreetingService extends RemoteService {


RPC     String greetServer(String name) throws IllegalArgumentException;
      }

      public interface GreetingServiceAsync {
        void greetServer(String input, AsyncCallback<String> callback)
            throws IllegalArgumentException;
      }

      // Codigo cliente
      public class Hello implements EntryPoint {
        private final GreetingServiceAsync greetingService =
                             GWT.create(GreetingService.class);

        greetingService .greetServer(textToServer, new AsyncCallback<String>() {
          public void onFailure(Throwable caught) {
          }
          public void onSuccess(String result) {
          }
        });
      }

      // Codigo en el servidor
      public class GreetingServiceImpl extends RemoteServiceServlet
             implements GreetingService {
        public String greetServer(String input) throws IllegalArgumentException {
        }
      }



            <web-app>
              <servlet>
                <servlet-name>greetServlet</servlet-name>
                <servlet-class>ws.server.GreetingServiceImpl</servlet-class>
              </servlet>
              <servlet-mapping>
                <servlet-name>greetServlet</servlet-name>
                <url-pattern>/hello/greet</url-pattern>
              </servlet-mapping>
            </web-app>
Inportar proyecto maven en eclipse

    Importar el proyecto maven:
       – File → Import → Maven projects.

    Añadir al proyecto el SDK de GWT

    Especificar la ubicación del directorio web:
       – Properties → Web Application → This project has a WAR →
             directory → src/main/webapp → Mark Launch from this

    Borrar index.html

    Crear index.html con el plugin GWT
        – New → (G) HTML page → index.html → ws.Application
SEO y GWT
SEO
- GWT produce javascript con capacidades muy avanzadas de manejar el DOM
   y de ejecutar Ajax.

- Podemos modificar el comportamiento de una página utilizando javascript
   (progressive enhancement).

- Podemos reaprovechar el código de una funcionaliad añadida en una parte de
   nuestra aplicación en cualquier otra.

- Gquery, es un clon de jquery para Gwt.
   - La versión 0.2-patched es funcional y estable (1.6.x).
    http://gwt-workshop.googlecode.com/svn/trunk/lib/gwtquery-0.2-patched.jar


  - La versión 0.1-SNAPSHOT-patched es funcional (2.0.x), pero la parte de
  efectos es inestable, aunque los selectores y eventos funcionan bien.
    http://gwt-workshop.googlecode.com/svn/trunk/lib/gwtquery-1.0-patched-SNAPSHOT.jar


- Parte del código de Gquery estará en el core de GWT (selectores Css)
GQuery
     $("div.outer > div").css("position", "relative").
        dblclick(new Function() {
          public boolean f(Event e) {
          $("div.outer > div").as(Effects).
             animate("left: '+=100'"). animate("top: '+=100'").
             animate("left: '-=100'"). animate("top: '-=100'");
             }
          });

     $(".note").click(lazy().fadeOut().done());
     $(".note").append(" Hello");
     $("div > div").
           css("color", "blue").
           hover(
            lazy().
               css("color", "red").
               done(), lazy().
               css("color", "blue").
            Done()
           );

     $(".w").before("<button>Click me ...</button>").
            as(Effects).fadeIn();

     $(".w").css($$("border: 'thin double red', padding: '10px',
                     width: '50%', backgroundColor: 'green',
                     position: 'relative'" ));

     $("button").click(doEffect);
  
Creando librerías Js con GWT
- Los objetos, métodos y variables creados con GWT se pasan a JS,
   pero el compilador obfusca estos nombres aleatoriamente de
   manera que es imposible referenciarlos desde javascript.

- GwtExporter permite exportar las clases y métodos que queramos
   con nombres conocidos en tiempo de compilación

- Leer el tutorial:
http://code.google.com/p/gwtchismes/wiki/Tutorial_ExportingGwtLib
   rariesToJavascript_es
Preguntas




            Manuel Carrasco Moñino

               http://manolocarrasco.blogspot.com
                                twitter.com/dodotis

                       manolo@apache.org

Weitere ähnliche Inhalte

Was ist angesagt?

Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Fernando Petrola
 
LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"Alberto Ruibal
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryDavid Arango
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016Agencia INNN
 
Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaAgencia INNN
 
Jobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket
 
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesJobsket
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netAlberto Diaz Martin
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephpbetabeers
 
Gwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrascoGwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrascoManuel Carrasco Moñino
 
El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7Ymbra
 
primefaces cortesia del portal de java
primefaces cortesia del portal de javaprimefaces cortesia del portal de java
primefaces cortesia del portal de javaSalvador Olivares
 
Configurar entorno Android
Configurar entorno AndroidConfigurar entorno Android
Configurar entorno Androidjubacalo
 

Was ist angesagt? (20)

Introduccion silverlight
Introduccion silverlightIntroduccion silverlight
Introduccion silverlight
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014
 
LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQuery
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016
 
Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevilla
 
Jobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket Spring 2GX Madrid
Jobsket Spring 2GX Madrid
 
Taller Grails
Taller GrailsTaller Grails
Taller Grails
 
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Gwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrascoGwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrasco
 
El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7
 
Charla
CharlaCharla
Charla
 
Introducción a las Progressive web apps
Introducción a las Progressive web appsIntroducción a las Progressive web apps
Introducción a las Progressive web apps
 
Semana 2 Configuración entorno de desarrollo
Semana 2   Configuración entorno de desarrolloSemana 2   Configuración entorno de desarrollo
Semana 2 Configuración entorno de desarrollo
 
Qtjambi
QtjambiQtjambi
Qtjambi
 
Javascript
JavascriptJavascript
Javascript
 
primefaces cortesia del portal de java
primefaces cortesia del portal de javaprimefaces cortesia del portal de java
primefaces cortesia del portal de java
 
Configurar entorno Android
Configurar entorno AndroidConfigurar entorno Android
Configurar entorno Android
 

Ähnlich wie Gwt III - Avanzado

Ähnlich wie Gwt III - Avanzado (20)

Prueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriverPrueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriver
 
Taller de Jquery
Taller de JqueryTaller de Jquery
Taller de Jquery
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipster
 
Unit Testing - GTUG
Unit Testing - GTUGUnit Testing - GTUG
Unit Testing - GTUG
 
Grails
GrailsGrails
Grails
 
Introducción a AngularJS
Introducción a AngularJS Introducción a AngularJS
Introducción a AngularJS
 
Jdbc
JdbcJdbc
Jdbc
 
En 20 minutos ... jQuery
En 20 minutos ... jQueryEn 20 minutos ... jQuery
En 20 minutos ... jQuery
 
Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6
 
Ajax
AjaxAjax
Ajax
 
ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JS
 
(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery
 
APIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptxAPIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptx
 
Introducción a JQuery
Introducción a JQueryIntroducción a JQuery
Introducción a JQuery
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
 
Construccion a través de compontes
Construccion a través de compontesConstruccion a través de compontes
Construccion a través de compontes
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Faces
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
 
Introducción a Flask
Introducción a FlaskIntroducción a Flask
Introducción a Flask
 

Mehr von Manuel Carrasco Moñino

Present and Future of GWT from a developer perspective
Present and Future of GWT from a developer perspectivePresent and Future of GWT from a developer perspective
Present and Future of GWT from a developer perspectiveManuel Carrasco Moñino
 
Web Components the best marriage for a PWA
Web Components the best marriage for a PWAWeb Components the best marriage for a PWA
Web Components the best marriage for a PWAManuel Carrasco Moñino
 
Intro to Web Components, Polymer & Vaadin Elements
Intro to Web Components, Polymer & Vaadin ElementsIntro to Web Components, Polymer & Vaadin Elements
Intro to Web Components, Polymer & Vaadin ElementsManuel Carrasco Moñino
 
GwtQuery the perfect companion for GWT, GWT.create 2013
GwtQuery the perfect companion for GWT,  GWT.create 2013GwtQuery the perfect companion for GWT,  GWT.create 2013
GwtQuery the perfect companion for GWT, GWT.create 2013Manuel Carrasco Moñino
 
Rapid and Reliable Developing with HTML5 & GWT
Rapid and Reliable Developing with HTML5 & GWTRapid and Reliable Developing with HTML5 & GWT
Rapid and Reliable Developing with HTML5 & GWTManuel Carrasco Moñino
 
GQuery a jQuery clone for Gwt, RivieraDev 2011
GQuery a jQuery clone for Gwt, RivieraDev 2011GQuery a jQuery clone for Gwt, RivieraDev 2011
GQuery a jQuery clone for Gwt, RivieraDev 2011Manuel Carrasco Moñino
 
GWT: Why GWT, GQuery, and RequestFactory
GWT: Why GWT, GQuery, and RequestFactoryGWT: Why GWT, GQuery, and RequestFactory
GWT: Why GWT, GQuery, and RequestFactoryManuel Carrasco Moñino
 

Mehr von Manuel Carrasco Moñino (20)

The Java alternative to Javascript
The Java alternative to JavascriptThe Java alternative to Javascript
The Java alternative to Javascript
 
GWT and PWA
GWT and PWAGWT and PWA
GWT and PWA
 
Present and Future of GWT from a developer perspective
Present and Future of GWT from a developer perspectivePresent and Future of GWT from a developer perspective
Present and Future of GWT from a developer perspective
 
GWT Contributor Workshop
GWT Contributor WorkshopGWT Contributor Workshop
GWT Contributor Workshop
 
CRUD with Polymer 2.0
CRUD with Polymer 2.0CRUD with Polymer 2.0
CRUD with Polymer 2.0
 
Web Components and PWA
Web Components and PWAWeb Components and PWA
Web Components and PWA
 
Building Components for Business Apps
Building Components for Business AppsBuilding Components for Business Apps
Building Components for Business Apps
 
Web Components the best marriage for a PWA
Web Components the best marriage for a PWAWeb Components the best marriage for a PWA
Web Components the best marriage for a PWA
 
Intro to Web Components, Polymer & Vaadin Elements
Intro to Web Components, Polymer & Vaadin ElementsIntro to Web Components, Polymer & Vaadin Elements
Intro to Web Components, Polymer & Vaadin Elements
 
Rock GWT UI's with Polymer Elements
Rock GWT UI's with Polymer ElementsRock GWT UI's with Polymer Elements
Rock GWT UI's with Polymer Elements
 
Introducing GWT Polymer (vaadin)
Introducing GWT Polymer (vaadin)Introducing GWT Polymer (vaadin)
Introducing GWT Polymer (vaadin)
 
Speed up your GWT coding with gQuery
Speed up your GWT coding with gQuerySpeed up your GWT coding with gQuery
Speed up your GWT coding with gQuery
 
Vaadin codemotion 2014
Vaadin codemotion 2014Vaadin codemotion 2014
Vaadin codemotion 2014
 
GwtQuery the perfect companion for GWT, GWT.create 2013
GwtQuery the perfect companion for GWT,  GWT.create 2013GwtQuery the perfect companion for GWT,  GWT.create 2013
GwtQuery the perfect companion for GWT, GWT.create 2013
 
Rapid and Reliable Developing with HTML5 & GWT
Rapid and Reliable Developing with HTML5 & GWTRapid and Reliable Developing with HTML5 & GWT
Rapid and Reliable Developing with HTML5 & GWT
 
Aprendiendo GWT
Aprendiendo GWTAprendiendo GWT
Aprendiendo GWT
 
GQuery a jQuery clone for Gwt, RivieraDev 2011
GQuery a jQuery clone for Gwt, RivieraDev 2011GQuery a jQuery clone for Gwt, RivieraDev 2011
GQuery a jQuery clone for Gwt, RivieraDev 2011
 
Apache James/Hupa & GWT
Apache James/Hupa & GWTApache James/Hupa & GWT
Apache James/Hupa & GWT
 
GWT: Why GWT, GQuery, and RequestFactory
GWT: Why GWT, GQuery, and RequestFactoryGWT: Why GWT, GQuery, and RequestFactory
GWT: Why GWT, GQuery, and RequestFactory
 
Mod security
Mod securityMod security
Mod security
 

Gwt III - Avanzado

  • 1. GWT, Google Web Toolkit Parte 3: GWT Avanzado Manuel Carrasco Moñino Seminarios de JavaHispano (16-Abril-2010) manolo@apache.org
  • 3. Ejecutar tests (de Cliente JS)  Dos modos de ejecución: – Desarrollo • Se compila la aplicación para HtmlUnit • Se ejecuta HtmlUnit y Jetty • Run As → GWT Junit Test – Producción • Se compila la aplicación para el browser por defecto • Se ejecuta automáticamente el navegador y Jetty • Run As → GWT Junit Test (Production Mode)
  • 4. Otros modos de Test de cliente  El resto de modos de Test requieren realizar algunas operaciones en eclipse:  Lanzar el test en modo junit – Run As → Junit Test  El test fallará porque le falta añadir al classpath los directorios de fuentes – Run → Run Configurations → HelloTest → ClassPath → User Entries → Advanced → Add Folders → (src y test)  Probar el test que debe pasar  Añadir las opciones que deseemos: – Run → Run Configurations → HelloTest → xArgument → VMArguments Nota: poner las siguientes opciones entre comillas dobles – Manual -Dgwt.args=-runStyle Manual:1 – Selenium -Dgwt.args=-runStyle Selenium:myhost:4444/*firefox – BrowserManagerServer -Dgwt.args=-runStyle RemoteWeb:rmi://myhost/ie8 java -cp gwt-user.jar;gwt-dev.jar com.google.gwt.junit.remote.BrowserManagerServer ie8 "C:Program FilesInternet ExplorerIEXPLORE.EXE"
  • 5. Depurar • La depuración de aplicaciones GWT (cliente) es exactamente igual que para cualquier otra aplicación java: – Poner puntos de control – Debug As → (Web Application | GWT Junit Test | GWT Junit Test (Production Mode) – Conectar el browser – Utilizar la vista de depuración • Se puede mezclar depuración del lado cliente con lado servidor. • Al igual que depurando aplicaciones gráficas, la depuración continúa cuando ocurre un evento. • Recomendación: NO depurar → hacer TDD
  • 6. El corazón de GWT: JSNI Deferred Binding Ajax
  • 7. JSNI (JavaScript Native Interface) • Código Javascript en comentarios java • Permite utilizar Js dentro de GWT y al revés. • Usa la declaración 'native' que indica a java que ese método se resolverá en tiempo de 'runtime' • Los métodos nativos se puede utilizar en los IDEs sin que marquen el código con error. • El compilador GWT lo detecta y lo copia en el fichero javascript resultante • Finalmente se comprime y obfusca junto con el resto de código
  • 8. JSNI ## En este ejemplo exportamos un método creado en GWT y lo dejamos disponible en el objeto Window public class HelloClass implements EntryPoint{ String prefix = "Hello: "; // Al cargar la aplicacion, exportamos el metodo public void onModuleLoad() { exportHelloMethod(this); } // Metodo que queremos usar desde javascript public String helloMethod(String name) { return prefix + " " + name; } // JSNI: ponemos nuestro método en el objeto window private native void exportHelloMethod(HelloClass instance) /*-{ $wnd.hello = function(name) { return instance.@jschismes.client.HelloClass::helloMethod(Ljava/lang/String;) (name); }; }-*/; }
  • 9. Deferred Binding • Son clases java que no se utilizan hasta el momento de compilación • Se seleccionan diferentes implementaciones para cada navegador, lenguage … • Hace posible el emulador JRE de GWT • Elimina el código innecesario para cada plataforma. • Es el principal responsable del rendimiento del código JS generado por GWT
  • 10. Deferred Binding # El modo de establecer la opacidad es diferente en IE y en otros navegadores class DOM { private static CSSImpl cssImpl = GWT.create(CSSImpl.class); public void cssClearOpacity(Element e) { cssImpl.cssClearOpacity(e.getStyle(); } public native void cssSetOpacity(Element e, double value) { cssImpl.cssSetOpacity(e.getStyle(), value; } } class CSSImpl { <replace-with class="[...].CSSImplIE"> public void cssClearOpacity(Style style) { <when-type-is class="[...].CSSImpl"/> style.setProperty("opacity", ""); <any> } <when-property-is name="user.agent" value="ie6"/> public native void cssSetOpacity(Style style, double value) { <when-property-is name="user.agent" value="ie8"/> style.setProperty("opacity", String.ValueOf(value); </any> } </replace-with> } class CSSImplIE extends CSSImpl{ @Override public native void cssClearOpacity(Style style) /*-{ style.filter = ''; }-*/; @Override public native void cssSetOpacity(Style style, double value) /*-{ style.filter = 'alpha(opacity=' + (value * 100) + ')'; }-*/; }
  • 11. AJAX, RPC • GWT puede hacer llamadas Ajax de 4 tipos – XML – JSON – TEXT o HTML – RPC • RPC es un contrato entre servidor (java) y cliente. • Se pasan objetos (pojo) que se puedan serializar. – No todos los objetos serializables en JRE son serializables – Tienen que ser compatibles con la emulación JRE de GWT. • En el servidor hay que extender RemoteServiceServlet • Realmente se transfieren objetos jSON especiales que ambos extremos saben convertir en su propia representación de objeto
  • 12. // Interfaces necesarios (Se ponen en la parte cliente) @RemoteServiceRelativePath ("greet") public interface GreetingService extends RemoteService { RPC   String greetServer(String name) throws IllegalArgumentException; } public interface GreetingServiceAsync {   void greetServer(String input, AsyncCallback<String> callback)       throws IllegalArgumentException; } // Codigo cliente public class Hello implements EntryPoint {   private final GreetingServiceAsync greetingService = GWT.create(GreetingService.class);   greetingService .greetServer(textToServer, new AsyncCallback<String>() {     public void onFailure(Throwable caught) {     }     public void onSuccess(String result) {     }   }); } // Codigo en el servidor public class GreetingServiceImpl extends RemoteServiceServlet        implements GreetingService {   public String greetServer(String input) throws IllegalArgumentException {   } } <web-app> <servlet> <servlet-name>greetServlet</servlet-name> <servlet-class>ws.server.GreetingServiceImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>greetServlet</servlet-name> <url-pattern>/hello/greet</url-pattern> </servlet-mapping> </web-app>
  • 13. Inportar proyecto maven en eclipse  Importar el proyecto maven: – File → Import → Maven projects.  Añadir al proyecto el SDK de GWT  Especificar la ubicación del directorio web: – Properties → Web Application → This project has a WAR → directory → src/main/webapp → Mark Launch from this  Borrar index.html  Crear index.html con el plugin GWT – New → (G) HTML page → index.html → ws.Application
  • 15. SEO - GWT produce javascript con capacidades muy avanzadas de manejar el DOM y de ejecutar Ajax. - Podemos modificar el comportamiento de una página utilizando javascript (progressive enhancement). - Podemos reaprovechar el código de una funcionaliad añadida en una parte de nuestra aplicación en cualquier otra. - Gquery, es un clon de jquery para Gwt. - La versión 0.2-patched es funcional y estable (1.6.x). http://gwt-workshop.googlecode.com/svn/trunk/lib/gwtquery-0.2-patched.jar - La versión 0.1-SNAPSHOT-patched es funcional (2.0.x), pero la parte de efectos es inestable, aunque los selectores y eventos funcionan bien. http://gwt-workshop.googlecode.com/svn/trunk/lib/gwtquery-1.0-patched-SNAPSHOT.jar - Parte del código de Gquery estará en el core de GWT (selectores Css)
  • 16. GQuery     $("div.outer > div").css("position", "relative"). dblclick(new Function() {          public boolean f(Event e) {          $("div.outer > div").as(Effects).             animate("left: '+=100'"). animate("top: '+=100'").             animate("left: '-=100'"). animate("top: '-=100'"); }          }); $(".note").click(lazy().fadeOut().done());     $(".note").append(" Hello");     $("div > div"). css("color", "blue"). hover( lazy(). css("color", "red"). done(), lazy(). css("color", "blue"). Done() );     $(".w").before("<button>Click me ...</button>"). as(Effects).fadeIn(); $(".w").css($$("border: 'thin double red', padding: '10px', width: '50%', backgroundColor: 'green', position: 'relative'" )); $("button").click(doEffect);  
  • 17. Creando librerías Js con GWT - Los objetos, métodos y variables creados con GWT se pasan a JS, pero el compilador obfusca estos nombres aleatoriamente de manera que es imposible referenciarlos desde javascript. - GwtExporter permite exportar las clases y métodos que queramos con nombres conocidos en tiempo de compilación - Leer el tutorial: http://code.google.com/p/gwtchismes/wiki/Tutorial_ExportingGwtLib rariesToJavascript_es
  • 18. Preguntas Manuel Carrasco Moñino http://manolocarrasco.blogspot.com twitter.com/dodotis manolo@apache.org