0

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

获取详细信息.jsp

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

从客户端我一个一个地发出两个异步 javascript 请求(在第一个请求之后紧接着第二个)具有不同的 ID。来自服务器的响应如下:

响应:

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);
%>
4

3 回答 3

3

我的猜测是您可能已经将请求参数值分配给 Servlet 实例变量。

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

于 2012-08-16T14:24:20.170 回答
2

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

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

如果不是这种情况,

分享一下id在servlet中的实现,供大家分析。

于 2012-08-16T14:27:18.313 回答
1

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

于 2012-08-16T15:32:10.507 回答