Devolver JSON del servlet

Es una prueba de solicitud-respuesta muy básica. El navegador envía "hola desde el navegador" al servlet usando jQuery $.ajax API, y el servlet recibe este mensaje, luego crea un objeto JSON usando la biblioteca org.json.simple y envía al navegador una respuesta JSON con el mensaje "hola desde el servidor".

Estoy ejecutando esto en localhost y solo asumo que mi dirección IP es 123.123.12.123, la plataforma es Ubuntu, el servidor es Tomcat 6.0, que se ejecuta en Eclipse IDE.

Prueba 1. Arranco el servidor desde Eclipse, abro Firefox, intro http://localhost:8080/myproject/test.jsp, puedo ver que el servlet recibe un mensaje y el navegador recibe una respuesta, la prueba pasó.

Prueba 2. El servidor todavía se está ejecutando en Eclipse en Ubuntu, inicio la máquina invitada de Windows 7 desde VirtualBox y el navegador Firefox en Windows 7, ingrese http://123.123.12.123:8080/myproject/test.jsp, funciona como esperaba, prueba superada.

Prueba 3. El servidor todavía se está ejecutando en Eclipse en Ubuntu, abra el navegador Internet Explorer 9, déle la dirección http://123.123.12.123:8080/myproject/test.jsp, no pasa nada. el debug me da

Respuesta HTTP/1.1 200 OK

Cuerpo de respuesta {"mensaje":"hola desde el servidor"}

El test.jsp es

<%@ página language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  Insertar título aquí 
$(document).ready(function(){
    var request = ({"message":'Hello from browser'});
    var jsonobj=JSON.stringify(request);
    $.ajax({
        data: {para:jsonobj},
        dataType: 'json',
        url: './TestServlet',
        type: 'POST',
        success: function(jsonObj){
            alert(jsonObj.message);     
        },
        error: function() {
            alert('Ajax readyState: '+xhr.readyState+'\nstatus: '+xhr.status + ' ' + err);
        }
    });
});

El código del servlet es

importar java.io.IOException; importar java.io.PrintWriter; importar javax.servlet.ServletException; importar javax.servlet.http.HttpServlet; importar javax.servlet.http.HttpServletRequest; importar javax.servlet.http.HttpServletResponse; importar org.json.simple.JSONObject; importar org.json.simple.JSONValue; /** * Clase de implementación de servlet TestServlet */ public class TestServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @ver HttpServlet#HttpServlet() */ public TestServlet() { super(); } /** * @see HttpServlet#doGet(solicitud HttpServletRequest, respuesta HttpServletResponse) */ protected void doGet(solicitud HttpServletRequest, respuesta HttpServletResponse) throws ServletException, IOException { // TODO stub de método generado automáticamente } /** * @see HttpServlet #doPost (solicitud HttpServletRequest, respuesta HttpServletResponse) */ protected void doPost (solicitud HttpServletRequest, respuesta HttpServletResponse) lanza ServletException, IOException { request.setCharacterEncoding("utf8"); respuesta.setCharacterEncoding("utf8"); respuesta.setContentType("aplicación/json"); PrintWriter out = respuesta.getWriter(); JSONObject jsonObj = (JSONObject) JSONValue.parse(request.getParameter("para")); System.out.println(jsonObj.get("mensaje")); JSONObject obj = nuevo JSONObject(); obj.put("mensaje", "hola desde el servidor"); out.print(obj); } }

Actualizar:

Después de una mirada más cercana por el cambio

 error: function() { alert('Ajax readyState: '+xhr.readyState+'\nstatus: '+xhr.status + ' ' + err); }

a

error: function(xhr,err) { alert('Ajax readyState: '+xhr.readyState+'\nstatus: '+xhr.status + ' ' + err); }

Recibí alerta readyState: 0 y status: 0. Pero puedo ver {"mensaje":"hola desde el servidor"} en el cuerpo de la respuesta y el encabezado de la respuesta es

Clave Valor Respuesta HTTP/1.1 200 OK

preguntado el 10 de marzo de 12 a las 10:03

cuál es tu problema..? Todavía estoy confundido con tu pregunta... ¿puedes decirme con palabras simples? -

Perdón por la larga pregunta. Con el código anterior (test.jsp y TestServlet). La prueba 3 falló. Pero las Pruebas 1 y 2 pasaron. -

4 Respuestas

IE almacena en caché las solicitudes de AJAX de forma agresiva (más que Firefox, Chrome y Safari, de todos modos). A veces es necesario configurar el controlador de encabezado de caché cuando se solicita. Me gusta cache:false. Traté de arreglar tu código así

request.setCharacterEncoding("utf8");
        //response.setCharacterEncoding("utf8");
        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        JSONObject jsonObj = (JSONObject) JSONValue.parse(request.getParameter("para"));
        System.out.println(jsonObj.get("message"));
        JSONObject obj = new JSONObject();
        obj.put("message", "hello from server");
        out.print(obj.toString());

Cambié el tipo de contenido de tu respuesta de application/json; charset=utf8 para sólo application/json y eso funcionó.

contestado el 12 de mayo de 20 a las 18:05

Perdón por la respuesta tardía, funcionó, gracias. ¿Puedes explicar más la razón detrás de esto? - user200340

cuando la solicitud y la respuesta con httpRequest IE son encabezados de caché y los encabezados no se actualizan. Consulte este enlace para obtener detalles greenash.net.au/thoughts/2006/03/an-ie-ajax-gotcha-page-caching - viyancs

OK, en esa publicación, el Ajax funciona bien en la primera carga, pero no después. Pero mi problema es que la respuesta de Ajax no funciona en absoluto en IE. Además, ¿cómo es response.setCharacterEncoding("utf8"); relacionado con el encabezado de respuesta en caché? Gracias - user200340

Creo que hay algún problema cuando $ .ajax obtiene respuesta en IE con Charset ("utf8"). pero también es posible con IE supper cache. - viyancs

Estaba teniendo el mismo problema. Estaba funcionando bien en Firefox pero no en IE... Descubrí leyendo esta publicación que mi problema estaba relacionado con el 'Tipo de contenido'. El problema parece que ese IE tiene un problema con 'charset=UTF8'. Sin embargo, si usa 'charset = UTF-8' (con un guión), ¡entonces está funcionando! Su tipo de contenido debería ser: application/json;charset=UTF-8

respondido 20 mar '13, 10:03

<% 
     Gson gs = new Gson();
     BeanHelpBH bh = new BeanHelpBH();
     List<Baihatmoi> lst = bh.getTenbaihatbyName("Ao moi ca mau");
    String bha = gs.toJson(lst);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    out.print(bha);
    out.flush();


%>

  script : 
        <script>
             $(document).ready(function(){
               $.get('jsontest.jsp',function(data){
            [enter image description here][1] console.log(data);

              });

           });
        </script>

respondido 30 mar '20, 07:03

usando Gson puedes enviar una respuesta json

@WebServlet(urlPatterns = {"/jsonResponse"})
public class JsonResponse extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("application/json");
    response.setCharacterEncoding("utf-8");
    Student student = new Student(12, "Ram Kumar", "Male", "1234565678");
    Subject subject1 = new Subject(1, "Computer Fundamentals");
    Subject subject2 = new Subject(2, "Computer Graphics");
    Subject subject3 = new Subject(3, "Data Structures");
    Set subjects = new HashSet();
    subjects.add(subject1);
    subjects.add(subject2);
    subjects.add(subject3);
    student.setSubjects(subjects);
    Address address = new Address(1, "Street 23 NN West ", "Bhilai", "Chhattisgarh", "India");
    student.setAddress(address);
    Gson gson = new Gson();
    String jsonData = gson.toJson(student);
    PrintWriter out = response.getWriter();
    try {
        out.println(jsonData);
    } finally {
        out.close();
    }

}

}

para más respuesta json del servlet en java

Respondido 03 Feb 20, 05:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.