<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GWT Brasil &#187; http</title>
	<atom:link href="http://www.gwt.com.br/tag/http/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gwt.com.br</link>
	<description>Grupo de usuários do GWT no Brasil</description>
	<lastBuildDate>Sat, 10 Oct 2009 03:37:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Comunicação Cliente-Servidor utilizando o RPC</title>
		<link>http://www.gwt.com.br/2008/11/04/comunicacao-cliente-servidor-utilizando-o-rpc/</link>
		<comments>http://www.gwt.com.br/2008/11/04/comunicacao-cliente-servidor-utilizando-o-rpc/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 11:57:34 +0000</pubDate>
		<dc:creator>Marcelo Emanoel</dc:creator>
				<category><![CDATA[Básico]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[rpc]]></category>
		<category><![CDATA[service]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/?p=69</guid>
		<description><![CDATA[Este post descreve como funciona o mecanismo de comunicaÃ§Ã£o rpc do gwt.]]></description>
			<content:encoded><![CDATA[<p>É 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.<br />
<span id="more-69"></span><br />
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:</p>
<ol>
<li>Ser de um tipo básico/primitivo (String, Integer/int, Double/double, Long/long, Boolean/boolean ).</li>
<li>Implementar a interface Serializable ou IsSerializable(gwt < 1.4). </li>
</li>
<li>Todos os campos do objeto devem obedecer à(s) regra(s) 1 e/ou 2.</li>
</ol>
<p>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&lt;String&gt; trafegando entre o cliente e o servidor.</p>
<p>Abaixo você encontra o diagrama de implementação de um serviço rpc do gwt.<br />
<div class="wp-caption aligncenter" style="width: 510px"><img alt="Diagrama de Implementação de um Serviço RPC" src="http://google-web-toolkit-doc-1-5.googlecode.com/svn/wiki/AnatomyOfServices.gif" title="Diagrama de Implementação de um Serviço RPC" width="500" height="433" /><p class="wp-caption-text">Diagrama de Implementação de um Serviço RPC</p></div></p>
<p>O que essa coisa toda realmente significa é bastante simples:</p>
<ul>
<li>2 interfaces</li>
<li>1 servlet</li>
</ul>
<p>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&#8230; 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. </p>
<p>Utilizando a versão 1.5 do gwt temos o seguinte:</p>
<p>Interface Sí­ncrona:<br />
[java]<br />
package br.com.gwt.rpc.client.servico;</p>
<p>@RemoteServiceRelativePath(&#8221;/servico&#8221;)<br />
public interface Servico extends Service{<br />
      public Boolean autoriza(String loginToken, String recurso);<br />
      public String login(String login, String senha) throws Exception;<br />
      public void logout(String loginToken);<br />
}<br />
[/java]</p>
<p>Interface Assí­ncrona:</p>
<p>[java]<br />
package br.com.gwt.rpc.client.servico;</p>
<p>public interface ServicoAsync {<br />
    public void autoriza(String loginToken, String recurso, AsyncCallback&gt;Boolean&lt; callback);<br />
    public void login(String login, String senha, AsyncCallback&gt;String&lt; callback);<br />
    public void logout(String loginToken, AsyncCallback&gt;Void&lt; callback);<br />
}<br />
[/java]</p>
<p>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.</p>
<p>Agora, restam somente dois passos para a criação do serviço. Implementar o servlet e registrá-lo no arquivo do módulo. </p>
<p>[java]<br />
package br.com.gwt.rpc.server.servico;<br />
public class ServicoImpl extends RemoteServiceServlet implements Servico {<br />
      public Boolean autoriza(String loginToken, String recurso) {<br />
            &#8230;<br />
            /*implementação da autorização;*/<br />
            &#8230;<br />
      }<br />
      public String login(String login, String senha) throws Exception {<br />
            &#8230;<br />
            /*implementação do login*/<br />
            &#8230;<br />
      }<br />
      public void logout(String loginToken) {<br />
            &#8230;<br />
            /*implementação do logout*/<br />
            &#8230;<br />
      }<br />
}<br />
[/java]</p>
<p>Abaixo o arquivo de configuração do módulo gwt.</p>
<p>[xml]<br />
<module><br />
        &#8230;<br />
	<servlet path="/servico" class="br.com.gwt.rpc.client.servico.ServicoImpl"/><br />
        &#8230;<br />
</module><br />
[/xml]</p>
<p>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. </p>
<p>Para fazer uma chamada ao serviço o compilador do gwt deve ser invocado através da seguinte chamada:</p>
<p>[java]<br />
    ServicoAsync servico = GWT.create(Servico.class);<br />
[/java]</p>
<p>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:</p>
<p>[java]<br />
   &#8230;<br />
   servico.login(&#8221;login&#8221;, &#8220;1234&#8243;, new AsyncCallback<string> callback{<br />
     public void onSuccess(String result) {<br />
           loginToken = result;<br />
           Window.alert(&#8221;Login efetuado com sucesso!&#8221;);<br />
     }</p>
<p>     public void onFailure(Throwable cause){<br />
           Window.alert(&#8221;Ocorreu uma falha no processo de login. Causa: \n&#8221;+cause.getMessage());<br />
     }<br />
   });<br />
[/java]</p>
<p>Abraços e até o próximo post <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </string></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2008/11/04/comunicacao-cliente-servidor-utilizando-o-rpc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
