Você está na página 1de 10

Maurcio Linhares de Arago Junior http://maujr.

org/

AJAX em Java com o Google Web Toolkit


Maurcio Linhares de Arago Junior
AJAX rpido, fcil e puro Java com o Google Web Toolkit

Introduo
O desenvolvimento de aplicaes que utilizam o conjunto de tecnologias que hoje so chamadas de AJAX j lugar comum, mas todo esse movimento trouxe novos problemas, como o aumento considervel da quantidade de cdigo JavaScript em aplicaes web. Essa volta do JavaScript a tona no mercado trouxe problemas da no to distante guerra dos navegadores web, onde cada fornecedor (na poca a Microsoft e a Netscape) implementavam a linguagem JavaScript de uma forma diferente. Isso terminou por gerar problemas, principalmente para os desenvolvedores, que tinham reescrever partes interas das aplicaes para garantir a compatibilidade entre os diversos navegadores. A implementao diferenciada do AJAX pelos navegadores atuais trouxe mais uma vez o fantasma da incompatibilidade do JavaScript para a vida dos desenvolvedores. Hoje, com o grande apelo dessa nova tecnologia, surgiram diversos frameworks que prometem simplificar o desenvolvimento de aplicaes utilizando AJAX e um destes frameworks o Google Web Toolkit (GWT), desenvolvido dentro do Google e liberado pelos seus desenvolvedores como software livre. Diferentemente de outros frameworks, que normalmente fazem com que voc ainda tenha que escrever ganchos em JavaScript para a sua aplicao utilizar as facilidades do AJAX, o GWT deixa com que voc escreva o cdigo da aplicao completamente em Java, para que voc possa ter todas as facilidades que o desenvolvimento Java prov, como ambientes de desenvolvimento integrados de alta qualidade, tipagem esttica e debug nativo. Aps escrita a aplicao, um compilador especial transforma o cdigo Java em cdigo JavaScript, para que ele possa executar no navegador cliente. E como voc j deve imaginar, os desenvolvedores do projeto se preocuparam com a compatibilidade e fizeram com que o cdigo gerado fosse garantidadamente compatvel com os navegadores mais utilizados da atualidade. A abordagem to GWT, entretanto, tem uma desvantagem, pois como o cdigo Java transformado em cdigo JavaScript para executar no navegador, apenas algumas classes do Java esto disponveis para uso (em sua maioria classes dos pacotes java.lang e java.util) e funcionalidades avanadas da linguagem (como acesso a bancos de dados) tem que ser feitos utilizando o suporte a invocao remota de mtodos do GWT, que faz a ponte entre a aplicao no navegador e o cdigo Java no servidor.

Preparando o ambiente
Antes de continuar, necessrio que voc faa o download do arquivo que contm o framework, ele est disponvel em (infelizmente s existem verses das ferramentas de desenvolvimento para Windows e Linux, mas as aplicaes geradas executam na maioria dos navegadores): http://code.google.com/webtoolkit/download.html Alm do framework, interessante que voc utilize um ambiente de desenvolvimento (como o Eclipse ou NetBeans) e tenha tambm o Ant instalado na sua mquina. O Ant est disponvel em: http://ant.apache.org/ Aps fazer o download do arquivo do framework, voc deve colocar a pasta descompactada no PATH do seu sistema operacional, para que as ferramentas de linha de comando possam ser executadas com facilidade. Ao instalar o Ant, lembrese de definir a varivel de ambiente JAVA_HOME apontando pro diretrio onde foi instalado o seu Java Development Kit (JDK) e de colocar a pasta bin da instalao do Ant tambm no PATH do seu sistema operacional, para poder executar as chamadas ao Ant pela linha de comando.

Primeiros passos
Nossa aplicao de exemplo um visualizador de itinerrios de viagens, com suas cidades de origem e destino e o nome da empresa que faz a viagem. Para iniciar um projeto com o GWT, ns vamos utilizar as ferramentas utilitrias do projeto, que so os arquivos executveis que ficam na pasta do projeto que voc j colocou no PATH no passo anterior. Para criar o projeto, precisamos primeiro ir at a pasta na qual ns gostaramos que ele se encontre no console e executar o utilitrio projectCreator:
GUJ http://www.guj.com.br Pgina 1

Maurcio Linhares de Arago Junior http://maujr.org/

projectCreator ant GWTTutorial eclipse GWTTutorial

Esse comando vai instruir a ferramenta a criar um buildfile do Ant com o nome GWTTutorial.ant.xml e os arquivos de configurao necesrios para transformar esse projeto em um projeto do Eclipse. Aps criados os arquivos, voc pode importar esse projeto para dentro do Eclipse utilizando a importao de projetos. Com o ambiente preparado e o projeto montado, precisamos comear a aplicao. Para criar a aplicao ns vamos utilizar outro utilitrio do framework, o applicationCreator, que monta uma aplicao esqueleto para que ns possamos continuar nossos primeiros passos com o GWT. Para executar a ferramenta, v para a mesma pasta na qual o projeto foi criado no console e execute: applicationCreator eclipse GWTTutorial org.maujr.gwt.tutorial.client.GWTTutorial

Aps este comando voc vai ver que vrios novos arquivos foram criados, os mais importantes so o GWTTutorial-shell que executa a aplicao no hosted mode, que o modo de desenvolvimento das aplicaes GWT. Ele facilita o desenvolvimento das aplicaes porque voc no vai precisar implantar a aplicao em um servidor web Java pra ver ela em funcionamento, o prprio GWT j tem um servidor embutido (junto com um navegador) para que voc possa testar suas aplicaes. O outro arquivo o GWTTutorial-compile, que compila as suas classes Java e as transforma em JavaScript para que elas sejam executadas no navegador. O nome do pacote criado deve, preferivelmente, terminar com o nome client, porque esse o pacote onde vo estar as classes e interfaces que vo ser transformadas em JavaScript para executar no cliente. Alm desse pacote, o GWT cria um pacote public onde vo estar disponveis os arquivos de recursos para a aplicao (como os arquivos HTML, CSS e imagens). O outro pacote que pode existir o server que guarda as classes que no so transformadas em JavaScript e so utilizadas atravs da API de invocao de servios remotos do GWT. Os nomes das pastas configurvel, mas uma boa prtica manter os nomes padro para evitar dores de cabea futuras com configuraes. Se voc seguiu todos os passos corretamente, execute o arquivo GWTTutorial-shell, se tudo estiver funcionando normalmente, voc deve ver a seguinte tela:

Figura 1 - Execuo da aplicao criada pelo GWT

Das duas janelas que abrem, uma um debugger com informaes sobre o servidor (a que est atrs) e a outra um navegador web (na verdade, o navegador web do seu computador, que est sendo invocado pela biblioteca SWT) que quem est realmente mostrando a aplicao web executando. Como voc j percebeu, no
GUJ http://www.guj.com.br Pgina 2

Maurcio Linhares de Arago Junior http://maujr.org/

uma pgina com nada de especial, mas ela est assim porque ns ainda no adicionamos nada de especial nela, mas agora que tudo est pronto e configurado, podemos iniciar o desenvolvimento do nosso sistema de gerenciamento de contatos. O cdigo que gera esta pgina extremamente simples e demonstra como tambm simples trabalhar com o GWT:
Listagem 1. Cdigo inicial gerado pelo GWT public class GWTTutorial implements EntryPoint { /** * This is the entry point method. */ public void onModuleLoad() { final Button button = new Button("Click me"); final Label label = new Label(); button.addClickListener(new ClickListener() { public void onClick(Widget sender) { if (label.getText().equals("")) label.setText("Hello World!"); else label.setText(""); } }); // Assume that the host HTML has elements defined whose // IDs are "slot1", "slot2". In a real app, you probably would not want // to hard-code IDs. Instead, you could, for example, search for all // elements with a particular CSS class and replace them with widgets. // RootPanel.get("slot1").add(button); RootPanel.get("slot2").add(label);

Todas as aplicaes GWT se iniciam em uma classe que implementa a interface EntryPoint, que define o mtodo onModuleLoad() chamado quando a aplicao comea a executar para no cliente. aqui que ns fazemos a inicializao da interface da aplicao para ser mostrada no navegador. Como j havia sido dito, todo o cdigo escrito Java puro, primeiro instanciado um objeto do tipo Button, com o texto Click Me, depois instanciado um Label sem texto. Adicionamos um listener para o clique do boto, que coloca ou limpa o texto do Label e finalmente adicionamos os objetos criados a interface do navegador. A parte mais estranha do cdigo exatamente o final, onde fazemos uma chamada ao mtodo esttico get() da classe RootPanel. O RootPanel simboliza a pgina atual onde a aplicao est executando e o String passado como parmetro o valor do id HTML das tags onde esse contedo vai ser adicionado. Nos arquivos gerados durante a chamada ao applicationCreator h um arquivo HTML que exatamente o arquivo criado pelo projeto para conter a nossa aplicao. A parte onde essas tags so declaradas a seguinte:
Listagem 2 /src/org/maujr/gwt/tutorial/public/GWTTutorial.html - Tags HTML onde os componentes vo ser adicionados <table align=center> <tr> <td id="slot1"></td><td id="slot2"></td> </tr> </table>

Ento, a chamada ao mtodo get() do RootPanel retorna uma referncia para as tags HTML referenciadas nesse arquivo e identificadas pelo id correspondente. O boto colocado a esquerda, no slot1 e o Label colocado a direita no slot2.

Desenvolvendo a aplicao
Para iniciar a nossa aplicao, vamos fazer algumas modificaes no cdigo gerado pelo GWT. Ns temos que adicionar espaos para colocar a lista de cidades de destino, a lista das cidades de origem e a tabela que vai mostrar o resultado da nossa busca. Para fazer isso, ns adicionamos algumas tags HTML onde antes havia a tabela que o exemplo mostrava a mensagem e o boto. Vejamos o cdigo:
GUJ http://www.guj.com.br Pgina 3

Maurcio Linhares de Arago Junior http://maujr.org/

Listagem 3 /src/org/maujr/gwt/tutorial/public/GWTTutorial.html - Novas tags para os componentes <div id="left"> <strong>Destinos</strong> <span id="destinos"></span> <br/> <strong>Origens</strong> <span id="origens"></span> <br/> </div> <div id="center"> <p><strong>Viagens</strong></p> <div id="viagens"></div> </div>

Apenas adicionamos alguns novos espaos para os nossos componentes (definindo tags com id). A definio dos IDs necessria para que possamos referenciar estes espaos e adicionar componentes neles utilizando a chamada ao mtodo get() da classe RootPanel. No lugar da tag identificada com destinos ns vamos ter um conjunto de checkboxes com os nomes das cidades assim como na tag identificada com origens.

Acessando dados no servidor


O objetivo principal da nossa aplicao, mostrar as viagens, com suas origens e destinos, conforme a seleo feita pelo usurio, mas as viagens ficam guardadas no servidor e ns no temos como enviar todas as informaes para a aplicao cliente, pois os dados no servidor podem ser atualizados e o cliente deve ser capaz de responder a este tipo de mudana. Alm disso, os dados no servidor podem estar guardados em vrios tipos de armazenamento diferentes, como bancos de dados relacionais ou arquivos XML e sendo o nosso cliente uma aplicao JavaScript, no temos todo o poder do Java para fazer buscas nestes meios. Para esse tipo de problema, o GWT tem uma soluo simples, a invocao remota de servios. A aplicao JavaScript que executa no cliente faz uma invocao a um servio implementado no servidor (atravs de um Servlet) que pode ento se utilizar de toda a expressividade e APIs do Java para retornar os dados para o cliente, como o JDBD, acesso a arquivos, EJB/Hibernate e outros. Para criar um servio que vai ser invocado, precisamos inicialmente definir a interface do servio. Essa interface deve obrigatoriamente estender a interface de marcao com.google.gwt.user.client.rpc.RemoteService e os seus mtodos so automaticamente definidos como mtodos invocveis remotamente. Essa interface deve ser declarada dentro do pacote client da aplicao. Vejamos a interface do nosso servio: Listagem 4 Interface do servio de busca de viagens
package org.maujr.gwt.tutorial.client; import com.google.gwt.user.client.rpc.RemoteService; public interface BuscaViagensService extends RemoteService { public Viagem[] getViagens( String[] origens, String[] destinos); }

O nosso servio fornece apenas um mtodo para ser invocado, que recebe dois arrays de Strings, um com as origens e outro com os destinos das viagens e retorna um array de viagens que estejam em conformidade com os parmetros indicados. O GWT consegue enviar diretamente objetos comuns do Java, como todos os tipos primitivos, Strings e Dates (junto com suas representaes como arrays), mas os tipos definidos pelo usurio (como a nossa Viagem) precisam de um tratamento especial. As classes definidas pelo usurio que necessitem ser enviadas por invocaes remotas devem implementar a interface de marcao com.google.gwt.user.client.rpc.IsSerializable e ter como propriedades apenas outros objetos que tambm implementem essa interface ou os objetos comuns do Java citados anteriormente. Vejamos a nossa classe Viagem: Listagem 5 Classe viagem, que modela o nosso itinerrio e a empresa que o faz
package org.maujr.gwt.tutorial.client; import com.google.gwt.user.client.rpc.IsSerializable; public class Viagem implements IsSerializable { private String origem; private String destino; private String empresa; GUJ http://www.guj.com.br Pgina 4

Maurcio Linhares de Arago Junior http://maujr.org/

// mtodos get/set e construtores

Com a interface base do servio e o objeto que ele retorna definidos corretamente, ns precisamos definir uma interface assncrona para a execuo do servio no cliente. A definio da interface assncrona necessria porque a invocao ao servio utilizando AJAX acontece de forma assncrona, para o cliente, a aplicao no para de executar, a chamada ao servio acontece em background, ento necessrio definir a interface assncrona que vai ser a interface real do servio no cliente. Vejamos a interface assncrona do nosso servio: Listagem 6 Inteface assncrona do servio de busca de viagens
package org.maujr.gwt.tutorial.client; import com.google.gwt.user.client.rpc.AsyncCallback; public interface BuscaViagensServiceAsync { public void getViagens( String[] origens, String[] destinos, AsyncCallback callback ); }

A interface assncrona do servio tem as declaraes de mtodos praticamente iguais as da interface do servio definida anteriormente, mas os mtodos de servio agora devem retornar void e o ltimo parmetro deve ser um objeto do tipo com.google.gwt.user.client.rpc.AsyncCallback, que o objeto que vai funcionar como um listener do evento de execuo do servio. AsyncCallback uma interface que define dois mtodos, onSucess() que chamado quando o mtodo executa corretamente e tem como parmetro o resultado da invocao do servio (por isso o mtodo da interface assncrona retorna void) e onFailure() que chamado quando a chamada do servio no acontece de forma correta e recebe como parmetro um objeto do tipo Throwable com informaes sobre o erro acontecido. O nome da interface assncrona deve ser o mesmo nome da interface real do servio, adicionando o sufixo Async e as duas devem estar dentro do mesmo pacote. Com as interfaces do servio definidas, vamos implement-lo no servidor. Para fazer isso, criamos um objeto que estenda com.google.gwt.user.server.rpc.RemoteServiceServlet e implemente a interface real do servio (a BuscaViagensService). Esse objeto deve ficar dentro do pacote server no mesmo nvel do pacote client e public da sua aplicao, para que o GWT saiba que esse objeto no deve ser transformado em JavaScript, pois ele pode vir a fazer uso de vrias APIs do Java que no esto disponveis em JavaScript. Vejamos a nossa implementao do servio: Listagem 7 Implementao do servio de busca de viagens no servidor
public class BuscaViagensServiceImpl extends RemoteServiceServlet implements BuscaViagensService { private static List<Viagem> VIAGENS = new ArrayList<Viagem>(); static { VIAGENS.add(new VIAGENS.add(new VIAGENS.add(new VIAGENS.add(new VIAGENS.add(new VIAGENS.add(new VIAGENS.add(new VIAGENS.add(new VIAGENS.add(new } /** * Comentrio para <code>serialVersionUID</code> */ private static final long serialVersionUID = -7912694211530826639L; /* * (no-Javadoc) * * @see org.maujr.gwt.tutorial.client.BuscaViagensService#getViagens(java.lang.String, * java.lang.String, java.lang.String[]) */ public Viagem[] getViagens(String[] origens, String[] destinos) { boolean compararOrigens = origens != null && origens.length > 0 ? true : false; GUJ http://www.guj.com.br Pgina 5 Viagem(CIDADES[0], Viagem(CIDADES[7], Viagem(CIDADES[3], Viagem(CIDADES[2], Viagem(CIDADES[7], Viagem(CIDADES[6], Viagem(CIDADES[5], Viagem(CIDADES[0], Viagem(CIDADES[2], CIDADES[1], CIDADES[6], CIDADES[5], CIDADES[4], CIDADES[0], CIDADES[3], CIDADES[0], CIDADES[2], CIDADES[7], EMPRESAS[0] EMPRESAS[1] EMPRESAS[2] EMPRESAS[3] EMPRESAS[4] EMPRESAS[0] EMPRESAS[1] EMPRESAS[2] EMPRESAS[2] )); )); )); )); )); )); )); )); ));

Maurcio Linhares de Arago Junior http://maujr.org/

boolean compararDestinos = destinos != null && destinos.length > 0 ? true : false; Set<Viagem> resultado = new HashSet<Viagem>(); for (Viagem viagem : VIAGENS) { boolean adicionarOrigem = false; boolean adicionarDestino = false; if (!compararOrigens && !compararDestinos) { resultado.add(viagem); } else { if (compararOrigens) { adicionarOrigem = contains( viagem.getOrigem(), origens ); } if (compararDestinos) { adicionarDestino = contains( viagem.getDestino(), destinos ); } if (adicionarOrigem || adicionarDestino) resultado.add(viagem); } } Iterator<Viagem> iterator = resultado.iterator(); Viagem[] array = new Viagem[resultado.size()]; for (int x = 0; iterator.hasNext(); x++) { array[x] = iterator.next(); } } return array;

private static boolean contains(String nome, String[] array) { for ( String valor : array ) { if ( nome.equalsIgnoreCase(valor)) return true; } } return false; } } {

Para simplificar a execuo e entendimento do exemplo, o servio faz a busca em um conjunto de objetos definido estaticamente no Servlet e no em um banco de dados, mas isso no impede que voc altere o exemplo para fazer a pesquisa de qualquer outra forma ou em qualquer outro lugar. O intuito do exemplo apenas mostrar o que pode ser feito utilizando as funcionalidades da invocao remota de servios do GWT, dentro dessa classe, como voc tem acesso a todos os poderes do Java, vai poder utilizar o que quiser, bastando apenas que voc retorne o tipo de objeto que o servio espera receber.

Invocando o servio do cliente


Com o nosso servio definido e implementado, ns precisamos agora fazer com que ele seja invocado na nossa aplicao cliente. Para fazer isto e adicionar os componentes necessrios na nossa aplicao, ns vamos fazer algumas alteraes na nossa classe que carrega a aplicao no cliente. Vejamos a listagem 8 com a implementao da classe: Listagem 8 Implementao do ponto de entrada na aplicao
public class GWTTutorial implements EntryPoint, ClickListener, AsyncCallback { private BuscaViagensServiceAsync service; private VerticalPanel destinos; private VerticalPanel origens; GUJ http://www.guj.com.br Pgina 6

Maurcio Linhares de Arago Junior http://maujr.org/

private FlexTable table; /** * This is the entry point method. */ public void onModuleLoad() { this.table = new FlexTable(); this.destinos = new VerticalPanel(); this.origens = new VerticalPanel(); for ( int x = 0; x < 8; x++ ) { this.destinos.add( createCheckBox( Constants.CIDADES[x], this ) ); this.origens.add( createCheckBox( Constants.CIDADES[x], this ) ); } this.service = (BuscaViagensServiceAsync) GWT.create(BuscaViagensService.class); ServiceDefTarget target = (ServiceDefTarget) service; target.setServiceEntryPoint(GWT.getModuleBaseURL() + "viagens"); RootPanel.get("destinos").add(this.destinos); RootPanel.get("origens").add(this.origens); RootPanel.get("viagens").add(this.table); String[] arrayVazio = {}; this.service.getViagens(arrayVazio, arrayVazio, this); } /* (no-Javadoc) * @see com.google.gwt.user.client.ui.ClickListener#onClick(com.google.gwt.user.client.ui.Widget) */ public void onClick(Widget sender) { List origensSelecionadas = new ArrayList(); List destinosSelecionados = new ArrayList(); Iterator origensIterator = this.origens.iterator(); while (origensIterator.hasNext()) { CheckBox checkBox = (CheckBox) origensIterator.next(); if (checkBox.isChecked()) { origensSelecionadas.add( checkBox.getText()); } } Iterator destinosIterator = this.destinos.iterator(); while (destinosIterator.hasNext()) { CheckBox checkBox = (CheckBox) destinosIterator.next(); if (checkBox.isChecked()) { destinosSelecionados.add( checkBox.getText() ); } } String[] origensArray = new String[origensSelecionadas.size()]; String[] destinosArray = new String[destinosSelecionados.size()]; for ( int x = 0; x < origensArray.length; x++ ) { origensArray[x] = (String) origensSelecionadas.get(x); } for ( int x = 0; x < destinosArray.length; x++ ) { destinosArray[x] = (String) destinosSelecionados.get(x); } this.service.getViagens(origensArray, destinosArray, this); }

GUJ http://www.guj.com.br Pgina 7

Maurcio Linhares de Arago Junior http://maujr.org/

private void carregarTabela(Viagem[] viagens)

while ( this.table.getRowCount() > 0 ) { this.table.removeRow(0); } this.table.setHTML(0, 0, "<strong>Empresa</strong>"); this.table.setHTML(0, 1, "<strong>Origem</strong>"); this.table.setHTML(0, 2, "<strong>Destino</strong>"); for ( int x = 0; x < viagens.length; x++ ) { Viagem viagem = viagens[x]; this.table.setText(x + 1, 0, viagem.getEmpresa()); this.table.setText(x + 1, 1, viagem.getOrigem()); this.table.setText(x + 1, 2, viagem.getDestino()); } } /* (no-Javadoc) * @see com.google.gwt.user.client.rpc.AsyncCallback#onFailure(java.lang.Throwable) */ public void onFailure(Throwable caught) { // fazer o tratamento de erro Window.alert("Ocorreu um erro: " + caught); } /* (no-Javadoc) * @see com.google.gwt.user.client.rpc.AsyncCallback#onSuccess(java.lang.Object) */ public void onSuccess(Object result) { carregarTabela((Viagem[]) result); } private static CheckBox createCheckBox(String text, ClickListener listener) { CheckBox checkBox = new CheckBox(text); checkBox.setText(text); checkBox.addClickListener(listener); } } return checkBox;

A classe GWTTutorial, que o ponto de entrada do cliente na nossa aplicao, ganhou algumas novas responsabilidades. Ela agora guarda as referncias para os componentes visuais que ns vamos utilizar na pgina e implementa as interfaces ClickListener, para responder aos cliques nos checkboxes, e AsyncCallback para responder a execuo da chamada remota ao servio. Em uma aplicao maior, voc poderia dividir melhor as responsabilidades das classes e criar objetos especificamente para implementar estas interfaces. Na nossa classe, temos dois VerticalPanels, que so componentes do tipo painel, que so utilizados para organizar os componentes que so inseridos neles de alguma forma. No caso dos VerticalPanels eles fazem com que os componentes adicionados sejam colocados em uma lista vertical de componentes. O outro componente que est na classe a FlexTable, que uma tabela que pode ser redimensionada dinamicamente, ela vai ser utilizada para mostrar o resultado das consultas. Todos os objetos so inicializados na chamada do mtodo onModuleLoad(), nele que ns criamos os componentes e criamos o objeto que vai fazer as chamadas ao servio remoto. Para criar um objeto que faz a chamada ao servio, ns utilizamos o mtodo esttico create() da classe GWT, passando como parmetro o objeto class da interface real do servio. O objeto retornado um objeto que implementa a interface assncrona do servio (no nosso caso, a interface BuscaViagensServiceAsync). Aps retornado o objeto, ns ainda temos que fazer um cast dele para o tipo com.google.gwt.user.client.rpc.ServiceDefTarget e dizer qual a URL na qual o servio deve ser invocado. Essa URL o mapeamento do nosso servlet que implementou o servio remoto e essa URL deve ser absoluta. Para no ter que definir diretamente o caminho do contexto, ns utilizamos o mtodo esttico GWT.getModuleBaseURL(), que retorna o caminho absoluto at a aplicao definida (com / no final) e fazemos a concatenao com a URL do mapeamento do servlet na aplicao, que nesse caso vai ser /viagens.
GUJ http://www.guj.com.br Pgina 8

Maurcio Linhares de Arago Junior http://maujr.org/

Para testar se tudo est funcionando corretamente, ns podemos declarar o servlet do servio no arquivo de configurao do mdulo do GWT, pois como ele mesmo tem um servidor web para testes, ns podemos utilizar o seu prprio ambiente de testes para executar a aplicao. Vejamos como deve ficar o arquivo de configurao:
Listagem 9 GWTTutorial.gwt.xml - Arquivo de configurao da aplicao <module> <!-- Inherit the core Web Toolkit stuff. --> <inherits name='com.google.gwt.user.User' /> <!-- Specify the app entry point class. --> <entry-point class='org.maujr.gwt.tutorial.client.GWTTutorial' /> <servlet path='/viagens' class='org.maujr.gwt.tutorial.server.BuscaViagensServiceImpl' /> </module>

Ns definimos o servlet e o seu mapeamento e agora j estamos prontos para executar a aplicao, ao executar o arquivo GWTTutorial-shell.cmd (ou .sh) voc deve ver uma tela como a seguinte:

Imagem 2 Aplicao GWT executando no navegador de testes

A aplicao executa normalmente, acessando dados no servidor e sem fazer refresh na pgina inteira, atualizando apenas os campos que precisam ser atualizados, diminuindo o consumo de banda e de processamento no servidor, pois apenas os dados que so necessrios so requisitados. Temos ento a nossa aplicao implementada e executando normalmente no servidor.

Implantando a aplicao em outro servidor


Para implantar a sua aplicao em outro servidor, voc deve empacotar todos os arquivos .class gerados (de todos os pacotes) e colocar no classpath da sua aplicao, mapear o servlet que implementa um servio remoto e gerar os arquivos JavaScript necessrios executando o script GWTTutorial-compile.cmd (ou .sh). Ele vai gerar os arquivos dentro de uma pasta www na pasta do projeto. Esses arquivos contidos nesta pasta devem ser colocados dentro da pasta raiz da aplicao web. Para executar a aplicao basta chamar o arquivo GWTTutorial.html.
GUJ http://www.guj.com.br Pgina 9

Maurcio Linhares de Arago Junior http://maujr.org/

Para Saber Mais


Google Web Toolkit Pgina oficial do projeto - http://code.google.com/webtoolkit/ Blog da equipe do GWT - http://googlewebtoolkit.blogspot.com/

Consideraes Finais
Mesmo tendo uma abordagem um relativamente diferente na criao de aplicaes AJAX, a simplicidade do uso do GWT faz dele uma opo interessante especialmente para aqueles que desejam estender as funcionalidades de aplicaes j existentes com o uso de AJAX. Mas essa abordagem relativamente diferente tambm complica o seu uso, pois editar os arquivos de script gerados para adicionar novas bibliotecas ao classpath ou gerar verses compiladas das aplicaes fica mais difcil conforme a quantidade de dependncias aumenta. Mas esses problemas so apenas ferramentais e a melhora do suporte a compilao e gerao do JavaScript que deve vir com os plugins que j esto sendo desenvolvidos devem simplificar ainda mais a criao de aplicaes com o GWT. Agora s no espere pra ver, seno voc pode perder a parada.
Maurcio Linhares de Arago Junior (mauricio.linhares@gmail.com) graduando em Desenvolvimento de Sistemas para a Internet e Comunicao Social, com Habilitao em Jornalismo, desenvolvedor da Phoebus Tecnologia ( http://www.phoebus.com.br/ ), consultor e instrutor independente, instrutor parceiro da Synapse Tech Cursos ( http://stcursos.com/ ), membro da equipe administrativa do PBJUG ( http://pbjug.org/ ) e colaborador dos fruns do GUJ ( http://guj.com.br/ ).

GUJ http://www.guj.com.br Pgina 10

Você também pode gostar