我有以下问题。我编写了一个java servlet,它响应来自我的javascript应用程序的ajax请求。 java servlet的答案是一个xml编码的消息。通常一切都运行良好,但如果我发送“太多”(我认为)Ajax请求,发生更多响应在一个ajax响应中,因此,firefox抱怨错误消息“根文档后垃圾”: e.g:
<root>
<node1></node1>
</root>
<root>
<node1></node1>
</root>
并且不允许(在一条消息中两次<root>
)。为什么会这样?我一直认为每次ajax调用都会启动一个新的servlet实例。那是错的吗?
答案 0 :(得分:1)
Servlet实例由容器管理,我们无法假设哪个实例将管理传入的ajax调用。因此,如果您正在使用实例变量,那么这可能会导致问题。所以你不能假设,一个servlet实例只管理一个请求。
如果您可以发布servlet代码,则可以查找确切的错误。
答案 1 :(得分:0)
早期的答案是正确的 - 您的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,然后你将得到你在问题中显示的输出。