Servlet结合了来自两个不同请求和回复的数据?

时间:2012-08-16 14:21:25

标签: java ajax jsp servlets asynchronous

我有一个servlet,它获取一个ID作为参数并返回三个值。由于servlet代码很大,只需提供必要的细节。

getdetails.jsp

Inputs : ID //as a query string
Returns: ID, average, count // As a JSON string

从客户端开始,我使用不同的ID逐个发出两个异步javascript请求(第一个请求后第二个)。服务器的响应如下:

对策:

For ID1 : ID1, average1, count1
For ID2 : ID1, average2, count2

对于ID2,它给出正确的平均值和计数但返回ID1(第一个请求的ID)。

当我在getdetails1.jsp中的getdetails.jsp中放入相同的代码并向每个servlet发出每个请求时,我得到了正确的结果。

响应:

For ID1 : ID1, average1, count1
For ID2 : ID2, average2, count2

可能是什么原因以及如何解决这个问题?

编辑: getdetails.jsp的代码:

<%!
String ID;
JsonObject details = new JsonObject();  //using Google JSON Lib
%>
<%
ID=request.getParameter("id");
details.addProperty("ID",ID);
...   //accessing corresponding average and count
details.addProperty("average",average);
details.addProperty("count",count);
out.println(details);
%>

3 个答案:

答案 0 :(得分:3)

我的猜测是你可能要为Servlet实例变量分配请求参数值。

只会创建一个servlet实例,并且所有请求都共享同一个实例。这导致了这种类型的国家腐败。

答案 1 :(得分:2)

The number of servlet instances created by a servlet will always be one.

如果已将请求参数分配给servlet实例,则可能会出现此问题。

如果不是这样,

在servlet中分享ID的实现,用于分析它。

答案 2 :(得分:1)

问题是@thinksteep建议的。 JSP代码被翻译并编译成Servlet。使用JSP声明<%! %>创建非线程安全的实例变量。您应该声明变量,以便为每个请求创建新变量,方法是从<%! %>部分删除它们并在<% %>部分中声明它们。