MouseOver Studio

MouseOver Studio header image 2

RPC muito muito fácil com dojo.rpc e Struts 2 JSON

January 1st, 2008 por Diego Carrion · 2 comentários

De acordo com a definição da Wikipedia, RPC ou Chamada de Procedimento Remoto é

(…) 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, (…)

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.

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.

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:

function x() {
    /* Ajax para chamar x no servidor */
}

function y() {
    /* Ajax para chamar y no servidor */
}

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.

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.

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:

{
   "doubleValue": 10.10,
   "nestedBean": {
      "name": "Mr Bean"
   },
   "list": ["A", 10, 20.20, {
      "firstName": "El Zorro"
   }],
   "array": [10, 20] 
}

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.

Vou aproveitar o projeto web criado aqui para implementar uma classe no servidor que possa ser representada no cliente, uma solução RPC.

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 aqui.

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:

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;
	}
}

Vamos mapear agora nossa nova Action. Para isso, adicionamos no arquivo struts.xml o seguinte código:


<package name="struts2json" extends="json-default">
<action name="TesteRPC"
class="com.mouseoverstudio.action.TesteStruts2JSON">
<interceptor -ref name="json">
<param name="enableSMD">true</param>
</interceptor>
<result type="json">
<param name="enableSMD">true</param>
</result>
</action>
</package>

A parte do servidor ja esta feita. Vamo agora trabalhar no cliente. Precisamos da livraria de JavaScript Dojo. Podem baixar ela de aqui. 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.


<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<script type="text/javascript" src="./dojo-1.x/dojo/dojo.js"
djConfig="isDebug:true"></script>
<s :url id="url" action="TesteRPC" />
<script type="text/javascript">
dojo.require("dojo.rpc.JsonService");
var service = new dojo.rpc.JsonService("${url}");
service.getStringResult().addCallback(console.log);
service.getIntegerResult("1337").addCallback(console.log);
</script>
</head>
<body></body>
</html>

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.





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:

http://cwiki.apache.org/S2PLUGINS/json-plugin.html

  • http://dojotoolkit.org/book/dojo-book-0-9/part-3-programmatic-dijit-and-dojo/ajax-transports/remote-procedure-call-rpc
  • Tags: Ajax · Dojo · java · JavaScript · programação · rpc · struts · Tutoriales

    2 respostas ate agora ↓

    • 1 Kleber // Jan 2, 2008 at 7:56 pm

      Parabéns pelo tutorial, muito bem explicado

    • 2 Vinicius // Apr 13, 2010 at 10:30 pm

      Parabéns, o tutorial funcionou perfeitamente comigo, mas fiquei com uma dúvida: Existe alguma forma de validação via xml igual a do dojo plugin, que retornava um json com as mensagens de erro?
      Abraço e sucesso!

    Deixar um comentário