-3
  HttpServletRequest request;
  HttpServletResponse response;

  public void doGet(HttpServletRequest request , HttpServlet response){
         this.request = request;
         this.response = response;
  }

如果这个 servlet 一次接收到多个请求会发生什么?

我们遇到了响应不匹配的问题。这是一个问题吗?

4

6 回答 6

4

您的 Web 应用程序容器仅加载一个 servlet 实例。

要编写线程安全的 servlet,您几乎不应该使用实例变量。将请求和响应设置为实例变量是完全错误的。servlet 的实例不属于单个请求。

如果您需要使请求或响应的元素可用于其他方法,请将它们传递给这些方法。您不需要它们作为实例变量。

于 2012-05-19T12:38:46.537 回答
2

当然这是个问题。servlet 是一个单例。同一个 servlet 实例用于处理对这个 servlet 的所有请求。请求当然是同时处理的。这意味着如果您这样做,thread1 将使用通常由 thread2 处理的请求和响应。

于 2012-05-19T12:37:16.510 回答
1

引用 Servlet 规范

“每个请求和响应对象只在servlet的service方法范围内有效,或者在filter的doFilter方法范围内有效。容器通常会回收request对象以避免创建request对象的性能开销。开发者必须意识到不建议在上述范围之外维护对请求对象的引用,因为它可能会产生不确定的结果。”

于 2012-05-19T13:00:06.163 回答
0

这肯定会产生问题,任何实例变量都是共享的,因为 servlet 是单例的,因此并发请求和响应对象将被覆盖。

于 2012-05-19T12:54:34.560 回答
0

发生的情况是您的 servlet 立即变得不可重入,并且在第一次被多个客户端同时调用时肯定会失败。你不能这样做。

于 2012-05-20T02:32:48.120 回答
-2

这是一个问题,永远不建议将 HttpServletRequest 请求/HttpServletResponse 响应声明为实例变量。实际上 Servlet 正在实现单线程模型,这意味着只创建一个 servlet 实例。每个请求一个线程。因此,如果他们有很多请求,那么 thr 必须有很多线程,并且每个线程都共享相同的 servlet 实例,这将产生数据不匹配或数据不一致的问题。线程将在相同的实例上工作。

于 2012-05-19T12:56:33.013 回答