Llamada a una acción Struts2 desde JQuery adjuntando objeto JSON

Continuando la serie de post de comunicación entre el servidor en Struts2 y un cliente de JQuery, queda por indicar cómo se hace la llamada desde el cliente adjuntando un objeto JSON en vez de los parámetros normales de una llamada post.

La esencia es exactamente la misma, solo que en vez de utilizar los parámetros de la llamada post se pasa un sólo parámetro con la cadena de texto en formato JSON.

En vez de:

$.post("../jqueryRate2.action", {param1:$("#entrada").val(),param2:$("#entrada").val()+"-dos"} ,

Usaremos

$.post("../jqueryJSON.action", {parametroJSON:CadenaJSON} ,

Como sabemos, una cadena JSON puede incluir objetos, arrays, arrays de objetos etcétera, por lo que solamente es una cadena de texto que luego se parseará en el servidor.

Para ilustrar el ejemplo continuaré usando el objeto Persona de otros posts. En este caso vamos a crear un objeto persona en el cliente y lo vamos a enviar al servidor, es decir, el proceso inverso.

La definición del objeto persona en Javascript es la siguiente

function persona (nombre, edad)
{
	this.nombre = nombre;
	this.edad = parseInt(edad);
}

Emplearemos un formulario para recoger los valores que el usuario desee. Se dan dos por defecto:

<form>
<input type ="text" id ="nombre" value ="Luis" />
<input type ="text" id ="edad" value ="39" />
<a href="#" id="envioPeticion"&gt;Envía la petición&lt;/a></form>

De este modo, cuando se pulse sobre el enlace se podrá crear el objeto persona:

person = new persona($("#nombre").val(),$("#edad").val());

Como ya se ha dicho, el resto del procedimiento en el cliente es similar al de un $.post normal y corriente, salvo que hay que adjuntar una cadena de texto en formato JSON del objeto persona.

En este caso, JQuery no cuenta con una función stringify, sino que tenemos que usar un plug-in: jquery-json

Simplemente descargamos el archivo js de este plug-in y lo colocamos en el directorio adecuado de nuestro espacio (en el mismo en el que está el archivo .js de jquery). En el código de la página, se añade como un script más.

Este plug-in aumento la funcionalidad de JQuery, añadiendo entre otras funciones “toJSON”, que transforma un objeto de Javascript a una cadena de texto en formato JSON.

$.toJSON(person)

Por lo tanto, la función quedará definida de la siguiente manera:

 $.post("../jqueryJSON.action", {parametroJSON:$.toJSON(person)} , ... definción de la función que se ejecuta en la respuesta...

En el lado del servidor, tenemos la acción preparada de post anteriores, con la inner class persona y la referencia a Gson para poder parsear la cadena de texto que se envía como parámetro “parametroJSON” y poder transformarla al objeto de Java.

Se crea un parámetro de tipo String llamado “parametroJSON” con su getter y setter para que Struts2 inyecte la cadena de texto. Una vez inyectada se transformará a un objeto de tipo Persona.

El extracto útil de la clase es el siguiente:

private String parametroJSON;

public String execute() throws Exception {

	System.out.println("Parámetro de llamada:" + parametroJSON);

	Gson gson = new Gson();
	ServletOutputStream sos= response.getOutputStream();

	Persona persona=gson.fromJson(parametroJSON, Persona.class);
	System.out.println("Persona Recibida. Nombre:" + persona.nombre + ";Edad:" + persona.edad);
 
...
Anuncios

5 comments

  1. Gracias por el ejemplo, esta muy bien. Tengo una pregunta, sabes si se puede serializar arrays que contienen diferentes objectos. Algo como:
    {[ObjetoA1,ObjectoA2,atributo:[String,String]],
    [ObjetoB1,ObjectoB2,atributo:[String,String,Integer]],
    [ObjetoC1,ObjectoC2,]
    }

    Gracias por todo, un saludo.

    1. Hola Josep, muchas gracias por visitar el Blog.

      La verdad que no he usado nunca esto que comentas de meter varios objetos en un array. De todos modos, así a bote pronto, pienso que un array debe ser sólo de un tipo de datos concreto (array de Strings, array de ints, Array de ObjetoX), pero no arrays de objetos diferentes. De hecho Java no lo soporta… aún en el caso de que se pueda, algo falla en la concepción de tu programa si tienes que hacer uso de este requisito

      salu2

  2. Hola muy buen post gracias por la info pero podrias publicar el codigo completo de ese ejemplo? es para entenderlo mejor.
    Gracias

    1. Hola Arturo, Muchas gracias por leer la entrar y tu comentario.

      Con meses de retraso pero respondo… entiendo que te refieres a transformarlo a OGNL directamente en el javascript y que sea Struts2 el que lo reconstruya en servidor de forma automática. La verdad es que parece una solución muy buena para este caso en concreto. No obstante, el objetivo es usar JSON en la comunicación para que sea menos dependiente la parte cliente y la servidora, de modo que un cambio en la tecnología del servidor (que no use OGNL) sea más sencillo de implementar.

      Un saludo y gracias por la recomendación.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s