【问题标题】:Problem with AJAX responsesAJAX 响应问题
【发布时间】:2010-11-20 20:21:08
【问题描述】:

我有以下问题。我编写了一个 java servlet,它响应来自我的 javascript 应用程序的 ajax 请求。来自 java servlet 的答案是一个 xml 编码的消息。通常一切正常,但如果我发送“太多”(我认为)Ajax 请求,那么在一个 ajax 响应中会发生更多响应,因此,firefox 会抱怨错误消息“根文档后的垃圾”: 例如:

<root>
 <node1></node1>
</root>

<root>
 <node1></node1>
</root>

这是不允许的(在一条消息中两次&lt;root&gt;)。为什么会这样?我一直认为对于每个 ajax 调用,都会启动一个新的 servlet 实例。那是错的吗?

【问题讨论】:

    标签: ajax servlets


    【解决方案1】:

    Servlet 实例由容器管理,我们不能假设哪个实例会管理传入的 ajax 调用。因此,如果您使用实例变量,那么这可能会导致问题。所以你不能假设一个 servlet 实例只管理一个请求。

    如果您可以发布 servlet 代码,则可以查找确切的错误。

    【讨论】:

      【解决方案2】:

      前面的答案是正确的 - 您的 PrintWriter 成员变量名为“writer”是问题所在。 Tomcat(或任何其他 servlet 容器)可能有一个实例同时处理多个请求。这是 servlet 编程中出现问题的常见原因。

      这里有一些 Tomcat 可能正在做的事情的伪代码(它们在 servlet 中有效且预期的,即使它很容易导致问题):

      Servlet servlet = new ServletTest();
      
      // in thread 1:
      servlet.doPost(request1, response1);
      
      // in thread 2:
      servlet.doPost(request2, response2);
      

      所以 request1 和 request2 可能同时运行,并且共享 writer 变量。如果 request1 设置 writer,然后 request2 设置 writer,然后 request1 写入 XML,然后 request2 写入 XML,那么您将获得问题中显示的输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多