【问题标题】:Servlet that sends back JSON: Confusion on reception发回 JSON 的 Servlet:接收混乱
【发布时间】:2012-01-13 08:52:22
【问题描述】:

我有一个发送回 JSON 对象的 Servlet,我想在另一个 Java 项目中使用这个 servlet。我有这种方法可以得到结果:

public JSONArray getSQL(String aServletURL)
{
 JSONArray toReturn = null;
 String returnString = "";
 try
 {
    URL myUrl = new URL(aServletURL);
        URLConnection conn = myUrl.openConnection();
        conn.setDoOutput(true);
        BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream() ) );
        String s;
        while ((s = in.readLine()) != null )
         returnString += s;
        in.close();

        toReturn = new JSONArray(returnString);
 }
 catch(Exception e)
 {
    return new JSONArray();
 }
        return toReturn;
}

这很有效,但我面临的问题如下: 当我同时执行多个请求时,结果会混淆,有时我会收到与我发送的请求不匹配的响应。

我怀疑这个问题与我获得响应的方式有关:阅读器从连接的 InputStream 读取字符串。

如何确保我收到一个请求 -> 一个相应的回复? 有没有更好的方法从我的 servlet 中检索我的 JSON 对象?

干杯, 蒂姆

【问题讨论】:

  • 这是ajax调用吗?如果是这样,您是否正在检查响应状态代码?
  • 将此方法标记为同步。您正在请求 servlet 的当前项目的类型。
  • toReturn 从未在方法中声明。所以我猜:全局变量-> 并发问题。或者它只是一个糟糕的复制/粘贴?
  • 你好,@Grooveek:抱歉复制粘贴错误,我编辑了它。它现在被宣布。
  • @thinksteep:AJAX 调用是什么意思?这是一个普通的 Java 项目——我只是想调用和使用某个地方存在的 servlet。

标签: java json servlets


【解决方案1】:

当我同时执行多个请求时,结果会混淆,有时我会收到与我发送的请求不匹配的响应。

您的 servlet 不是线程安全的。我敢打赌,您直接或间接地将请求范围的数据不正确地分配为 servlet 的实例或类变量。这是初学者的常见错误。

仔细阅读How do servlets work? Instantiation, sessions, shared variables and multithreading 并相应地修复您的 servlet 代码。问题不在目前显示的URLConnection 代码中,尽管它表明您在doGet() 和doGet() 和doPost() 中所做的工作完全相同,而这又已经是一种气味至于 servlet 是如何设计的。

【讨论】:

    【解决方案2】:

    尝试删除setDoOutput(true),您只是将连接用于输入,因此您不应该使用它。

    编辑:或者尝试使用HttpClient,使用“原始”Java 更好。

    【讨论】:

    • 它没有改变任何东西。我在 Java 中使用的 Servlet 也被带有 JQUERY 的 Javascript 使用,并且我读过 JSON Callback 的东西。它用于使用唯一 ID 标记每个 JSON 响应。有没有可能我需要类似的东西?
    • 这里是:code statham = new JSONArray(); ... // 填充结果 ... // 发回结果 JSON String callBack = request.getParameter("jsoncallback"); if(callBack != null) out.print(callBack + "(" + statham + ");");否则 out.print(statham); out.close();code
    • 嗯,这看起来像 JSONP,实际上它需要发回请求 id 才能正常工作,但只有在发送“jsoncallback”时才会这样做。你用什么aServletURL 调用这个方法?
    • 我正在使用 org.json。 servletUrl 是这样的:host:8080/ToolsWeb/…
    • 你在哪里做并发请求?线程、进程、不同的机器?
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多