SlideShare una empresa de Scribd logo
1 de 26
Descargar para leer sin conexión
GWT, Google Web Toolkit
Parte 2: Trabajando con GWT




           Manuel Carrasco Moñino
           Seminarios de JavaHispano (16-Abril-2010)
           manolo@apache.org
Estructura de un Proyecto GWT.
Estructura del proyecto
                
                    src/.../client: código para el
                    navegador
                
                    src/.../public: html, css, img ...
                
                    src/.../server: código para el
                    servidor
                
                    [project].gwt.xml: configuración
                
                    test/.../client: tests de cliente
                
                    test/.../server: tests java
                
                    war/ cosas de despliegue
                         – war/lib
                         – war/WEB-INF
Pasos para crear un proyecto

1. Crea un nuevo proyecto
2. Configura el módulo
3. Crea tu página html y pon la llamada JS
4. Desarrolla en java: cliente, servidor, RPC
5. No olvides Testear: GWTTestCase
6. Prueba y depura: DevMode + Browser + Plugin
7. Compila a JS
8. Despliega
9. Olvidaté de versionado, optimización,
  obfuscación, caché, refactoring, reusing ...
Crear el proyecto
$ ~/gwt-current/webAppCreator -help
Google Web Toolkit 2.0.3
WebAppCreator [-overwrite] [-ignore] [-out dir] [-junit pathToJUnitJar] moduleName

where
 -overwrite Overwrite any existing files
 -ignore Ignore any existing files; do not overwrite
 -out     The directory to write output files into (defaults to current)
 -junit   Specifies the path to your junit.jar (optional)
and
 moduleName The name of the module to create (e.g. com.example.myapp.MyApp)

$ ~/gwt-current/webAppCreator 
     -junit mylibs/junit-4.3.jar 
     -overwrite 
     -out Hello 
     com.foo.Hello
Created directory Hello/src
Created directory Hello/war
Created directory Hello/war/WEB-INF
[…]
Configurar el módulo
<module rename-to=”hola” >
 <!-- Librerias en el cliente -->
 <inherits name='com.google.gwt.user.User'/>
 <inherits name="com.google.code.p.gwtchismes.GWTChismes" />

  <!-- Clase(s) a cargar en la inicialización -->
  <entry-point class='com.foo.Hello'/>
  <!-- Hojas de estilo -->
  <stylesheet src="JsUpload.css"/>
  <!-- Propiedades específicas de módulos importados -->
  <set-property name="export" value="yes" />
  <!-- Lenguajes -->
  <!-- <extend-property name="locale" values="es" /> -->
  <!-- Linker std, xs, … -->
  <!-- <add-linker name="xs"/> →
  <!-- Deferred binding, … -->
 <replace-with class="com.foo.MyClassIE">
   <when-type-is class="com.foo.MyClass"/>
   <any>
   <when-property-is name="user.agent" value="ie6"/>
   <when-property-is name="user.agent" value="ie8"/>
  </any>
  </replace-with>
</module>
Página html de la aplicación
<!-- Hacer la llamada al fichero de javascript generado para nuestra aplicación
     en cualquier fichero estático o dinámico. -->

<html>
 <head>
 </head>
 <body>
    <!-- Llamada a nuestra aplicación -->
    <script id="ID" type="text/javascript" language="javascript"
      src="com.foo.Hello.js?123&provider=1">
    </script>

     <!-- Necesario si queremos tener historia -->
     <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1'
       style="position:absolute;width:0;height:0;border:0"></iframe>

     <!-- Se puede poner todo el contenido html que queramos y manipularlo -->
     <h1>Hello</h1>

    <!-- GWT no es intrusivo, se puede utilizar cualquier otra librería/s js -->
    <script id="ID" type="text/javascript" language="javascript"
      src="jquery.js">
    </script>
 </body>
</html>
Trabajar en Java

- El método EntryPoint se llama cuando la aplicación se carga en el navegador

- GWT.create permite asociación aplazada de clases 'deferred binding'

- La clase DOM sirve para manejar elementos de navegador


package com.foo.client;
import [...]
public class Hello implements EntryPoint {
  // This method is called whenever the browser loads the page
  public void onModuleLoad() {
     MyClass impl = GWT.create(MyClass.class);
     DOM.getElementById("id").getStyle().setProperty("display", "none");
  }
}
¿Qué obtenemos al Compilar?

## Único Fichero a incluir en el HTML
## Se encarga de detectar browser/lang y cargar el fichero de aplicacion adecuado
## No se debe cachear
com.foo.Hello.nocache.js
## Cada fichero para la combinación browser/language
## Se pueden generar ficheros '.js' o '.html' dependiendo del linker
## cross-site (xs), standard (std)
## Se puede cachear
1102DEF681997CEB9DDF55DEA52DAC77.cache.js (ó .html)
35041D1CDE8A3F7BA84E28F014AD7763.cache.js
855ACC0BD175268F9BFBDDD1AC46D60C.cache.js
BCAE487AACB322FA340C97DFE205CF9C.cache.js
EAB3A6766FC64B8FB876749E68EF311D.cache.js
## Definición de llamadas rpc
DACD019E1AB65BD2BCAC2F7BD9DB85F2.gwt.rpc
## Ficheros estáticos
clear.cache.gif
Hello.css
history.html
Hello.css
Hello.html
images/
¿Cómo es el JS generado?

### Compilando con el parámetro -style PRETTY
function getStylePrimaryName(elem){
 var fullClassName, spaceIdx;
 fullClassName = elem['className'] == null?null:String(elem['className']);
 spaceIdx = fullClassName.indexOf(fromCodePoint(32));
 if (spaceIdx >= 0) {
   return fullClassName.substr(0, spaceIdx - 0);
 }
 return fullClassName;
}

function removeStyleName_0(style){
 setStyleName_0(this.getStyleElement(), style, false);
}

### Por defecto -style OBFUSCATED
_=gB.prototype=new zdb();_.gC=lB;_.tI=22;function tB(f,d){var a,b,c,e,g;for(b=0;b<d.length;+
   +b){c=fi+(d[b]!=null?d[b]:fi);a=sx+b+ux;for(;;)
   {e=f.indexOf(a);if(e<0)break;g=fi;if(e+a.length<f.length)g=gMb(f,e+a.length);f=f.substr(0,e-
   0)+c+g}}return f}
function mC(c,a,d){var b;b=d>0?~~(a*100/d):0;nC(c,b,a,d)}
Usar la caché de cliente
### Configuración Apache para GWT
ExpiresActive on
ExpiresDefault "now plus 2 hours"

# Dont cache the main file (browser and locale detector, and application file selector)
# ie: com.miraiespana.home.gwt.Home.nocache.js
<Files ~ *.nocache.*>
ExpiresDefault "now plus 2 minutes"
Header set Cache-Control "no-store,must-revalidate"
AddOutputFilter DEFLATE
</Files>

# Cache the application files
# ie: 1102DEF681997CEB9DDF55DEA52DAC77.cache.js
<Files ~ *.cache.*>
ExpiresDefault "now plus 2 years"
Header set Cache-Control "max-age=290304000,public"
</Files>
GWT y Eclipse
Plugin de google para eclipse

    El plugin incluye:
        – Asistente para creación de proyectos.
        – Servidor y Lanzador de aplicaciones
        – Lanzador de Tests
        – SDK para GWT
        – SDK para GAE


    Web oficial:
      – http:http://code.google.com/eclipse/
Plugin para Navegadores
   Para depurar y trabajar en modo desarrollo es necesario añadir a nuestro
    navegador el plugin para GWT
   Existen plugins para:
       – FF
       – Chrome
       – IE

   ¿Cómo funciona?
       – GWT compila la aplicación a javascript añadiendo cierta información de
           control.
       – Se utiliza un canal de comunicación entre el plugin del browser y el
           modo de desarrollo de GWT (integrado en eclipse)
       – Eclipse interacciona con el usuario mostrando las líneas de código y con
           el navegador y respetando los puntos de control
Importar un proyecto a Eclipse

    File → Import → Existing projects into workspace → Browse
Añadirlo al plugin GWT

    Properties → Google → Web Toolkit → Use GWT
Verificar 'Build Path'

    Properties → Java Build Path → Add Library …
        – (añadir GWT SDK y eliminar gwt*jar)
Ejecutar en modo desarrollo

    Borrar ficheros *.launch (ya no son necesarios con el plugin)

    Run As → Web Application

    Abrir la URL indicada en el Navegador (si no tiene el plugin preguntará).
Builders: Ant y Maven
Ant

    Los proyectos GWT para 'ant' se crean con la herramienta
    webAppCreator

    Se genera un fichero build.xml con las tareas de:
        – Ejecutar Tests
               • test.dev (HtmlUnit)
               • test.prod (Browser)
        – Ejecutar en Modo desarrollo
               • devmode
        – Compilar las clases java
               • javac
               • javac.tests
        – Compilar el código java a javascript
               • gwtc
        – Producir el fichero de la aplicación empaquetado
               • war
Maven

    Aunque hay varios plugins para maven, se debe usar el alojado en codehaus
    http://mojo.codehaus.org/gwt-maven-plugin/.
   Se necesita maven 2.2.x para que funcione.

    Existe un arquetipo para crear un proyecto GWT:
       –   mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo 
            -DarchetypeArtifactId=gwt-maven-plugin -DarchetypeVersion=1.1 
            -DgroupId=ws -DartifactId=GwtWsHelloWorld

       –   Después editar el fichero pom.xml y hacer estas modificaciones
                   <gwt.version>2.0.3</gwt.version>
                   [...]
                   <plugin>
                         <groupId>org.codehaus.mojo</groupId>
                         <artifactId>gwt-maven-plugin</artifactId>
                          <configuration>
                                 <runTarget>myGroupId.Application/Application.html</runTarget>
                          </configuration>
                         <executions>
                          <execution>
                            <phase>prepare-package</phase>
                            <goals>
                                 <goal>compile</goal>
                            </goals>
                          </execution>
                         </executions>
                   </plugin>
Maven

    Goles:
        – 'mvn gwt:run' ejecutar el modo desarrollo
        – 'mvn gwt:compile' compilar a javascript

    El resto de goles Gwt no funcionan o no son necesarios

    A partir de ahora podemos utilizar maven como en cualquier otro
       proyecto java:
        – 'mvn clean test package emma:emma site' …


    Nota: la instrumentalización de cobertura para tests GWT sólo
      funciona con Emma.


    Importar el proyecto en eclipse como un proyecto maven con el
      plugin m2eclipse de sonatype
Librerías y dependencias
Estructura de las librerías GWT

•   Crear un módulo (normalmente sin entryPoint)
•   Crear código Java
•   Añadir elementos estáticos
•   Generar un fichero jar que incluya:
      –   Código Fuente *.java
      –   Elementos Públicos (css, jpg ...)
      –   Fichero de Módulo *.gwt.xml
      –   Clases compiladas *.class
      –   META-INF/MANIFEST.MF
• Conclusión: igual que en java
      – Se puede utilizar maven
      – Se puede utilizar ant
Cómo se usan la Librerías GWT

• Añadir el fichero .jar al classpath
• Heredar el módulo de la librería en nuestro módulo.

  Incluir librerías que no se utilizan sólo penaliza el tiempo de compilación,
  porque todo el código no usado será descartado de nuestro javascript
  final.


## Hello.gwt.xml
<module rename-to=”hola” >
 […]

 <!-- Módulo/s que la librería provee -->
 <inherits name="com.google.code.p.gwtchismes.GWTChismes" />
 <!-- Otras cosas necesarias para usar la librería -->
 <stylesheet src="GWTC-compressed.css"/>

  […]
</module>
Preguntas




            Manuel Carrasco Moñino

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

                       manolo@apache.org

Más contenido relacionado

La actualidad más candente

Vue.js: El framework javascript para muggles
Vue.js: El framework javascript para mugglesVue.js: El framework javascript para muggles
Vue.js: El framework javascript para mugglesJuan Rodríguez
 
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
 
Curso CDA: Seguridade e rendemento en Drupal
Curso CDA: Seguridade e rendemento en DrupalCurso CDA: Seguridade e rendemento en Drupal
Curso CDA: Seguridade e rendemento en DrupalAlberto Permuy Leal
 
El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7Ymbra
 
Gwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrascoGwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrascoManuel Carrasco Moñino
 
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallosTesteando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallosMicael Gallego
 
GWT y SmartGWT - Introducción
GWT y SmartGWT - IntroducciónGWT y SmartGWT - Introducción
GWT y SmartGWT - IntroducciónVLASLOV
 
El universo JavaScript en Drupal 8
El universo JavaScript en Drupal 8El universo JavaScript en Drupal 8
El universo JavaScript en Drupal 8Ymbra
 
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
 
Polymer de un vistazo
Polymer de un vistazoPolymer de un vistazo
Polymer de un vistazoLuis Recio
 
[ES] Primeros pasos con Maven
[ES] Primeros pasos con Maven[ES] Primeros pasos con Maven
[ES] Primeros pasos con MavenEudris Cabrera
 

La actualidad más candente (20)

Vue.js: El framework javascript para muggles
Vue.js: El framework javascript para mugglesVue.js: El framework javascript para muggles
Vue.js: El framework javascript para muggles
 
Desarrollo de aplicaciones web con Google Web Toolkit
Desarrollo de aplicaciones web con Google Web ToolkitDesarrollo de aplicaciones web con Google Web Toolkit
Desarrollo de aplicaciones web con Google Web Toolkit
 
Google Web Toolkit
Google Web ToolkitGoogle Web Toolkit
Google Web Toolkit
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014
 
Curso CDA: Seguridade e rendemento en Drupal
Curso CDA: Seguridade e rendemento en DrupalCurso CDA: Seguridade e rendemento en Drupal
Curso CDA: Seguridade e rendemento en Drupal
 
El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7
 
Introduccion silverlight
Introduccion silverlightIntroduccion silverlight
Introduccion silverlight
 
Gutenberg sin miedo
Gutenberg sin miedoGutenberg sin miedo
Gutenberg sin miedo
 
Gwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrascoGwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrasco
 
Desarrollo de aplicaciones AJAX con GWT
Desarrollo de aplicaciones AJAX con GWTDesarrollo de aplicaciones AJAX con GWT
Desarrollo de aplicaciones AJAX con GWT
 
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallosTesteando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
 
Aprendiendo GWT
Aprendiendo GWTAprendiendo GWT
Aprendiendo GWT
 
GWT y SmartGWT - Introducción
GWT y SmartGWT - IntroducciónGWT y SmartGWT - Introducción
GWT y SmartGWT - Introducción
 
El universo JavaScript en Drupal 8
El universo JavaScript en Drupal 8El universo JavaScript en Drupal 8
El universo JavaScript en Drupal 8
 
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
 
Introducción a VueJS
Introducción a VueJSIntroducción a VueJS
Introducción a VueJS
 
Polymer de un vistazo
Polymer de un vistazoPolymer de un vistazo
Polymer de un vistazo
 
Desarrollo de aplicaciones Web 2.0 Google Web Toolkit
Desarrollo de aplicaciones Web 2.0 Google Web ToolkitDesarrollo de aplicaciones Web 2.0 Google Web Toolkit
Desarrollo de aplicaciones Web 2.0 Google Web Toolkit
 
[ES] Primeros pasos con Maven
[ES] Primeros pasos con Maven[ES] Primeros pasos con Maven
[ES] Primeros pasos con Maven
 
Curso CDA: Drush CLI Drupal
Curso CDA: Drush CLI DrupalCurso CDA: Drush CLI Drupal
Curso CDA: Drush CLI Drupal
 

Similar a Gwt II - trabajando con gwt

Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Micael Gallego
 
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLabFIB
 
Taller integracion jsf spring
Taller integracion jsf springTaller integracion jsf spring
Taller integracion jsf springIBM
 
Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Micael Gallego
 
Test Unitarios y E2E front y Back
Test Unitarios y E2E front y BackTest Unitarios y E2E front y Back
Test Unitarios y E2E front y BackEric Zeidan
 
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 6Gabriela Bosetti
 
Presentación Spring Boot en Autentia
Presentación Spring Boot en AutentiaPresentación Spring Boot en Autentia
Presentación Spring Boot en AutentiaJorge Pacheco Mengual
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterAdolfo Sanz De Diego
 
Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18Young Suk Ahn Park
 
Continuous Integration
Continuous Integration Continuous Integration
Continuous Integration jose diaz
 
Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesDani Latorre
 
Taller mobile by trustparency
Taller mobile by trustparencyTaller mobile by trustparency
Taller mobile by trustparencytrustparency
 
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 WebDriverDavid Gómez García
 
Proyectos JAVA con maven
Proyectos JAVA con mavenProyectos JAVA con maven
Proyectos JAVA con mavenJuan Vladimir
 

Similar a Gwt II - trabajando con gwt (20)

Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
 
S8-DS2.pptx
S8-DS2.pptxS8-DS2.pptx
S8-DS2.pptx
 
Gestión de proyectos con Maven
Gestión de proyectos con MavenGestión de proyectos con Maven
Gestión de proyectos con Maven
 
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
 
Taller integracion jsf spring
Taller integracion jsf springTaller integracion jsf spring
Taller integracion jsf spring
 
Herramientas Java
Herramientas JavaHerramientas Java
Herramientas Java
 
Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019
 
Test Unitarios y E2E front y Back
Test Unitarios y E2E front y BackTest Unitarios y E2E front y Back
Test Unitarios y E2E front y Back
 
JqueryMobile
JqueryMobile JqueryMobile
JqueryMobile
 
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
 
Presentación Spring Boot en Autentia
Presentación Spring Boot en AutentiaPresentación Spring Boot en Autentia
Presentación Spring Boot en Autentia
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipster
 
Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18
 
Guia jQuery INCES Militar - Kurt Gude
Guia jQuery INCES Militar - Kurt GudeGuia jQuery INCES Militar - Kurt Gude
Guia jQuery INCES Militar - Kurt Gude
 
Continuous Integration
Continuous Integration Continuous Integration
Continuous Integration
 
Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernes
 
Taller mobile by trustparency
Taller mobile by trustparencyTaller mobile by trustparency
Taller mobile by trustparency
 
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
 
Introduccion a Node.js
Introduccion a Node.jsIntroduccion a Node.js
Introduccion a Node.js
 
Proyectos JAVA con maven
Proyectos JAVA con mavenProyectos JAVA con maven
Proyectos JAVA con maven
 

Más de 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
 

Más de 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
 
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 IV -mvp
Gwt IV -mvpGwt IV -mvp
Gwt IV -mvp
 

Gwt II - trabajando con gwt

  • 1. GWT, Google Web Toolkit Parte 2: Trabajando con GWT Manuel Carrasco Moñino Seminarios de JavaHispano (16-Abril-2010) manolo@apache.org
  • 2. Estructura de un Proyecto GWT.
  • 3. Estructura del proyecto  src/.../client: código para el navegador  src/.../public: html, css, img ...  src/.../server: código para el servidor  [project].gwt.xml: configuración  test/.../client: tests de cliente  test/.../server: tests java  war/ cosas de despliegue – war/lib – war/WEB-INF
  • 4. Pasos para crear un proyecto 1. Crea un nuevo proyecto 2. Configura el módulo 3. Crea tu página html y pon la llamada JS 4. Desarrolla en java: cliente, servidor, RPC 5. No olvides Testear: GWTTestCase 6. Prueba y depura: DevMode + Browser + Plugin 7. Compila a JS 8. Despliega 9. Olvidaté de versionado, optimización, obfuscación, caché, refactoring, reusing ...
  • 5. Crear el proyecto $ ~/gwt-current/webAppCreator -help Google Web Toolkit 2.0.3 WebAppCreator [-overwrite] [-ignore] [-out dir] [-junit pathToJUnitJar] moduleName where -overwrite Overwrite any existing files -ignore Ignore any existing files; do not overwrite -out The directory to write output files into (defaults to current) -junit Specifies the path to your junit.jar (optional) and moduleName The name of the module to create (e.g. com.example.myapp.MyApp) $ ~/gwt-current/webAppCreator -junit mylibs/junit-4.3.jar -overwrite -out Hello com.foo.Hello Created directory Hello/src Created directory Hello/war Created directory Hello/war/WEB-INF […]
  • 6. Configurar el módulo <module rename-to=”hola” > <!-- Librerias en el cliente --> <inherits name='com.google.gwt.user.User'/> <inherits name="com.google.code.p.gwtchismes.GWTChismes" /> <!-- Clase(s) a cargar en la inicialización --> <entry-point class='com.foo.Hello'/> <!-- Hojas de estilo --> <stylesheet src="JsUpload.css"/> <!-- Propiedades específicas de módulos importados --> <set-property name="export" value="yes" /> <!-- Lenguajes --> <!-- <extend-property name="locale" values="es" /> --> <!-- Linker std, xs, … --> <!-- <add-linker name="xs"/> → <!-- Deferred binding, … --> <replace-with class="com.foo.MyClassIE"> <when-type-is class="com.foo.MyClass"/> <any> <when-property-is name="user.agent" value="ie6"/> <when-property-is name="user.agent" value="ie8"/> </any> </replace-with> </module>
  • 7. Página html de la aplicación <!-- Hacer la llamada al fichero de javascript generado para nuestra aplicación en cualquier fichero estático o dinámico. --> <html> <head> </head> <body> <!-- Llamada a nuestra aplicación --> <script id="ID" type="text/javascript" language="javascript" src="com.foo.Hello.js?123&provider=1"> </script> <!-- Necesario si queremos tener historia --> <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe> <!-- Se puede poner todo el contenido html que queramos y manipularlo --> <h1>Hello</h1> <!-- GWT no es intrusivo, se puede utilizar cualquier otra librería/s js --> <script id="ID" type="text/javascript" language="javascript" src="jquery.js"> </script> </body> </html>
  • 8. Trabajar en Java - El método EntryPoint se llama cuando la aplicación se carga en el navegador - GWT.create permite asociación aplazada de clases 'deferred binding' - La clase DOM sirve para manejar elementos de navegador package com.foo.client; import [...] public class Hello implements EntryPoint { // This method is called whenever the browser loads the page public void onModuleLoad() { MyClass impl = GWT.create(MyClass.class); DOM.getElementById("id").getStyle().setProperty("display", "none"); } }
  • 9. ¿Qué obtenemos al Compilar? ## Único Fichero a incluir en el HTML ## Se encarga de detectar browser/lang y cargar el fichero de aplicacion adecuado ## No se debe cachear com.foo.Hello.nocache.js ## Cada fichero para la combinación browser/language ## Se pueden generar ficheros '.js' o '.html' dependiendo del linker ## cross-site (xs), standard (std) ## Se puede cachear 1102DEF681997CEB9DDF55DEA52DAC77.cache.js (ó .html) 35041D1CDE8A3F7BA84E28F014AD7763.cache.js 855ACC0BD175268F9BFBDDD1AC46D60C.cache.js BCAE487AACB322FA340C97DFE205CF9C.cache.js EAB3A6766FC64B8FB876749E68EF311D.cache.js ## Definición de llamadas rpc DACD019E1AB65BD2BCAC2F7BD9DB85F2.gwt.rpc ## Ficheros estáticos clear.cache.gif Hello.css history.html Hello.css Hello.html images/
  • 10. ¿Cómo es el JS generado? ### Compilando con el parámetro -style PRETTY function getStylePrimaryName(elem){ var fullClassName, spaceIdx; fullClassName = elem['className'] == null?null:String(elem['className']); spaceIdx = fullClassName.indexOf(fromCodePoint(32)); if (spaceIdx >= 0) { return fullClassName.substr(0, spaceIdx - 0); } return fullClassName; } function removeStyleName_0(style){ setStyleName_0(this.getStyleElement(), style, false); } ### Por defecto -style OBFUSCATED _=gB.prototype=new zdb();_.gC=lB;_.tI=22;function tB(f,d){var a,b,c,e,g;for(b=0;b<d.length;+ +b){c=fi+(d[b]!=null?d[b]:fi);a=sx+b+ux;for(;;) {e=f.indexOf(a);if(e<0)break;g=fi;if(e+a.length<f.length)g=gMb(f,e+a.length);f=f.substr(0,e- 0)+c+g}}return f} function mC(c,a,d){var b;b=d>0?~~(a*100/d):0;nC(c,b,a,d)}
  • 11. Usar la caché de cliente ### Configuración Apache para GWT ExpiresActive on ExpiresDefault "now plus 2 hours" # Dont cache the main file (browser and locale detector, and application file selector) # ie: com.miraiespana.home.gwt.Home.nocache.js <Files ~ *.nocache.*> ExpiresDefault "now plus 2 minutes" Header set Cache-Control "no-store,must-revalidate" AddOutputFilter DEFLATE </Files> # Cache the application files # ie: 1102DEF681997CEB9DDF55DEA52DAC77.cache.js <Files ~ *.cache.*> ExpiresDefault "now plus 2 years" Header set Cache-Control "max-age=290304000,public" </Files>
  • 13. Plugin de google para eclipse  El plugin incluye: – Asistente para creación de proyectos. – Servidor y Lanzador de aplicaciones – Lanzador de Tests – SDK para GWT – SDK para GAE  Web oficial: – http:http://code.google.com/eclipse/
  • 14. Plugin para Navegadores  Para depurar y trabajar en modo desarrollo es necesario añadir a nuestro navegador el plugin para GWT  Existen plugins para: – FF – Chrome – IE  ¿Cómo funciona? – GWT compila la aplicación a javascript añadiendo cierta información de control. – Se utiliza un canal de comunicación entre el plugin del browser y el modo de desarrollo de GWT (integrado en eclipse) – Eclipse interacciona con el usuario mostrando las líneas de código y con el navegador y respetando los puntos de control
  • 15. Importar un proyecto a Eclipse  File → Import → Existing projects into workspace → Browse
  • 16. Añadirlo al plugin GWT  Properties → Google → Web Toolkit → Use GWT
  • 17. Verificar 'Build Path'  Properties → Java Build Path → Add Library … – (añadir GWT SDK y eliminar gwt*jar)
  • 18. Ejecutar en modo desarrollo  Borrar ficheros *.launch (ya no son necesarios con el plugin)  Run As → Web Application  Abrir la URL indicada en el Navegador (si no tiene el plugin preguntará).
  • 20. Ant  Los proyectos GWT para 'ant' se crean con la herramienta webAppCreator  Se genera un fichero build.xml con las tareas de: – Ejecutar Tests • test.dev (HtmlUnit) • test.prod (Browser) – Ejecutar en Modo desarrollo • devmode – Compilar las clases java • javac • javac.tests – Compilar el código java a javascript • gwtc – Producir el fichero de la aplicación empaquetado • war
  • 21. Maven  Aunque hay varios plugins para maven, se debe usar el alojado en codehaus http://mojo.codehaus.org/gwt-maven-plugin/.  Se necesita maven 2.2.x para que funcione.  Existe un arquetipo para crear un proyecto GWT: – mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo -DarchetypeArtifactId=gwt-maven-plugin -DarchetypeVersion=1.1 -DgroupId=ws -DartifactId=GwtWsHelloWorld – Después editar el fichero pom.xml y hacer estas modificaciones <gwt.version>2.0.3</gwt.version> [...] <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>gwt-maven-plugin</artifactId> <configuration> <runTarget>myGroupId.Application/Application.html</runTarget> </configuration> <executions> <execution> <phase>prepare-package</phase> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin>
  • 22. Maven  Goles: – 'mvn gwt:run' ejecutar el modo desarrollo – 'mvn gwt:compile' compilar a javascript  El resto de goles Gwt no funcionan o no son necesarios  A partir de ahora podemos utilizar maven como en cualquier otro proyecto java: – 'mvn clean test package emma:emma site' …  Nota: la instrumentalización de cobertura para tests GWT sólo funciona con Emma.  Importar el proyecto en eclipse como un proyecto maven con el plugin m2eclipse de sonatype
  • 24. Estructura de las librerías GWT • Crear un módulo (normalmente sin entryPoint) • Crear código Java • Añadir elementos estáticos • Generar un fichero jar que incluya: – Código Fuente *.java – Elementos Públicos (css, jpg ...) – Fichero de Módulo *.gwt.xml – Clases compiladas *.class – META-INF/MANIFEST.MF • Conclusión: igual que en java – Se puede utilizar maven – Se puede utilizar ant
  • 25. Cómo se usan la Librerías GWT • Añadir el fichero .jar al classpath • Heredar el módulo de la librería en nuestro módulo. Incluir librerías que no se utilizan sólo penaliza el tiempo de compilación, porque todo el código no usado será descartado de nuestro javascript final. ## Hello.gwt.xml <module rename-to=”hola” > […] <!-- Módulo/s que la librería provee --> <inherits name="com.google.code.p.gwtchismes.GWTChismes" /> <!-- Otras cosas necesarias para usar la librería --> <stylesheet src="GWTC-compressed.css"/> […] </module>
  • 26. Preguntas Manuel Carrasco Moñino http://manolocarrasco.blogspot.com twitter.com/dodotis manolo@apache.org