<?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"
	>

<channel>
	<title>MouseOver Studio &#187; rpc</title>
	<atom:link href="http://www.mouseoverstudio.com/blog/category/rpc/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.mouseoverstudio.com/blog</link>
	<description></description>
	<pubDate>Wed, 25 Aug 2010 02:03:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>RPC muito muito fácil com dojo.rpc e Struts 2 JSON</title>
		<link>http://www.mouseoverstudio.com/blog/2008/01/01/rpc-muito-muito-facil-com-dojorpc-e-struts-2-json/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/01/01/rpc-muito-muito-facil-com-dojorpc-e-struts-2-json/#comments</comments>
		<pubDate>Tue, 01 Jan 2008 17:57:36 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[Dojo]]></category>

		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[Tutoriales]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[programação]]></category>

		<category><![CDATA[rpc]]></category>

		<category><![CDATA[struts]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=36</guid>
		<description><![CDATA[De acordo com a definição da Wikipedia, RPC ou Chamada de Procedimento Remoto é
 (&#8230;) o tipo de protocolo para chamada remota de procedimentos em qualquer lugar da rede ou uma chamada de função para o método de transferência de controle de parte de um processo para outra, permite a divisão de um software em [...]]]></description>
			<content:encoded><![CDATA[<p>De acordo com a <a href="http://pt.wikipedia.org/wiki/Chamada_de_procedimento_remoto">definição da Wikipedia</a>, RPC ou Chamada de Procedimento Remoto é</p>
<blockquote><p> (&#8230;) o tipo de protocolo para chamada remota de procedimentos em qualquer lugar da rede ou uma chamada de função para o método de transferência de controle de parte de um processo para outra, permite a divisão de um software em várias partes, (&#8230;)</p></blockquote>
<p>Em outras palavras, com o protocolo RPC podemos ter em distintas maquinas objetos com métodos que ao ser chamados vão ser executados num lugar remoto. </p>
<p>Quando trabalhamos com aplicações web, normalmente temos funções e métodos em JavaScript. Podemos querer executar aqueles métodos e funções no servidor por vários motivos, como por exemplo porque são muito custosos e no browser a execução vai ficar muito lenta, porque precisam de uma lógica de negocio e não queremos expor nossa lógica ao cliente ou porque o método ou função precisa de acesso a recursos que o browser não pode oferecer diretamente.</p>
<p>A solução mais comum seria implementar as funções para que quando sejam chamadas, elas se comuniquem com o servidor mediante Ajax e consigam o resultado. Teríamos algo assim:</p>
<pre class="prettyprint">
function x() {
    /* Ajax para chamar x no servidor */
}

function y() {
    /* Ajax para chamar y no servidor */
}
</pre>
<p>Rapidamente podemos perceber de vários problemas com esta solução. Primeiramente, o código fica muito repetitivo e muito sujeito a erros. Segundamente, precisamos definir uma função local para cada função remota que a gente tiver. Terceiramente, não tem como a gente saber se a função local que a gente esta chamando esta implementada no servidor ou não.</p>
<p>Felizmente com dojo.rpc podemos criar uma solução mais flexível e segura. dojo.rpc.JsonService é uma classe local que representa uma classe remota. O construtor de JsonService recebe uma definição da classe remota e a partir dela ira criar os diferentes métodos.</p>
<p>Struts 2 JSON é um plugin para o Struts que converte o resultado de uma Action em Struts em formato JSON. O resultado de uma Action que devolve um objeto com propriedades chamadas doubleValue do tipo Double, nestedBean do tipo Object, list do tipo List e array do tipo Array ficaria assim:</p>
<pre class="prettyprint">
{
   "doubleValue": 10.10,
   "nestedBean": {
      "name": "Mr Bean"
   },
   "list": ["A", 10, 20.20, {
      "firstName": "El Zorro"
   }],
   "array": [10, 20]
}
</pre>
<p>O mais legal do Struts 2 JSON é que ele foi feito pensando no dojo.rpc e cria uma url com a definição das nossas classes configuradas para trabalhar com ele, de modo que possam ser interpretadas pelo construtor de JsonService.</p>
<p>Vou aproveitar o projeto web criado <a href="http://www.mouseoverstudio.com/blog/?p=39">aqui</a> para implementar uma classe no servidor que possa ser representada no cliente, uma solução RPC.</p>
<p>O primeiro passo é descarregar o plugin e colocar ele na pasta WebContent/WEB-INF/lib . A versão 0.19 do plugin pode ser baixada de <a href="http://jsonplugin.googlecode.com/files/jsonplugin-0.19.jar">aqui</a>.</p>
<p>Seguidamente devemos criar nossa Action. Não sempre todos os métodos da nossa Action precisam estar também no cliente, pelo que colocamos a anotação @SMDMethod nos que efetivamente precisam. SMD é a abreviatura de Simple Method Definition, que seria nossa definição da classe remota. Nossa Action fica assim:</p>
<pre class="prettyprint">
package com.mouseoverstudio.action;

import com.googlecode.jsonplugin.annotations.SMDMethod;
import com.opensymphony.xwork2.Action;

public class TesteStruts2JSON {

	public String execute() {
		return Action.SUCCESS;
	}

	@SMDMethod
	public String getStringResult() {
		String result = new String("MouseOver Studio");
		return result;
	}

	@SMDMethod
	public Integer getIntegerResult(String i) {
		Integer result = new Integer(i);
		return result;
	}
}
</pre>
<p>Vamos mapear agora nossa nova Action. Para isso, adicionamos no arquivo struts.xml o seguinte código:</p>
<p><code class="prettyprint"><br />
&lt;package name=&quot;struts2json&quot; extends=&quot;json-default&quot;&gt;<br />
	&lt;action name=&quot;TesteRPC&quot;<br />
		class=&quot;com.mouseoverstudio.action.TesteStruts2JSON&quot;&gt;<br />
		&lt;interceptor -ref name=&quot;json&quot;&gt;<br />
			&lt;param name=&quot;enableSMD&quot;&gt;true&lt;/param&gt;<br />
		&lt;/interceptor&gt;<br />
		&lt;result type=&quot;json&quot;&gt;<br />
			&lt;param name=&quot;enableSMD&quot;&gt;true&lt;/param&gt;<br />
		&lt;/result&gt;<br />
	&lt;/action&gt;<br />
&lt;/package&gt;<br />
</code></p>
<p>A parte do servidor ja esta feita. Vamo agora trabalhar no cliente. Precisamos da livraria de JavaScript Dojo. Podem baixar ela de <a href="http://dojotoolkit.org/downloads">aqui</a>. Vamos criar uma página que crie uma instância da nossa classe definida no Action e execute os dois métodos dela. Seguidamente vamos utilizar o Firebug para validar a resposta do servidor.</p>
<p><code class="prettyprint"><br />
&lt;%@ taglib prefix=&quot;s&quot; uri=&quot;/struts-tags&quot; %&gt;<br />
&lt;html&gt;<br />
	&lt;head&gt;<br />
		&lt;script type=&quot;text/javascript&quot; src=&quot;./dojo-1.x/dojo/dojo.js&quot;<br />
				djConfig=&quot;isDebug:true&quot;&gt;&lt;/script&gt;<br />
		&lt;s :url id=&quot;url&quot; action=&quot;TesteRPC&quot; /&gt;<br />
		&lt;script type=&quot;text/javascript&quot;&gt;<br />
    		dojo.require(&quot;dojo.rpc.JsonService&quot;);<br />
    		var service = new dojo.rpc.JsonService(&quot;${url}&quot;);<br />
    		service.getStringResult().addCallback(console.log);<br />
    		service.getIntegerResult(&quot;1337&quot;).addCallback(console.log);<br />
		&lt;/script&gt;<br />
	&lt;/head&gt;<br />
	&lt;body&gt;&lt;/body&gt;<br />
&lt;/html&gt;<br />
</code></p>
<p>No resultado podemos apreciar como o Struts 2 JSON cria uma definição da nossa Action e também como o resultado de nossos métodos e convertido para formato JSON.</p>
<p><center><br />
<a class="imagelink" rel="lightbox" href="/blog/tutoriales/4/result.jpg"><br />
<img src="/blog/tutoriales/4/result_tn.jpg" alt="" /><br />
</a><br />
</center></p>
<p>Trabalhar com RPC utilizando dojo.rpc e Struts 2 JSON e um processo muito simples que facilita muito o desenvolvimento de aplicações web. Para mas informação, podem como sempre perguntar ou se desejar, se referir ao seguintes links:</p>
<p>http://cwiki.apache.org/S2PLUGINS/json-plugin.html</p>
<li>http://dojotoolkit.org/book/dojo-book-0-9/part-3-programmatic-dijit-and-dojo/ajax-transports/remote-procedure-call-rpc</li>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/01/01/rpc-muito-muito-facil-com-dojorpc-e-struts-2-json/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
