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

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);
}
que tal amigo he provado el ejemplo y nada mas no me aplica sera que me falta algo
Tienes que revisar la respuesta del servlet y que quede con el formato correcto. Dame mas detalles y te ayudo.
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!!
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.
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.