É 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:
- Ser de um tipo básico/primitivo (String, Integer/int, Double/double, Long/long, Boolean/boolean ).
- Implementar a interface Serializable ou IsSerializable(gwt < 1.4).
- 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
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
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”
Leave a Reply
You must be logged in to post a comment.
Junho 25th, 2010 at 21:20:21
Você teria um exemlo de gerenciador de arquivos remotamente. Tipo, criar um txt ou editar um txt existente, tudo isso remotamente e localmente.