Blog de Programación y Diseño Web

Utilizar getJSON(jQuery) con Java(Struts) crossdomain.

Escrito en Json con Java by Andres on the agosto 24th, 2009

getJSON

Hace poco en un proyecto tuve que integrar información entre un html y un servlet (struts), tenia que ser con AJAX mediante un html generado con un javascript incrustado en cualquier dominio, claramente no es posible utilizar AJAX si el html esta en un dominio distinto al servidor que envía la respuesta, pero se puede hacer algo similiar.

¿Que hacer?
Existe una libreria llamada JSONP que permite incrustar archivos javascript despues de haber cargado la página y justamente es lo que utiliza la función $.getJSON() de jQuery.

¿Como generar un JSON “leible” por $.getJSON()?

Primero que nada, para consumir un JSON remoto debemos enviar el parametro jsoncallback y con valor “?”, despues en struts lo concatenamos a la respuesta que generemos. Es importante hacer esto ya que de otra forma no funcionará.

Por ejemplo si el JSON generado es:


{"nombre":"andres","edad":24}

La respuesta en struts debe quedar así.


?({"nombre":"andres","edad":24})

Por lo tanto, desde el lado del cliente debemos llamar de la siguiente manera al action de struts.

$.getJSON("http://10.10.20.101:8080/proyecto/controller.do?action=obtenerJson&jsoncallback=?",
    function(data){}
    //Imprimimos nombre
    alert(data.nombre);
);

Del lado del servidor generamos así la respuesta

public ActionForward obtenerJson(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Guardamos en una variable el JSON
        String json = "{\"nombre\":\"Andres\",\"edad\":\"24\"}";

        //Capturamos el parametro
        String callback = request.getParameter("jsoncallback");

        //Concatenamos la respuesta y dejamos entre parentesis la respuesta
        String jsonOutput = callback + "(" + json + ")";

        //Enviamos al jsp
        request.setAttribute("variable",jsonOutput);

        return mapping.findForward(forward);
    }

5 Responses to 'Utilizar getJSON(jQuery) con Java(Struts) crossdomain.'

Subscribe to comments with RSS or TrackBack to 'Utilizar getJSON(jQuery) con Java(Struts) crossdomain.'.

  1. Marcos huerta hernandez said, on febrero 4th, 2010 at 14:44

    que tal amigo he provado el ejemplo y nada mas no me aplica sera que me falta algo

  2. Andres said, on marzo 17th, 2010 at 11:41

    Tienes que revisar la respuesta del servlet y que quede con el formato correcto. Dame mas detalles y te ayudo.

  3. Ricardo said, on diciembre 10th, 2010 at 22:14

    Andres me podrias ayudar??

    deseo retornar un objeto JSON que creo en una jsp a un HTML.

    La forma en que estoy creando el JSON es la siguiente:

    JSONObject array = new JSONObject();
    array.put(“data1″, “Hello”);
    array.put(“data2″, “World”);
    array.put(“data3″, “Good”);
    array.put(“data4″, “Morning”);

    con una libreria llamada JSON-lib

    Despues de crearlo no se como retornarlo a la pagina HTML que espera respuesta para seguir su procedimiento.

    Esta es la forma en que llamo la JSP:

    $.ajax({
    type: ‘get’,
    dataType: ‘json’,
    url: ‘recibe.jsp’,
    data: {valor: combo1.options[combo1.selectedIndex].value},
    success: function(json){
    //procedimiento al recibir JSON
    }
    De antemano gracias!!

  4. Andres said, on diciembre 10th, 2010 at 22:49

    En la página recibe.jsp debes imprimir el contenido del array tipo JSONObject, el JSP debe estar limpio y solamente retornar JSON para que la función $.ajax con el dataType ‘json’ pueda procesarlo.

    Si necesitas mas detalles, dame mas detalles de que estas utilizando (struts, spring, nada). Saludos.

  5. Ricardo said, on diciembre 11th, 2010 at 12:10

    Al parecer no uso nada ni struts ni spring.

    Este el resto del codigo de recibe.jsp:

    Object opcion = request.getParameter(“valor”);
    System.out.println(opcion.toString());
    if (opcion.toString().equals(“opcion1″)) {
    JSONObject array = new JSONObject();
    array.put(“data1″, “Hello”);
    array.put(“data2″, “World”);
    array.put(“data3″, “Good”);
    array.put(“data4″, “Morning”);
    out.println(array);
    System.out.println(array);
    request.setAttribute(“json”, array);

    } else {
    JSONObject array = new JSONObject();
    array.put(“data1.2″, “Hello”);
    array.put(“data2.2″, “World”);
    array.put(“data3.2″, “Good”);
    array.put(“data4.2″, “Morning”);
    out.println(array);
    System.out.println(array);

    }

    el request.setAttribute(“json”, array); lo vi en un ejemplo y lo inclui por si las moscas jeje.

    Al out.println te refieres cuando dices imprimir??

    Que significa que este limpio el JSP???

    De antemano gracias de nuevo.

Dejame tu comentario