SlideShare una empresa de Scribd logo
1 de 65
GWT

Google Web Toolkit
Que es GWT
• Es un Framework de desarrollo propiedad de
  Google, con el cual se le dan vida a
  aplicaciones reales y complejas como Google
  Maps, Google AdWords, Orkut
• Es completamente gratis y de código abierto
Que requiere GWT
• De manera general solo se necesita el SDK de
  GWT, pero pueden usarse diferente plugins
  liberados por Google para facilitar el
  desarrollo como:
  – Google Eclipse Plugin
  – Window Builder Pro
  – GWT Designer(parte de Window Builder Pro)
  – SpeedTracer
Instalación de los plugins
• Los plugins pueden instalarse desde el
  software manager de Eclipse.
• Help->Install new software.
• Debemos agregar los repositorios necesarios
  para instalar los plugins, los cuales están
  disponibles en la siguiente url:

 http://code.google.com/intl/es/webtoolkit/do
 wnload.html
Ventajas
• Modelo de programación similar a
  aplicaciones de escritorio Swing.
• Fácil uso de código del servidor sin importar
  como se codifica este.
• Es compatible con varios browsers.
• Evita refrescar el browser cada vez que se
  realiza una petición.
Desventajas
• La estructura del proyecto cambia drásticamente.
• Los JSP, JSF desaparecen.
• El modelo de programación es diferente a los
  habituales proyectos web Java.
• Hace uso intensivo de JavaScript, lo cual puede
  incompatibilizarlos con browsers antiguos o
  dispositivos de poca capacidad.
• Alto conocimiento de la herramienta para
  optimización
Estructura de un proyecto
• HTML Host Pages

• Distribución de paquetes y directorios

• Modulos

• Modulos Base
Distribución de paquetes y directorios

• Un proyecto GWT tiene una distribución de
  directorios especifica para su código de cliente
  y de servidor:
Distribución de paquetes y directorios
                Cliente
• En la paquete cliente, están todas las clases que
  representa la interface grafica.
• El modelo es muy similar a las aplicaciones Swing,
  su manejo de eventos y componentes gráficos.
• Permite la programación de la interfaces se
  realice con Java y un subconjunto bastante
  amplio de las clases base.
• Contiene las interfaces Java para usar los
  servicios RPC
Distribución de paquetes y directorios
            Servidor (RPC)
• El paquete de servidor contiene el código que
  se ejecutara desde el servidor.
• Contiene los servicios que se ejecutaran de
  una manera fácil, síncrona o asíncronamente
  desde la interface grafica.
• Puede hacer uso de otras clases y frameworks
  java para facilitar el uso de código del servidor.
HTML Host Pages

• Son paginas que funcionan como punto de
  entrada a una aplicación GWT, son generadas
  por el compilador de GWT, pero se pueden
  modificar o llamar desde otras paginas.
• Contienen la llamada a la clase EntryPoint, la
  cual es la clase que funciona como punto de
  entrada a la aplicación y es donde se crean los
  componentes visuales.
HTML Host Pages
Modulos

• Un modulo es una aplicación o una parte de
  una aplicación GWT.
• Pueden o no tener una clase que implemente
  la interface EntryPoint.
• Si tienen la clase EntryPoint indica que tiene
  contenido ejecutable por el cliente, pero si no,
  se debe heredar desde otro modulo para
  utilizar su funcionalidad.
Archivo <NombreModulo>.gwt.xml
• Contiene la definición del modulo y los
  módulos de los cuales depende.
• Contiene la distribución de paquetes.
Archivo <NombreModulo>.gwt.xml
<module>
   <inherits name="com.google.gwt.user.User"/>
   <inherits
     name="com.google.gwt.user.theme.standard.Standa
     rd"/>
   <inherits name="com.smartgwt.SmartGwt"/>
   <entry-point
     class="com.efibs.test.ui.GWTRoot.client.GWTRoot
     "/>
</module>
Uso de módulos
• Codigo que no implementa una clase
  EntryPoint
• Se debe heredad para usar su funcionalidad.
• La herencia debe estar anotada en el archivo
  gwt.xml como una línea inherits

     <inherits name="com.smartgwt.SmartGwt"/>
EntryPoint Class
• Esta clase contiene el metodo que inicializa un
  modulo.
• Es similar al método main para Java o C.
• Inicializa todo los controles requeridos.
• Implementa la interface EntryPoint.
EntryPoint Classs
1 package com.efibs.test.ui.BasicModule.client;
2
3 import com.google.gwt.core.client.EntryPoint;
4 import com.google.gwt.event.dom.client.ClickEvent;
5 import com.google.gwt.event.dom.client.ClickHandler;
6 import com.google.gwt.user.client.Window;
7 import com.google.gwt.user.client.ui.Button;
8 import com.google.gwt.user.client.ui.RootPanel;
9
10 /**
11 * Entry point classes define <code>onModuleLoad()</code>.
12 */
13 public class BasicModule implements EntryPoint {
14 private Button clickMeButton;
15 public void onModuleLoad() {
16       RootPanel rootPanel = RootPanel.get();
17
18       clickMeButton = new Button();
19       rootPanel.add(clickMeButton);
20       clickMeButton.setText("Click me!");
21       clickMeButton.addClickHandler(new ClickHandler(){
22                 public void onClick(ClickEvent event) {
23                 Window.alert("Hello, GWT World!");
24                 }
25       });
26 }
27 }
Diseño visual de UI
• El plugin gratuito Window Builder Pro, nos
  permite realizar un diseño visual de toda la
  interface grafica.
• Para una clase GWT, realizan click derecho-
  >Abrir con
Diseño visual de UI
Widgets
• GWT cuenta con una gran cantidad de
  controles gráficos o Widgets.
• También existen librerías de terceros que
  proporcionan nuevos Widgets
  – SmartGWT
    http://code.google.com/p/smartgwt/
  – ExtGWT
    http://www.sencha.com/products/extgwt/
Widgets Básicos
Eventos de los Widgets
• Como las clases Swing, los widgets GWT
  responden a diferentes eventos, ya sea del
  teclado, del ratón o ambos.
• Se pueden agregar tantos manejadores de
  eventos como sea necesario.
• Se puede tener cualquier tipo de código en los
  manejadores de eventos, ya sea llamadas a
  código del servidor o interacción con otro
  widgets.
Eventos de los Widgets
1 Button btnAceptar = new Button("New
  button");
2 btnAceptar.addClickHandler(new
      ClickHandler() {
3          public void onClick(ClickEvent
           event) {
4               Window.alert("hola mundo");
5          }
6 });
RPC (Remote Procedure Call)
• GWT ofrece una fácil integración con codigo
  del lado del servidor.
• Se inicia como una interface la cual contiene la
  definición del servicio.
• Existe otra interface la cual define el servicio
  de manera asíncrona.
• Una clase Java que implementa la interface de
  servicio y codifica sus métodos.
La interface de servicio
1@ RemoteServiceRelativePath("LoginService")
2 public interface LoginService extends RemoteService {
3 public String login(String usuario, String password);
4 /**
5 * Utility class for simplifying access to the instance of async
   service.
6 */
7 public static class Util {
8       private static LoginServiceAsync instance;
9       public static LoginServiceAsync getInstance(){
10              if (instance == null) {
11                      instance = GWT.create(LoginService.class);
12              }
13              return instance;
14      }
15 }
La interface de servicio asincrona
1 public interface LoginServiceAsync {
2     public void login(String usuario, String
      password, AsyncCallback<String> callback);
3 }
La implementación del servicio
1 @SuppressWarnings("serial")
2 public class LoginServiceImpl extends
   RemoteServiceServlet implements LoginService {
3
4 @Override
5 public String login(String usuario, String password) {
6      if("admin".equals(usuario) &&
       "admin".equals(password)){
7             return "Usuario logueado";
8      }
9      else{
10            return "Usuario o contraseña invalidas";
11     }
12 }
13 }
Llamando al método RPC
Llamando al método RPC (Asíncrona)
1 final LoginServiceAsync loginServiceAsync = GWT.create(LoginService.class);
2 btnAceptar.addClickHandler(new ClickHandler() {
3 public void onClick(ClickEvent event) {
4         vwldrLoadingViewnbsp.setVisible(true);
5         loginServiceAsync.login(txtUsuario.getText(), txtPassword.getText(), new
                                       AsyncCallback<String>() {
6         @Override
7         public void onSuccess(String result) {
8                   Window.alert("Respuesta del servidor: " + result);
9                   if(result.contains("log")){
10                           rootPanel.clear();
11                           rootPanel.add(new SearchPanel());
12                  }
13        }
14        @Override
15        public void onFailure(Throwable caught) {
16                  Window.alert("error: " + caught.getMessage());
17        }
18        });
19     vwldrLoadingViewnbsp.setVisible(false);
20 }
21 });
Llamando al método RPC (Síncrona)
1 final LoginService loginService =
   GWT.create(LoginService.class);
2 btnAceptar.addClickHandler(new ClickHandler() {
3      public void onClick(ClickEvent event) {
4             vwldrLoadingViewnbsp.setVisible(true);
5             String result =
              loginService.login(txtUsuario.getText(),
              txtPassword.getText());
6             Window.alert("Respuesta del servidor: " +
              result);
7             if(result.contains("log")){
8                    rootPanel.clear();
9                    rootPanel.add(new SearchPanel());
10            }
11            vwldrLoadingViewnbsp.setVisible(false);
12     }
13 });
Ejecutar UI con muchas dependencias
• Las interfaces de la aplicaciones complejas suelen
  volverse muy pesadas, estas hacen uso no solo de
  widgets de GWT sino de librerías de terceros,
  imágenes y JavaScript.
• Esto se puede solucionar haciendo una ejecución
  en paralelo de la interface, la cual descargara la
  interface grafica sin bloquear la UI Actual.
• GWT.runAsync Permite llamar código en
  segundo plano, normalmente sin ninguna
  demora aparente.
Ejecutar UI con muchas dependencias
Ejecutar UI con muchas dependencias
1 GWT.runAsync(new RunAsyncCallback() {
2
3 @Override
4 public void onSuccess() {
5      rootPanel.clear();
6      rootPanel.add(new UIPesada());
7 }
8
9 @Override
10 public void onFailure(Throwable reason) {
11     Window.alert("Error con UI pesada");
12
13 }
14 });
Seguridad GWT
• GWT no tiene como seguir una sesión de usuario
  así que debe seguirse por medio de un servicio
  RCP.
• GWT no realiza comprobaciones cuando se
  modifica el contenido HTML desde fuera del
  entorno GWT.
• Se debe tener cuidado con el uso de cadenas
  obtenidas desde el cliente y el procesamiento de
  request Json o Xml.
• Evitar el uso de JSNI
Modelo de Sesión GWT
Modelo de Sesión GWT
1 public String login(String usuario, String password){
2   if("admin".equals(usuario) && "admin".equals(password)){
3          HttpSession session = this.getThreadLocalRequest().getSession(true);
4          session.setAttribute(USER_LOGED_VAR, "usuario autenticado");
5          return "Usuario logueado";
6   }
7    else{
8          return "Usuario o contraseña invalidas";
9   }
10 }
11 public Boolean checkSession() {
12 HttpSession session = this.getThreadLocalRequest().getSession(false);
13 Boolean respuesta= Boolean.FALSE;
14 if(session != null && session.getAttribute(USER_LOGED_VAR) != null){
15         respuesta = Boolean.TRUE;
16 }
17 return respuesta;
18 }
19 public void logoff() {
20 HttpSession session = this.getThreadLocalRequest().getSession(false);
21 if(session!=null){
22         session.setAttribute(USER_LOGED_VAR, null);
23         session.invalidate();
24 }
Seguridad XSS
• La seguridad respecto a los ataques XSS se validan mediante
  una programación rigurosa, reduciendo y evitando los
  vectores de ataque mas comunes como:
   – Evitando JavaScript en la HostPage que ejecuta la
      aplicación GWT
   – Evitando código que llame directamente el innerHTML de
      los widgets
   – Usar JSON API para parsear cadenas inseguras o de fuentes
      desconocidas
   – Usar JavaScript que use la función eval
   – Si se usa JSNI evitar código inseguro como usar innerHTML,
      eval o escribiendo directamente con document.write
Seguridad XSS
• Se debe inspeccionar y escapar cualquier
  cadena que se use como innerHTML
• Verificar y escapar cualquier cadena que se
  pase al parser JSON de GWT
Seguridad XSRF
• Los ataques pueden ser el robo de la cookie
  de sesión y una manera para solucionar esto
  es haciendo uso del RequestBuilder para
  enviar el valor de la cookie de sesión, si este
  valor llega al servidor como un valor diferente
  al esperado, se trata de un ataque XSRF.
Seguridad XSRF (Servidor indicar
                sesión)
1 public String login(String usuario, String password){
2 if("admin".equals(usuario) && "admin".equals(password)){
3      HttpSession session =
       this.getThreadLocalRequest().getSession(true);
4      session.setAttribute(USER_LOGED_VAR, "usuario
       autenticado");
5      String sessionId= createUID();
6      session.setAttribute(USER_SESSION_ID, sessionId);
7      this.getThreadLocalResponse().addCookie(new
              Cookie(USER_SESSION_ID, sessionId));
8      return "Usuario logueado";
9 }
10 else{
11     return "Usuario o contraseña invalidas";
12     }
13 }
Seguridad XSRF (Request Por
           RequesBuilder)
1 RequestBuilder rb = new
  RequestBuilder(RequestBuilder.POST, url);
2 rb.setHeader("uuid",
  Cookies.getCookie("uuid"));
3 rb.sendRequest(null, myCallback);
Seguridad XSRF (Servidor verificar
               cookie)
1 private Boolean
  verificarCookie(HttpServletRequest request,
  HttpServletResponse response){
2    Boolean respuesta = Boolean.FALSE;
3    String headerValue =
     request.getHeader(USER_SESSION_ID);
4    String value = (String)
     request.getSession(false).getAttribute(USE
     R_SESSION_ID);
5    if(value.equals(headerValue)){
6          respuesta = Boolean.TRUE;
7    }
8    return respuesta;
9 }
Seguridad XSRF Para Servicios RCP
              (Servidor)
• Se debe agregar referebcua a el servlet
  XsrfTokenServiceServlet
<servlet>
    <servlet-name>xsrf</servlet-name>
    <servlet-class>
     com.google.gwt.user.server.rpc.XsrfTokenService
   Servlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>xsrf</servlet-name>
    <url-pattern>/gwt/xsrf</url-pattern>
</servlet-mapping>
Seguridad XSRF Para Servicios RCP
              (Servidor)
• Se debe agregar un parámetro de contexto el
  cual identifiqué la cookie con la cual se debe
  realizar la verificación.
<context-param>
    <param-name>gwt.xsrf.session_cookie_name</param-
   name>
    <param-value>JSESSIONID</param-value>
</context-param>
Seguridad XSRF Para Servicios RCP
             (Servidor)
• Los servicios RCP que deba implementar
  proteccion XSRF, deben heredar de la clase
  XsrfProtectedServiceServlet.

public class MyServiceImpl extends
  XsrfProtectedServiceServlet implements
Seguridad XSRF Para Servicios RCP
               (Cliente)
• Las interfaces que definen los servicios deben
  heredar de la interface XsrfProtectedService.
• O las Interfaces deben ser anotadas con
  @XsrfProtect.
• Las llamadas deben de obtener un tocken
  antes de cada petición del Servlet
  XsrfTokenService y luego adjuntar en su
  llamada el token obtenido.
Seguridad XSRF Para Servicios RCP
                  (Cliente)
1 XsrfTokenServiceAsync xsrf = (XsrfTokenServiceAsync)GWT.create(XsrfTokenService.class);
2 ((ServiceDefTarget)xsrf).setServiceEntryPoint(GWT.getModuleBaseURL() + "xsrf");
3 xsrf.getNewXsrfToken(new AsyncCallback<XsrfToken>() {
4
5 public void onSuccess(XsrfToken token) {
6 MyServiceAsync rpc = (MyServiceAsync)GWT.create(MyService.class);
7 ((HasRpcToken) rpc).setRpcToken(token);
8
9 // make XSRF protected RPC call
10 rpc.doStuff(new AsyncCallback<Void>() {
11 // ...
12 });
13 }
14
15 public void onFailure(Throwable caught) {
16 try {
17 throw caught;
18 } catch (RpcTokenException e) {
19 // Can be thrown for several reasons:
20 // - duplicate session cookie, which may be a sign of a cookie
21 // overwrite attack
22 // - XSRF token cannot be generated because session cookie isn't
23 // present
24 } catch (Throwable e) {
25 // unexpected
26 }
27 });
JSNI (JavaScript Native Interface)
• Código JavaScript creado como un comentario
  de un método marcado como nativo.
• Permite la llamada de código Java desde los
  métodos marcados como nativo.
JSNI (JavaScript Native Interface)
1   // Expose the following method into JavaScript.
2   private static String formatAsCurrency(double x) {
3     return NumberFormat.getCurrencyFormat().format(x);
4   }
5
6   // Set up the JS-callable signature as a global JS function.
7   private native void publish() /*-{
8    $wnd.formatAsCurrency =
9
   @org.example.yourcode.format.client.DateFormatterLib::formatAsCurre
   ncy(D);
10 }-*/;
11
12 // Auto-publish the method into JS when the GWT module loads.
13 public void onModuleLoad() {
14       publish();
15 }
Usando una Función JNDI
1 <html>
2 <head>
3
4 <-- Include the GWT module that publishes the JS API -->
5      <script
       src="org.example.yourcode.FormatLib.nocache.js"></sc
   ript>
6
7 <-- Write some JS that uses that GWT code -->
8 <script>
9      function doStuff() {
10            alert(formatAsCurrency(1530281));
11     }
12 </script>
13 </head>
Usando una función Java desde JNDI
1   package org.example.foo;
2   public class Flipper {
3
4   public native void flipName(String name) /*-{
5   var re = /(w+)s(w+)/;
6   var s = name.replace(re, '$2, $1');
7
   this.@org.example.foo.Flipper::onFlip(Ljava/lang/S
   tring;)(s);
8 }-*/;
9
10 private void onFlip(String flippedName) {
11     // do something useful with the flipped name
12 }
IoC en GWT, GIN
• Gin es una librerías que nos permite utilizar
  IoC en el código GWT, para facilitar el uso de
  algunos servicios complejos y aumentar el
  desacoplamiento de los diferentes artefactos
  de software.
• Eliminar el código boilaparte o repetitivo el
  cual hace crecer de manera innecesaria la
  complejidad del código.
GIN
• El modulo debe heredar del modulo Inject
<module>
   ...
   <inherits
  name="com.google.gwt.inject.Inject"/>
   ...
</module>
GIN
• Definir la el Ginjector, el cual será la clase que
  hará de contrato para implementar los tipos
  que se desea instanciar sin codificación
  directa.

public interface SimpleInjector extends Ginjector {
    MainUi getMainUi();
    LoginServiceAsync getLoginServiceAsync();
    LoginService getLoginService();
  }
GIN
• Declarar el enlace entre varias clases y
  proveedores

public class SimpleInjectorImpl extends AbstractGinModule {
    protected void configure() {
      bind(MainUi.class).in(Singleton.class);
      bind(LoginServiceAsync.class).toProvider(LoginServiceIPro
  viderAsync.class);
  bind(LoginService.class).toProvider(LoginServiceIProvide.cla
  ss);
    }
  }
GIN
• Anotar la interface marcada como injector con
  @GinModules(ClaseImplInjector.class)

@GinModules(SimpleInjectorImpl.class)
public interface SimpleInjector extends
  Ginjector {
    MainUi getMainUi();
    LoginServiceAsync getLoginServiceAsync();
    LoginService getLoginService();
  }
GIN
• Finalmente para usar el injector que definimos
  debemos hacer uso del metodo
  GWT.create(injectorinterace.class)

public class GWTModule implements EntryPoint {
   private final SimpleInjector injector =
       GWT.create(SimpleInjector .class);
      public void onModuleLoad() {
        MainUi mainPanel = injector.getMainPanel();
        RootPanel.get().add(mainPanel);
      }
  }
GIN
• También existe la inyección diferida, la cual se ejecuta en
  tiempo de ejecución.
public interface MyConstants extends Constants {
    String myWords();
  }
  public class MyWidget {
    @Inject
    public MyWidget(MyConstants myconstants) {
      // The injected constants object will be fully initialized -
      // GWT.create has been called on it and no further work is
  necessary.
    }
  }
GIN
• Inyección diferida para servicios remoto RPC
public interface MyRemoteService extends RemoteService { ... }
  public interface MyRemoteServiceAsync { ... }
  public class MyWidget {
    @Inject
    public MyWidget(MyRemoteServiceAsync service) {
      // The 'service' will be created by calling
  GWT.create(MyRemoteService.class)
      // prior to injection.
    }
  }
GWT Logging
• GWT soporta Logging a través de la API de
  Logging de java.
• El modulo deberá heredar del modulo Logging

<inherits name="com.google.gwt.logging.Logging"/>
   <set-property name="gwt.logging.logLevel“
   value="SEVERE"/>        # To change the default logLevel
     <set-property name="gwt.logging.enabled"
   value="FALSE"/>       # To disable logging
     <set-property name="gwt.logging.consoleHandler"
   value="DISABLED"/> # To disable a default Handler
GWT Logging
• Los loggers, implementan handlers, estos
  handler manejan donde se muestra la
  información sobre los eventos que se logean,
  existen varios loggers como:
  – SystemLogHandler
  – DevelopmentModeLogHandler
  – ConsoleLogHandler
  – PopupLogHandler
  – SimpleRemoteLogHandler
GWT Logging
• El logging remoto, el cual debe usarse junto con un Servlet.
gwt.xml
1 < inherits name="com.google.gwt.logging.Logging" >
2 < set-property                name="gwt.logging.simpleRemoteHand ler"
    value="ENABLED" >
3 < /set-property >
4 < /inherits >
web.xml
1 < servlet >
2 < servlet-
          class>com.google.gwt.logging.server.RemoteLoggingServiceIm
    pl </servlet-class >
3 < servlet-name >logger < /servlet-name >
4 < /servlet >
5 < servlet-mapping >
6 < servlet-name>logger </servlet-name >
7         < url-pattern>/YOURPROJECT/remote_logging </url-pattern >
8 < /servlet-mapping >
GQuery
• Gquery es un port de Jquery para GWT, el cual
  permite realizar las tareas de manipulación
  DOM de una manera mas sencillas y seguras.
• Es gratuito y se puede conseguir en:
  – http://code.google.com/p/gwtquery/
GQuery
1 import static com.google.gwt.query.client.GQuery.*;
2 import com.google.gwt.query.client.Function;
3
4 public void onModuleLoad() {
5    //Hide the text and set the width and append an h1 element
6    $("#text").hide()
7           .css("width", "400px")
8           .prepend("<h1>GwtQuery Rocks !</h1>");
9
10 //add a click handler on the button
11 $("button").click(new Function(){
12          public void f() {
13          //display the text with effects and animate its background color
14                     $("#text").as(Effects)
15                                .clipDown()
16                                .animate("backgroundColor: 'yellow'", 500)
17                                .delay(1000)
18                                .animate("backgroundColor: '#fff'", 1500);
19          }
20 });
21 }

Más contenido relacionado

La actualidad más candente

REST Versioning Architecture with ASP.NET MVC Web API v1.2
REST Versioning Architecture with ASP.NET MVC Web API v1.2REST Versioning Architecture with ASP.NET MVC Web API v1.2
REST Versioning Architecture with ASP.NET MVC Web API v1.2
Rodrigo Ezequiel Liberoff V
 
Presentacion portlets-tools
Presentacion portlets-toolsPresentacion portlets-tools
Presentacion portlets-tools
guest696b01
 
Presentacion portlets tools
Presentacion portlets toolsPresentacion portlets tools
Presentacion portlets tools
guest696b01
 
Testing con selenium
Testing con seleniumTesting con selenium
Testing con selenium
marianoshin
 

La actualidad más candente (19)

Proyect Evenge. Event manager
Proyect Evenge. Event managerProyect Evenge. Event manager
Proyect Evenge. Event manager
 
Xamarin Forms y MVVM
Xamarin Forms y MVVMXamarin Forms y MVVM
Xamarin Forms y MVVM
 
Jobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket Spring 2GX Madrid
Jobsket Spring 2GX Madrid
 
Gestión del software con Maven y Jenkins
Gestión del software con Maven y JenkinsGestión del software con Maven y Jenkins
Gestión del software con Maven y Jenkins
 
Tema6resumido
Tema6resumidoTema6resumido
Tema6resumido
 
Angular 6
Angular 6Angular 6
Angular 6
 
REST Versioning Architecture with ASP.NET MVC Web API v1.2
REST Versioning Architecture with ASP.NET MVC Web API v1.2REST Versioning Architecture with ASP.NET MVC Web API v1.2
REST Versioning Architecture with ASP.NET MVC Web API v1.2
 
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
 
Introducción a Zend Framework
Introducción a Zend FrameworkIntroducción a Zend Framework
Introducción a Zend Framework
 
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
 
Framework
FrameworkFramework
Framework
 
Taller Grails
Taller GrailsTaller Grails
Taller Grails
 
Net framework version 4.5
Net framework version 4.5Net framework version 4.5
Net framework version 4.5
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradle
 
expo
expoexpo
expo
 
Presentacion portlets-tools
Presentacion portlets-toolsPresentacion portlets-tools
Presentacion portlets-tools
 
Presentacion portlets tools
Presentacion portlets toolsPresentacion portlets tools
Presentacion portlets tools
 
Tema 4 3_3_interfaces_de_usuario
Tema 4 3_3_interfaces_de_usuarioTema 4 3_3_interfaces_de_usuario
Tema 4 3_3_interfaces_de_usuario
 
Testing con selenium
Testing con seleniumTesting con selenium
Testing con selenium
 

Destacado

Destacado (10)

GWT: Why GWT, GQuery, and RequestFactory
GWT: Why GWT, GQuery, and RequestFactoryGWT: Why GWT, GQuery, and RequestFactory
GWT: Why GWT, GQuery, and RequestFactory
 
GWT - de iniciante a especialista
GWT - de iniciante a especialistaGWT - de iniciante a especialista
GWT - de iniciante a especialista
 
GWT - Una introducción
GWT - Una introducciónGWT - Una introducción
GWT - Una introducción
 
Desarrollo multiplataforma de apps con GWT y PhoneGap
Desarrollo multiplataforma de apps con GWT y PhoneGapDesarrollo multiplataforma de apps con GWT y PhoneGap
Desarrollo multiplataforma de apps con GWT y PhoneGap
 
Aprendiendo GWT
Aprendiendo GWTAprendiendo GWT
Aprendiendo GWT
 
Gwt I - entendiendo gwt
Gwt I - entendiendo gwtGwt I - entendiendo gwt
Gwt I - entendiendo gwt
 
GWT y SmartGWT - Introducción
GWT y SmartGWT - IntroducciónGWT y SmartGWT - Introducción
GWT y SmartGWT - Introducción
 
Desarrollo de aplicaciones AJAX con GWT
Desarrollo de aplicaciones AJAX con GWTDesarrollo de aplicaciones AJAX con GWT
Desarrollo de aplicaciones AJAX con GWT
 
Comenzando con GWT
Comenzando con GWTComenzando con GWT
Comenzando con GWT
 
Google Web Toolkit (GWT) en entornos empresariales
Google Web Toolkit (GWT) en entornos empresarialesGoogle Web Toolkit (GWT) en entornos empresariales
Google Web Toolkit (GWT) en entornos empresariales
 

Similar a GWT

Presentacion Tesis
Presentacion TesisPresentacion Tesis
Presentacion Tesis
GEOVAN21
 
Interfaces Usuario 3
Interfaces Usuario 3Interfaces Usuario 3
Interfaces Usuario 3
Milaly
 

Similar a GWT (20)

Exposicion GWT
Exposicion GWTExposicion GWT
Exposicion GWT
 
Google Web Toolkit
Google Web ToolkitGoogle Web Toolkit
Google Web Toolkit
 
Creando Aplicaciones Web en el 2015
 Creando Aplicaciones Web en el 2015 Creando Aplicaciones Web en el 2015
Creando Aplicaciones Web en el 2015
 
DotNetDom: El futuro de Xamarin
DotNetDom: El futuro de XamarinDotNetDom: El futuro de Xamarin
DotNetDom: El futuro de Xamarin
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
 
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
 
Presentacion Tesis
Presentacion TesisPresentacion Tesis
Presentacion Tesis
 
Google Web Toolkit
Google Web ToolkitGoogle Web Toolkit
Google Web Toolkit
 
Arquitectura java web
Arquitectura java webArquitectura java web
Arquitectura java web
 
Desarrollando una Extensión para Docker
Desarrollando una Extensión para DockerDesarrollando una Extensión para Docker
Desarrollando una Extensión para Docker
 
Desarrollo de Aplicaciones Web 2.0 con GWT
Desarrollo de Aplicaciones Web 2.0 con GWTDesarrollo de Aplicaciones Web 2.0 con GWT
Desarrollo de Aplicaciones Web 2.0 con GWT
 
Deletreando Android
Deletreando AndroidDeletreando Android
Deletreando Android
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Interfaces Usuario 3
Interfaces Usuario 3Interfaces Usuario 3
Interfaces Usuario 3
 
Building Ria Applications With Silverlight 2
Building Ria Applications With Silverlight 2Building Ria Applications With Silverlight 2
Building Ria Applications With Silverlight 2
 
Charla
CharlaCharla
Charla
 
Imagina Upna 2010
Imagina Upna 2010Imagina Upna 2010
Imagina Upna 2010
 

Último

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
silviayucra2
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
241521559
 

Último (10)

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 

GWT

  • 2. Que es GWT • Es un Framework de desarrollo propiedad de Google, con el cual se le dan vida a aplicaciones reales y complejas como Google Maps, Google AdWords, Orkut • Es completamente gratis y de código abierto
  • 3. Que requiere GWT • De manera general solo se necesita el SDK de GWT, pero pueden usarse diferente plugins liberados por Google para facilitar el desarrollo como: – Google Eclipse Plugin – Window Builder Pro – GWT Designer(parte de Window Builder Pro) – SpeedTracer
  • 4. Instalación de los plugins • Los plugins pueden instalarse desde el software manager de Eclipse. • Help->Install new software. • Debemos agregar los repositorios necesarios para instalar los plugins, los cuales están disponibles en la siguiente url: http://code.google.com/intl/es/webtoolkit/do wnload.html
  • 5. Ventajas • Modelo de programación similar a aplicaciones de escritorio Swing. • Fácil uso de código del servidor sin importar como se codifica este. • Es compatible con varios browsers. • Evita refrescar el browser cada vez que se realiza una petición.
  • 6. Desventajas • La estructura del proyecto cambia drásticamente. • Los JSP, JSF desaparecen. • El modelo de programación es diferente a los habituales proyectos web Java. • Hace uso intensivo de JavaScript, lo cual puede incompatibilizarlos con browsers antiguos o dispositivos de poca capacidad. • Alto conocimiento de la herramienta para optimización
  • 7. Estructura de un proyecto • HTML Host Pages • Distribución de paquetes y directorios • Modulos • Modulos Base
  • 8. Distribución de paquetes y directorios • Un proyecto GWT tiene una distribución de directorios especifica para su código de cliente y de servidor:
  • 9. Distribución de paquetes y directorios Cliente • En la paquete cliente, están todas las clases que representa la interface grafica. • El modelo es muy similar a las aplicaciones Swing, su manejo de eventos y componentes gráficos. • Permite la programación de la interfaces se realice con Java y un subconjunto bastante amplio de las clases base. • Contiene las interfaces Java para usar los servicios RPC
  • 10. Distribución de paquetes y directorios Servidor (RPC) • El paquete de servidor contiene el código que se ejecutara desde el servidor. • Contiene los servicios que se ejecutaran de una manera fácil, síncrona o asíncronamente desde la interface grafica. • Puede hacer uso de otras clases y frameworks java para facilitar el uso de código del servidor.
  • 11. HTML Host Pages • Son paginas que funcionan como punto de entrada a una aplicación GWT, son generadas por el compilador de GWT, pero se pueden modificar o llamar desde otras paginas. • Contienen la llamada a la clase EntryPoint, la cual es la clase que funciona como punto de entrada a la aplicación y es donde se crean los componentes visuales.
  • 13. Modulos • Un modulo es una aplicación o una parte de una aplicación GWT. • Pueden o no tener una clase que implemente la interface EntryPoint. • Si tienen la clase EntryPoint indica que tiene contenido ejecutable por el cliente, pero si no, se debe heredar desde otro modulo para utilizar su funcionalidad.
  • 14. Archivo <NombreModulo>.gwt.xml • Contiene la definición del modulo y los módulos de los cuales depende. • Contiene la distribución de paquetes.
  • 15. Archivo <NombreModulo>.gwt.xml <module> <inherits name="com.google.gwt.user.User"/> <inherits name="com.google.gwt.user.theme.standard.Standa rd"/> <inherits name="com.smartgwt.SmartGwt"/> <entry-point class="com.efibs.test.ui.GWTRoot.client.GWTRoot "/> </module>
  • 16. Uso de módulos • Codigo que no implementa una clase EntryPoint • Se debe heredad para usar su funcionalidad. • La herencia debe estar anotada en el archivo gwt.xml como una línea inherits <inherits name="com.smartgwt.SmartGwt"/>
  • 17. EntryPoint Class • Esta clase contiene el metodo que inicializa un modulo. • Es similar al método main para Java o C. • Inicializa todo los controles requeridos. • Implementa la interface EntryPoint.
  • 18. EntryPoint Classs 1 package com.efibs.test.ui.BasicModule.client; 2 3 import com.google.gwt.core.client.EntryPoint; 4 import com.google.gwt.event.dom.client.ClickEvent; 5 import com.google.gwt.event.dom.client.ClickHandler; 6 import com.google.gwt.user.client.Window; 7 import com.google.gwt.user.client.ui.Button; 8 import com.google.gwt.user.client.ui.RootPanel; 9 10 /** 11 * Entry point classes define <code>onModuleLoad()</code>. 12 */ 13 public class BasicModule implements EntryPoint { 14 private Button clickMeButton; 15 public void onModuleLoad() { 16 RootPanel rootPanel = RootPanel.get(); 17 18 clickMeButton = new Button(); 19 rootPanel.add(clickMeButton); 20 clickMeButton.setText("Click me!"); 21 clickMeButton.addClickHandler(new ClickHandler(){ 22 public void onClick(ClickEvent event) { 23 Window.alert("Hello, GWT World!"); 24 } 25 }); 26 } 27 }
  • 19. Diseño visual de UI • El plugin gratuito Window Builder Pro, nos permite realizar un diseño visual de toda la interface grafica. • Para una clase GWT, realizan click derecho- >Abrir con
  • 21. Widgets • GWT cuenta con una gran cantidad de controles gráficos o Widgets. • También existen librerías de terceros que proporcionan nuevos Widgets – SmartGWT http://code.google.com/p/smartgwt/ – ExtGWT http://www.sencha.com/products/extgwt/
  • 23. Eventos de los Widgets • Como las clases Swing, los widgets GWT responden a diferentes eventos, ya sea del teclado, del ratón o ambos. • Se pueden agregar tantos manejadores de eventos como sea necesario. • Se puede tener cualquier tipo de código en los manejadores de eventos, ya sea llamadas a código del servidor o interacción con otro widgets.
  • 24. Eventos de los Widgets 1 Button btnAceptar = new Button("New button"); 2 btnAceptar.addClickHandler(new ClickHandler() { 3 public void onClick(ClickEvent event) { 4 Window.alert("hola mundo"); 5 } 6 });
  • 25. RPC (Remote Procedure Call) • GWT ofrece una fácil integración con codigo del lado del servidor. • Se inicia como una interface la cual contiene la definición del servicio. • Existe otra interface la cual define el servicio de manera asíncrona. • Una clase Java que implementa la interface de servicio y codifica sus métodos.
  • 26. La interface de servicio 1@ RemoteServiceRelativePath("LoginService") 2 public interface LoginService extends RemoteService { 3 public String login(String usuario, String password); 4 /** 5 * Utility class for simplifying access to the instance of async service. 6 */ 7 public static class Util { 8 private static LoginServiceAsync instance; 9 public static LoginServiceAsync getInstance(){ 10 if (instance == null) { 11 instance = GWT.create(LoginService.class); 12 } 13 return instance; 14 } 15 }
  • 27. La interface de servicio asincrona 1 public interface LoginServiceAsync { 2 public void login(String usuario, String password, AsyncCallback<String> callback); 3 }
  • 28. La implementación del servicio 1 @SuppressWarnings("serial") 2 public class LoginServiceImpl extends RemoteServiceServlet implements LoginService { 3 4 @Override 5 public String login(String usuario, String password) { 6 if("admin".equals(usuario) && "admin".equals(password)){ 7 return "Usuario logueado"; 8 } 9 else{ 10 return "Usuario o contraseña invalidas"; 11 } 12 } 13 }
  • 30. Llamando al método RPC (Asíncrona) 1 final LoginServiceAsync loginServiceAsync = GWT.create(LoginService.class); 2 btnAceptar.addClickHandler(new ClickHandler() { 3 public void onClick(ClickEvent event) { 4 vwldrLoadingViewnbsp.setVisible(true); 5 loginServiceAsync.login(txtUsuario.getText(), txtPassword.getText(), new AsyncCallback<String>() { 6 @Override 7 public void onSuccess(String result) { 8 Window.alert("Respuesta del servidor: " + result); 9 if(result.contains("log")){ 10 rootPanel.clear(); 11 rootPanel.add(new SearchPanel()); 12 } 13 } 14 @Override 15 public void onFailure(Throwable caught) { 16 Window.alert("error: " + caught.getMessage()); 17 } 18 }); 19 vwldrLoadingViewnbsp.setVisible(false); 20 } 21 });
  • 31. Llamando al método RPC (Síncrona) 1 final LoginService loginService = GWT.create(LoginService.class); 2 btnAceptar.addClickHandler(new ClickHandler() { 3 public void onClick(ClickEvent event) { 4 vwldrLoadingViewnbsp.setVisible(true); 5 String result = loginService.login(txtUsuario.getText(), txtPassword.getText()); 6 Window.alert("Respuesta del servidor: " + result); 7 if(result.contains("log")){ 8 rootPanel.clear(); 9 rootPanel.add(new SearchPanel()); 10 } 11 vwldrLoadingViewnbsp.setVisible(false); 12 } 13 });
  • 32. Ejecutar UI con muchas dependencias • Las interfaces de la aplicaciones complejas suelen volverse muy pesadas, estas hacen uso no solo de widgets de GWT sino de librerías de terceros, imágenes y JavaScript. • Esto se puede solucionar haciendo una ejecución en paralelo de la interface, la cual descargara la interface grafica sin bloquear la UI Actual. • GWT.runAsync Permite llamar código en segundo plano, normalmente sin ninguna demora aparente.
  • 33. Ejecutar UI con muchas dependencias
  • 34. Ejecutar UI con muchas dependencias 1 GWT.runAsync(new RunAsyncCallback() { 2 3 @Override 4 public void onSuccess() { 5 rootPanel.clear(); 6 rootPanel.add(new UIPesada()); 7 } 8 9 @Override 10 public void onFailure(Throwable reason) { 11 Window.alert("Error con UI pesada"); 12 13 } 14 });
  • 35. Seguridad GWT • GWT no tiene como seguir una sesión de usuario así que debe seguirse por medio de un servicio RCP. • GWT no realiza comprobaciones cuando se modifica el contenido HTML desde fuera del entorno GWT. • Se debe tener cuidado con el uso de cadenas obtenidas desde el cliente y el procesamiento de request Json o Xml. • Evitar el uso de JSNI
  • 37. Modelo de Sesión GWT 1 public String login(String usuario, String password){ 2 if("admin".equals(usuario) && "admin".equals(password)){ 3 HttpSession session = this.getThreadLocalRequest().getSession(true); 4 session.setAttribute(USER_LOGED_VAR, "usuario autenticado"); 5 return "Usuario logueado"; 6 } 7 else{ 8 return "Usuario o contraseña invalidas"; 9 } 10 } 11 public Boolean checkSession() { 12 HttpSession session = this.getThreadLocalRequest().getSession(false); 13 Boolean respuesta= Boolean.FALSE; 14 if(session != null && session.getAttribute(USER_LOGED_VAR) != null){ 15 respuesta = Boolean.TRUE; 16 } 17 return respuesta; 18 } 19 public void logoff() { 20 HttpSession session = this.getThreadLocalRequest().getSession(false); 21 if(session!=null){ 22 session.setAttribute(USER_LOGED_VAR, null); 23 session.invalidate(); 24 }
  • 38. Seguridad XSS • La seguridad respecto a los ataques XSS se validan mediante una programación rigurosa, reduciendo y evitando los vectores de ataque mas comunes como: – Evitando JavaScript en la HostPage que ejecuta la aplicación GWT – Evitando código que llame directamente el innerHTML de los widgets – Usar JSON API para parsear cadenas inseguras o de fuentes desconocidas – Usar JavaScript que use la función eval – Si se usa JSNI evitar código inseguro como usar innerHTML, eval o escribiendo directamente con document.write
  • 39. Seguridad XSS • Se debe inspeccionar y escapar cualquier cadena que se use como innerHTML • Verificar y escapar cualquier cadena que se pase al parser JSON de GWT
  • 40. Seguridad XSRF • Los ataques pueden ser el robo de la cookie de sesión y una manera para solucionar esto es haciendo uso del RequestBuilder para enviar el valor de la cookie de sesión, si este valor llega al servidor como un valor diferente al esperado, se trata de un ataque XSRF.
  • 41. Seguridad XSRF (Servidor indicar sesión) 1 public String login(String usuario, String password){ 2 if("admin".equals(usuario) && "admin".equals(password)){ 3 HttpSession session = this.getThreadLocalRequest().getSession(true); 4 session.setAttribute(USER_LOGED_VAR, "usuario autenticado"); 5 String sessionId= createUID(); 6 session.setAttribute(USER_SESSION_ID, sessionId); 7 this.getThreadLocalResponse().addCookie(new Cookie(USER_SESSION_ID, sessionId)); 8 return "Usuario logueado"; 9 } 10 else{ 11 return "Usuario o contraseña invalidas"; 12 } 13 }
  • 42. Seguridad XSRF (Request Por RequesBuilder) 1 RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url); 2 rb.setHeader("uuid", Cookies.getCookie("uuid")); 3 rb.sendRequest(null, myCallback);
  • 43. Seguridad XSRF (Servidor verificar cookie) 1 private Boolean verificarCookie(HttpServletRequest request, HttpServletResponse response){ 2 Boolean respuesta = Boolean.FALSE; 3 String headerValue = request.getHeader(USER_SESSION_ID); 4 String value = (String) request.getSession(false).getAttribute(USE R_SESSION_ID); 5 if(value.equals(headerValue)){ 6 respuesta = Boolean.TRUE; 7 } 8 return respuesta; 9 }
  • 44. Seguridad XSRF Para Servicios RCP (Servidor) • Se debe agregar referebcua a el servlet XsrfTokenServiceServlet <servlet> <servlet-name>xsrf</servlet-name> <servlet-class> com.google.gwt.user.server.rpc.XsrfTokenService Servlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>xsrf</servlet-name> <url-pattern>/gwt/xsrf</url-pattern> </servlet-mapping>
  • 45. Seguridad XSRF Para Servicios RCP (Servidor) • Se debe agregar un parámetro de contexto el cual identifiqué la cookie con la cual se debe realizar la verificación. <context-param> <param-name>gwt.xsrf.session_cookie_name</param- name> <param-value>JSESSIONID</param-value> </context-param>
  • 46. Seguridad XSRF Para Servicios RCP (Servidor) • Los servicios RCP que deba implementar proteccion XSRF, deben heredar de la clase XsrfProtectedServiceServlet. public class MyServiceImpl extends XsrfProtectedServiceServlet implements
  • 47. Seguridad XSRF Para Servicios RCP (Cliente) • Las interfaces que definen los servicios deben heredar de la interface XsrfProtectedService. • O las Interfaces deben ser anotadas con @XsrfProtect. • Las llamadas deben de obtener un tocken antes de cada petición del Servlet XsrfTokenService y luego adjuntar en su llamada el token obtenido.
  • 48. Seguridad XSRF Para Servicios RCP (Cliente) 1 XsrfTokenServiceAsync xsrf = (XsrfTokenServiceAsync)GWT.create(XsrfTokenService.class); 2 ((ServiceDefTarget)xsrf).setServiceEntryPoint(GWT.getModuleBaseURL() + "xsrf"); 3 xsrf.getNewXsrfToken(new AsyncCallback<XsrfToken>() { 4 5 public void onSuccess(XsrfToken token) { 6 MyServiceAsync rpc = (MyServiceAsync)GWT.create(MyService.class); 7 ((HasRpcToken) rpc).setRpcToken(token); 8 9 // make XSRF protected RPC call 10 rpc.doStuff(new AsyncCallback<Void>() { 11 // ... 12 }); 13 } 14 15 public void onFailure(Throwable caught) { 16 try { 17 throw caught; 18 } catch (RpcTokenException e) { 19 // Can be thrown for several reasons: 20 // - duplicate session cookie, which may be a sign of a cookie 21 // overwrite attack 22 // - XSRF token cannot be generated because session cookie isn't 23 // present 24 } catch (Throwable e) { 25 // unexpected 26 } 27 });
  • 49. JSNI (JavaScript Native Interface) • Código JavaScript creado como un comentario de un método marcado como nativo. • Permite la llamada de código Java desde los métodos marcados como nativo.
  • 50. JSNI (JavaScript Native Interface) 1 // Expose the following method into JavaScript. 2 private static String formatAsCurrency(double x) { 3 return NumberFormat.getCurrencyFormat().format(x); 4 } 5 6 // Set up the JS-callable signature as a global JS function. 7 private native void publish() /*-{ 8 $wnd.formatAsCurrency = 9 @org.example.yourcode.format.client.DateFormatterLib::formatAsCurre ncy(D); 10 }-*/; 11 12 // Auto-publish the method into JS when the GWT module loads. 13 public void onModuleLoad() { 14 publish(); 15 }
  • 51. Usando una Función JNDI 1 <html> 2 <head> 3 4 <-- Include the GWT module that publishes the JS API --> 5 <script src="org.example.yourcode.FormatLib.nocache.js"></sc ript> 6 7 <-- Write some JS that uses that GWT code --> 8 <script> 9 function doStuff() { 10 alert(formatAsCurrency(1530281)); 11 } 12 </script> 13 </head>
  • 52. Usando una función Java desde JNDI 1 package org.example.foo; 2 public class Flipper { 3 4 public native void flipName(String name) /*-{ 5 var re = /(w+)s(w+)/; 6 var s = name.replace(re, '$2, $1'); 7 this.@org.example.foo.Flipper::onFlip(Ljava/lang/S tring;)(s); 8 }-*/; 9 10 private void onFlip(String flippedName) { 11 // do something useful with the flipped name 12 }
  • 53. IoC en GWT, GIN • Gin es una librerías que nos permite utilizar IoC en el código GWT, para facilitar el uso de algunos servicios complejos y aumentar el desacoplamiento de los diferentes artefactos de software. • Eliminar el código boilaparte o repetitivo el cual hace crecer de manera innecesaria la complejidad del código.
  • 54. GIN • El modulo debe heredar del modulo Inject <module> ... <inherits name="com.google.gwt.inject.Inject"/> ... </module>
  • 55. GIN • Definir la el Ginjector, el cual será la clase que hará de contrato para implementar los tipos que se desea instanciar sin codificación directa. public interface SimpleInjector extends Ginjector { MainUi getMainUi(); LoginServiceAsync getLoginServiceAsync(); LoginService getLoginService(); }
  • 56. GIN • Declarar el enlace entre varias clases y proveedores public class SimpleInjectorImpl extends AbstractGinModule { protected void configure() { bind(MainUi.class).in(Singleton.class); bind(LoginServiceAsync.class).toProvider(LoginServiceIPro viderAsync.class); bind(LoginService.class).toProvider(LoginServiceIProvide.cla ss); } }
  • 57. GIN • Anotar la interface marcada como injector con @GinModules(ClaseImplInjector.class) @GinModules(SimpleInjectorImpl.class) public interface SimpleInjector extends Ginjector { MainUi getMainUi(); LoginServiceAsync getLoginServiceAsync(); LoginService getLoginService(); }
  • 58. GIN • Finalmente para usar el injector que definimos debemos hacer uso del metodo GWT.create(injectorinterace.class) public class GWTModule implements EntryPoint { private final SimpleInjector injector = GWT.create(SimpleInjector .class); public void onModuleLoad() { MainUi mainPanel = injector.getMainPanel(); RootPanel.get().add(mainPanel); } }
  • 59. GIN • También existe la inyección diferida, la cual se ejecuta en tiempo de ejecución. public interface MyConstants extends Constants { String myWords(); } public class MyWidget { @Inject public MyWidget(MyConstants myconstants) { // The injected constants object will be fully initialized - // GWT.create has been called on it and no further work is necessary. } }
  • 60. GIN • Inyección diferida para servicios remoto RPC public interface MyRemoteService extends RemoteService { ... } public interface MyRemoteServiceAsync { ... } public class MyWidget { @Inject public MyWidget(MyRemoteServiceAsync service) { // The 'service' will be created by calling GWT.create(MyRemoteService.class) // prior to injection. } }
  • 61. GWT Logging • GWT soporta Logging a través de la API de Logging de java. • El modulo deberá heredar del modulo Logging <inherits name="com.google.gwt.logging.Logging"/> <set-property name="gwt.logging.logLevel“ value="SEVERE"/> # To change the default logLevel <set-property name="gwt.logging.enabled" value="FALSE"/> # To disable logging <set-property name="gwt.logging.consoleHandler" value="DISABLED"/> # To disable a default Handler
  • 62. GWT Logging • Los loggers, implementan handlers, estos handler manejan donde se muestra la información sobre los eventos que se logean, existen varios loggers como: – SystemLogHandler – DevelopmentModeLogHandler – ConsoleLogHandler – PopupLogHandler – SimpleRemoteLogHandler
  • 63. GWT Logging • El logging remoto, el cual debe usarse junto con un Servlet. gwt.xml 1 < inherits name="com.google.gwt.logging.Logging" > 2 < set-property name="gwt.logging.simpleRemoteHand ler" value="ENABLED" > 3 < /set-property > 4 < /inherits > web.xml 1 < servlet > 2 < servlet- class>com.google.gwt.logging.server.RemoteLoggingServiceIm pl </servlet-class > 3 < servlet-name >logger < /servlet-name > 4 < /servlet > 5 < servlet-mapping > 6 < servlet-name>logger </servlet-name > 7 < url-pattern>/YOURPROJECT/remote_logging </url-pattern > 8 < /servlet-mapping >
  • 64. GQuery • Gquery es un port de Jquery para GWT, el cual permite realizar las tareas de manipulación DOM de una manera mas sencillas y seguras. • Es gratuito y se puede conseguir en: – http://code.google.com/p/gwtquery/
  • 65. GQuery 1 import static com.google.gwt.query.client.GQuery.*; 2 import com.google.gwt.query.client.Function; 3 4 public void onModuleLoad() { 5 //Hide the text and set the width and append an h1 element 6 $("#text").hide() 7 .css("width", "400px") 8 .prepend("<h1>GwtQuery Rocks !</h1>"); 9 10 //add a click handler on the button 11 $("button").click(new Function(){ 12 public void f() { 13 //display the text with effects and animate its background color 14 $("#text").as(Effects) 15 .clipDown() 16 .animate("backgroundColor: 'yellow'", 500) 17 .delay(1000) 18 .animate("backgroundColor: '#fff'", 1500); 19 } 20 }); 21 }