Material sobre GWT Algumas Notí­cias
Nov 04

É comum para alguém que esteja começando a programar com o GWT ter um pouco de dificuldade com a comunicação entre cliente e servidor através do mecanismo padrão do GWT, o RPC. Após receber alguns emails sobre como fazer isso resolvi escrever este post mostrando de uma forma simplificada e rápida os passos necessários para a execução dessa tarefa simples e extremamente comum em aplicações ajax.

Para começar é interessante saber como funciona esse mecanismo. De forma resumida o que acontece é o seguinte: Ao receber o seu objeto java, o compilador gwt vai transformá-lo em uma String então a serializa e em seguida envia ao servidor por meio de uma conexão HTTP normal. Ao receber esse objeto serializado o servidor(Servlet gwt) então deserializa o objeto executando o caminho inverso, transformando a String em um objeto java e então este segue o seu ciclo de vida normal. Da mesma maneira, o inverso também é verdade. Assim, a comunicação pode ser efetuada em ambos os sentidos. Para conseguir executar toda essa tarefa é necessário que o objeto a ser enviado obedeça a algumas regras, a seguir:

  1. Ser de um tipo básico/primitivo (String, Integer/int, Double/double, Long/long, Boolean/boolean ).
  2. Implementar a interface Serializable ou IsSerializable(gwt < 1.4).
  3. Todos os campos do objeto devem obedecer à(s) regra(s) 1 e/ou 2.

O uso de coleções e mapas é permitido desde que se use generics e os tipos que elas encapsulem obedeçam às regras citadas anteriormente. Assim é possí­vel se ter por exemplo uma List<String> trafegando entre o cliente e o servidor.

Abaixo você encontra o diagrama de implementação de um serviço rpc do gwt.

Diagrama de Implementação de um Serviço RPC

Diagrama de Implementação de um Serviço RPC

O que essa coisa toda realmente significa é bastante simples:

  • 2 interfaces
  • 1 servlet

As duas interfaces servem para a definir o que o serviço irá realizar, por exemplo: Verificar se um usuário possui acesso a um determinado recurso, efetuar login no sistema… etc. Uma dessas interfaces é chamada de síncrona e a outra de assí­ncrona. O servlet define o como esse serviço será implementado e por isso ele deve implementar a interface sí­ncrona do serviço.

Utilizando a versão 1.5 do gwt temos o seguinte:

Interface Sí­ncrona:
[java]
package br.com.gwt.rpc.client.servico;

@RemoteServiceRelativePath(”/servico”)
public interface Servico extends Service{
public Boolean autoriza(String loginToken, String recurso);
public String login(String login, String senha) throws Exception;
public void logout(String loginToken);
}
[/java]

Interface Assí­ncrona:

[java]
package br.com.gwt.rpc.client.servico;

public interface ServicoAsync {
public void autoriza(String loginToken, String recurso, AsyncCallback>Boolean< callback);
public void login(String login, String senha, AsyncCallback>String< callback);
public void logout(String loginToken, AsyncCallback>Void< callback);
}
[/java]

Reparem que na interface Assí­ncrona os métodos não retornam objetos e os parâmetros dos métodos são os mesmos da interface sí­ncrona com o acréscimo de um AsyncCallback. Entrarei em detalhes logo abaixo.

Agora, restam somente dois passos para a criação do serviço. Implementar o servlet e registrá-lo no arquivo do módulo.

[java]
package br.com.gwt.rpc.server.servico;
public class ServicoImpl extends RemoteServiceServlet implements Servico {
public Boolean autoriza(String loginToken, String recurso) {

/*implementação da autorização;*/

}
public String login(String login, String senha) throws Exception {

/*implementação do login*/

}
public void logout(String loginToken) {

/*implementação do logout*/

}
}
[/java]

Abaixo o arquivo de configuração do módulo gwt.

[xml]





[/xml]

A partir daí­ o serviço está pronto para ser usado. Repare que o path no módulo de configuração é o mesmo definido logo no iní­cio da interface sí­ncrona. Feito isso enquanto estiver utilizando em hosted mode, não é necessário nenhuma outra configuração adicional. Para a utilização em web mode é necessária uma última configuração. Registrar o servlet no web.xml. Esta última tarefa não será coberta neste post por se tratar de uma atividade comum em uma aplicação JEE.

Para fazer uma chamada ao serviço o compilador do gwt deve ser invocado através da seguinte chamada:

[java]
ServicoAsync servico = GWT.create(Servico.class);
[/java]

As chamadas são sempre assí­ncronas, isso significa que é criada uma conexção HTTP com o servidor, essa chamada é executada e em algum momento ela irá retornar e então executará o código que faz parte do AsyncCallback que criamos. A seguir um exemplo de chamada ao método de login:

[java]

servico.login(”login”, “1234″, new AsyncCallback callback{
public void onSuccess(String result) {
loginToken = result;
Window.alert(”Login efetuado com sucesso!”);
}

public void onFailure(Throwable cause){
Window.alert(”Ocorreu uma falha no processo de login. Causa: \n”+cause.getMessage());
}
});
[/java]

Abraços e até o próximo post :)

One Response to “Comunicação Cliente-Servidor utilizando o RPC”

  1. andre.luis Says:

    Você teria um exemlo de gerenciador de arquivos remotamente. Tipo, criar um txt ou editar um txt existente, tudo isso remotamente e localmente.

Leave a Reply

You must be logged in to post a comment.