从servlet返回JSON

15

这是一个非常基础的请求-响应测试。浏览器使用jQuery $.ajax API向servlet发送“hello from browser”消息,servlet接收此消息,然后使用org.json.simple库创建JSON对象,并向浏览器发送带有消息“hello from server”的JSON响应。

我在本地主机上运行这个测试,并假设我的IP地址是123.123.12.123,平台是Ubuntu,服务器是Tomcat 6.0,在Eclipse IDE中运行。

测试1:我从Eclipse启动服务器,打开Firefox,输入http://localhost:8080/myproject/test.jsp,我可以看到servlet接收了消息并且浏览器接收到了响应,测试通过。

测试2:服务器仍在Ubuntu上的Eclipse上运行,我从VirtualBox启动Windows 7客户机和Windows 7上的Firefox浏览器,输入http://123.123.12.123:8080/myproject/test.jsp,按照我期望的工作,测试通过。

测试3:服务器仍在Ubuntu上的Eclipse上运行,打开Internet Explorer 9浏览器,输入地址http://123.123.12.123:8080/myproject/test.jsp没有反应。 调试信息如下:

响应 HTTP/1.1 200 OK

响应体 {"message":"hello from server"}

test.jsp的代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
该代码段包含了一个使用jQuery向Servlet发送JSON数据并接收响应的示例。代码首先创建一个名为request的JSON对象,然后将其转换为JSON字符串。接下来,它使用jQuery.ajax()函数将请求发送到TestServlet。如果成功,它会弹出响应中的"message"属性。如果失败,则会弹出错误消息。
在服务器端,TestServlet类继承自HttpServlet类,并处理POST请求。它从请求参数中解析JSON对象,并使用PrintWriter输出带有"message"属性的JSON响应,表示服务器已经成功响应请求。 最后需要注意的是,该代码段不应直接运行,而是应作为Web应用程序的一部分运行。我收到了提示readyState:0和status:0. 但我可以在响应正文中看到{"message":"hello from server"},响应头是:
键 值
响应 HTTP/1.1 200 OK
错误函数为:
error: function(xhr,err) {
            alert('Ajax readyState: '+xhr.readyState+'\nstatus: '+xhr.status + ' ' + err);
        }

你有什么问题吗?我还是对你的问题感到困惑...你能用简单的语言告诉我吗? - viyancs
抱歉问题有点长。使用上述代码(test.jsp和TestServlet),测试3失败了,但测试1和2通过了。 - user200340
4个回答

15

IE的AJAX请求缓存比Firefox、Chrome和Safari都要积极。 有时需要在请求时设置缓存头控制器,例如cache:false。我尝试按照此方式修复您的代码。

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());

我将您的响应内容类型从application/json; charset=utf8更改为只有application/json,这样就正常工作了。


抱歉回复晚了,它起作用了,谢谢。你能解释一下背后的原因吗? - user200340
当使用httpRequest IE请求和响应时,会缓存头文件并且这些头文件不会被更新。请参考此链接以获取详细信息:http://greenash.net.au/thoughts/2006/03/an-ie-ajax-gotcha-page-caching/ - viyancs
好的,在那篇文章中,Ajax在第一次加载时运行良好,但之后就不行了。但我的问题是,在IE上Ajax响应根本不起作用。另外,response.setCharacterEncoding("utf8")与响应缓存头有什么关系?谢谢。 - user200340
我认为当使用字符集("utf8")在IE中获取$.ajax响应时可能会出现问题,但这也可能是由于IE超级缓存引起的。 - viyancs

3

我曾经遇到同样的问题。它在Firefox上工作得很好,但在IE上却不行......通过阅读这篇文章,我发现我的问题与“Content-Type”有关。问题似乎是IE对“charset=UTF8”的处理有问题。然而,如果您使用“charset=UTF-8”(带有破折号),那么它就可以工作了!你的Content-Type应该是:application/json;charset=UTF-8


0
<% 
     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>

-1

使用Gson可以发送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();
    }

}

}

了解更多关于Java Servlet中JSON响应的信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接