↓ Arquivo ↓

Arquivo → outubro - 2009

Introdução ao UIBinder do GWT 2.0

Uma das grandes novidades do GWT 2.0 é o UIBinder. UIBinder é uma funcionalidade que permite que você separe o layout da aplicação da parte de “negócio”(validações, interações com o servidor, etc.). Permite que você deixe toda a parte de layout separadas em arquivos XML, deixando para os arquivos Java (que irão ser compilados e transformados em Javascript) somente o que importa do código. Essa funcionalidade facilita bastante as coisas, pois melhora o entendimento e a ajuda na hora de dar manutenção no código fonte das telas.  Aposto que quem já utilizou JSF (principalmente o 2.0) e o Adobe Flex, irá se sentir em casa.

Vou dar um exemplo simples, que não é um Hello World como você conhece. È só um formulário com dois campos, que adiciona tudo o que é preenchido em uma tabela. Não envolve comunicação com o servidor e nem nada. È só para dar pano de fundo para mostrar como funciona todos os elementos que fazem o UIBinder funcionar. Bom, vamos parar de blá blá blá e vamos para o que interessa.

Primeiramente, vamos configurar o módulo do UIBinder no GWT 2.0. Acredito que você já tenha um projeto GWT 2.0 criado e funcionando neste momento. Se não tiver, leia antes o tutorial que escrevi sobre. Para configurar e habilitar o UIBinder no GWT 2.0, apenas adicione a seguinte linha no seu arquivo de configuração do GWT(*.gwt.xml) :

<inherits name=’com.google.gwt.uibinder.UiBinder’/>

Depois disso vamos criar o arquivo de tela. O nome que estou dando para o mesmo é HelloWorld(tá, é um Hello World) que está no pacote ‘com.serathiuk.gwt2teste.client’ no meu caso. Sinta-se livre para mudar. O nome do arquivo será HelloWorld.ui.xml. Detalhe para o ‘ui.xml’, pois esse é o padrão da framework.

<!– Arquivo HelloWorld.ui.xml –>

<?xml version=”1.0″ encoding=”UTF-8″?>

<ui:UiBinder xmlns:ui=’urn:ui:com.google.gwt.uibinder’

xmlns:g=’urn:import:com.google.gwt.user.client.ui’>

<g:HTMLPanel>

Nome: <g:TextBox ui:field=”txtNome” /><br/>

E-mail: <g:TextBox ui:field=”txtEmail” /><br/>

<g:Button ui:field=”btnTeste” text=”Teste” />

<br/>

<g:FlexTable ui:field=”flexTable”/>

</g:HTMLPanel>

</ui:UiBinder>

Agora iremos criar o arquivo HelloWorld.java, que se encontra no mesmo pacote que o arquivo de tela(HelloWorld.ui.xml).

//Arquivo HelloWorld.java

package com.serathiuk.gwt2teste.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class HelloWorld extends Composite {

interface Binder extends UiBinder {}

private static Binder binder = GWT.create(Binder.class);

@UiField Button btnTeste;

@UiField TextBox txtNome;

@UiField TextBox txtEmail;

@UiField FlexTable flexTable;

public HelloWorld() {
initWidget(binder.createAndBindUi(this));
}

@UiHandler(“btnTeste”)
public void onClickBtnTeste(ClickEvent event) {
int num = flexTable.getRowCount();
flexTable.setText(num, 0, txtNome.getValue());
flexTable.setText(num, 1, txtEmail.getValue());
}

@UiHandler(“txtNome”)
public void onChangeTxtNome(ChangeEvent event) {
Window.alert(txtNome.getValue());
}

}

E como ficou meu onModuleLoad do meu EntryPoint:

public void onModuleLoad() {
RootPanel.get().add(new HelloWorld());
}

O UIBinder funciona da seguinte maneira. No arquivo XML da tela, temos os componentes TextBox txtNome e txtEmail e existe um Button chamado btnTeste. Também tem uma FlexTable com o nome flexTable. Você já deve ter percebido que todos esses componentes tem o atributo “ui:field”.  Esse atributo é responsável por dizer qual será o atributo da classe Java que aquele componente representa. Na classe Java, temos os atributos txtNome, txtEmail, btnTeste e flexTable também, e eles estão anotados com a annotation “UIField”.  Essa anotação é responsável por dizer que aquele atributo representa um componente na tela. O atributo deve ter o mesmo nome que o correspondente na tela, e não pode ser private. Você não precisa se preocupar em instanciar esse atributo, pois via Injeção de Dependência, o próprio GWT se encarrega disso. Você pode trabalhar normalmente com o componente, mudando tamanho, configurações, etc… pelo Java. Mas recomendo deixar essas coisas para o arquivo de tela.

Para adicionar um evento a um componente é simples. É criado um método, com qualquer nome que desejar, e utiliza a annotation ‘UiHandler’ neste método. Essa annotation irá receber um valor, que é o componente da tela que ele representa. Em nosso exemplo existem 2. O ‘onClickBtnTeste’ e o ‘onChangeTxtNome’, que poderiam ser trocados facilmente por ‘aoClicarNoBtnTeste’ e ‘aoAlterarTxtNome’. Vai do gosto do freguês.  E eles sempre iriam ser chamados quando o botão fosse clicado no primeiro caso, ou quando o nome fosse alterado, no segundo caso.

Mas você deve estar se perguntando: “O nome do método pode ter o nome que eu desejar, e o campo Nome pode ter mais de um tipo de evento, mas não é especificado na annotation qual evento que eu quero. Como ele sabe é aquele método deve ser chamado no onChange?”. È pelo parâmetro que é passado no método. No caso do onClickBtnTeste, ele recebe como parâmetro um objeto da classe ClickEvent, enquanto o onChangeTxtNome recebe como parâmetro um objeto da classe ChangeEvent. Se um dia resolver mudar o tipo de evento que aquele método representa, basta apenas alterar o parâmetro para o correspondente da ação que você deseja.

Lembrando que no objeto do parâmetro vem muitas informações úteis, como o componente que invocou esse evento, funcionalidade de parar o evento e algumas coisas a mais.

Acho que deu para entender como começar a utilizar o UIBinder. Acredito que ele se tornará o novo padrão para desenvolvimento com GWT, e acredito que nas próximas versões do Google Plugin, teremos mais facilidades para utiliza-lo. Não demorará muito para aparecer RAD’s utilizando a tecnologia.

Qualquer crítica, sugestão e essas coisas entrem em contato. :)

Utilizando o Google Web Toolkit(GWT) 2.0 Milestone 2 no Eclipse com Debug

No último artigo, mostrei como configurar uma aplicação GWT 2.0 no Eclipse, com o Google Plugin, mas o Debug não funciona corretamente utilizando aquela configuração. È preciso algumas alterações para a aplicação funcionar corretamente. O tutorial leva em conta que você seguiu todos os passos do tutorial anterior.

1)      Vá nas configurações de Build Path, Libraries e adicione o gwt-servlet.jar e dê um ok.

2)      Vá em Run Configurations, crie um novo em “Java Application”.

3)       Em Project coloque o projeto atual.

4)      Em Main Class, coloque a classe ‘com.google.gwt.dev.DevMode’.

5)      Marque os items “include system libraries…” e o  “Include Inherited mains…”

6)      Mude para aba arguments

7)      Em “Program arguments” coloque o seguinte valor: “-startupUrl <Arquivo HTML> <Endereço do Arquivo XML do GWT>”. Ex.: “-startupUrl GWT20Teste.html com.serathiuk.gwt2teste.GWT20Teste”

8)      Em VM Arguments coloque o valor: “-Xmx256M”

9)      Em Classpath, em Users Entries, adicione o gwt-servlet.jar, a biblioteca do GWT e o diretório src da aplicação.

10)   Dê um Run e teste agora. :)

Utilizando o Google Web Toolkit(GWT) 2.0 Milestone 1 com o Google Plugin no Eclipse

Para utilizar o GWT 2.0 MS1 no Eclipse, é só seguir os seguintes passos:

  1. Baixe o GWT 2.0 no seguinte link: http://google-web-toolkit.googlecode.com/files/gwt-2.0.0-ms1.zip
  2. Descompacte o arquivo em um diretório de sua referência.
  3. Renomeie o arquivo gwt-dev.jar para gwt-dev-windows.jar
  4. Vá em Help, Check For Updates, e veja se tem alguma atualização do Google Plugin. Se tiver, instale-a.
  5. No Eclipse, já com o Eclipse Plugin instalado, vá em Project > Properties >  Google > Web Toolkit e clique em Configure SDK.
  6. Clique em Add e aponte para o diretório do GWT 2.0 e dê “Ok” em tudo
  7. Agora é só criar um projeto normalmente.

O GWT 2.0 não tem mais o “Dev Mode” do modo antigo, que era um browser próprio do GWT. Agora o “Dev Mode” apenas inicia um webserver(Jetty), e você deve instalar um plugin no browser de uma preferência para desempenhar a função do antigo browser embutido. O link para os plugins para os principais browsers:

Google Chrome

Instale a seguinte extensão: http://google-web-toolkit.googlecode.com/svn/trunk/plugins/npapi/prebuilt/gwtdmp.crx

Mozilla Firefox

Firefox 2(Mac PPC/x86, Linux x86/x86_64): http://google-web-toolkit.googlecode.com/svn/trunk/plugins/xpcom/prebuilt/gwt-dmp-ff2.xpi

Firefox 3(Win x86, Mac PPC/x86, Linux x86/x86_64): http://google-web-toolkit.googlecode.com/svn/trunk/plugins/xpcom/prebuilt/gwt-dmp-ff3.xpi

Firefox 3.5(Win x86, Mac PPC/x86, Linux x86/x86_64): http://google-web-toolkit.googlecode.com/svn/trunk/plugins/xpcom/prebuilt/gwt-dmp-ff35.xpi

Safari 3 e 4(apenas MacOS)

Baixe e instale a seguinte imagem: http://google-web-toolkit.googlecode.com/svn/trunk/plugins/webkit/prebuilt/oophm.dmg

Internet Explorer 6, 7 e 8(apenas 32 bits)

Baixe e instale o seguinte instalador: http://google-web-toolkit.googlecode.com/svn/trunk/plugins/ie/prebuilt/GwtDevModeIePluginInstaller.msi

Lançado o Google Web Toolkit (GWT) 2.0 Milestone 1

Hoje foi lançada a versão Milestone 1 do GWT 2.0. Essa versão vem sendo muito aguardada, pois é a que traz o maior número de novidades significativas desde a primeira versão do framework. A ultima grande mudança foi na versão 1.5, que trouxe a posssibilidade de codicar em Java 1.5. Anteriormente era apenas em Java 1.4, e com muitas limitações. Mas falando sobre a 2.0, as novidades que ela traz:

  • In-Browser Development Mode: Na minha opinião, a funcionalidade mais significativa. Você não fica mais preso ao browser padrão do GWT(no caso do Windows, o IE) para debugar. Você escolhe qual browser quer usar para ‘debug’. Algumas bibliotecas do GWT(GWT-EXT, GXT e SmartGwt por exemplo) tem problemas com compatibilidade com os browsers as vezes, ou erros que não são apresentados no Hosted Mode. Para aplicações grandes, que levam um certo tempo para compilar, para testar o sistema em browsers de verdade se torna um tanto quanto demorado. Agora não. Rode em modo ‘debug’ no browser que desejar, até em mais de 1 ao mesmo tempo, sem precisar compilar o projeto. Isso vai agilizar muito o processo de desenvolvimento.
  • Code Splitting: A aplicação não é mais monolítica. Nas versões anteriores do GWT, ele gerava um arquivo de Javascript único, onde estava toda a aplicação. Isso não é um problema para aplicações pequenas, mas para aplicações grandes em que o arquivo Javascript pode atingir facilmente uns 4MB, a coisa pode mudar bastante.
  • Declarative User Interface: Criação de interface de forma declarativa. Agora o GWT possui uma linguagem para criar telas. Em vez de criar as telas com Java, agora você cria com XML, assim como funciona no Adobe Flex por exemplo.
  • Bundling of resources (ClientBundle): Gerenciamento mais eficiente de recursos, como CSS, imagens, etc…
  • HtmlUnit e independencia de plataforma: Agora o GWT é independente de plataforma. Não vai mais existir 1 distribuição para cada S.O. O Browser e a Engine de testes baseada em SWT foram abandonadas, agora com uma implementação 100% Java.

Ainda não testei essa versão. Mas em breve irei fazer uma resenha mais a fundo sobre.

Download: http://google-web-toolkit.googlecode.com/files/gwt-2.0.0-ms1.zip