HttpServletRequest request;
HttpServletResponse response;
public void doGet(HttpServletRequest request , HttpServlet response){
this.request = request;
this.response = response;
}
如果此servlet一次收到多个请求会怎样?
我们遇到了响应不匹配问题。这是一个问题吗?
答案 0 :(得分:4)
您的Web应用程序容器仅加载一个servlet实例。
要编写线程安全的servlet,你几乎不应该使用实例变量。将请求和响应设置为实例变量是完全错误的。 servlet的实例不属于单个请求。
如果您需要将请求或响应的元素提供给其他方法,请将它们传递给这些方法。您不需要它们作为实例变量。
答案 1 :(得分:2)
当然这是一个问题。 servlet是一个单例。相同的servlet实例用于处理对此servlet的所有请求。并且请求当然是同时处理的。这意味着如果你这样做,thread1将使用通常由thread2处理的请求和响应。
答案 2 :(得分:1)
引用Servlet规范
“每个请求和响应对象仅在servlet的服务方法范围内有效,或者在过滤器的doFilter方法范围内有效。容器通常是回收的 请求对象以避免请求对象的性能开销 创建。开发人员必须意识到维护对请求对象的引用 不建议在上述范围之外,因为它可能具有不确定性 结果。 “
答案 3 :(得分:0)
这肯定会产生问题,任何实例变量都是共享的,因为servlet是singleton,因此并发请求和响应对象将被覆盖。
答案 4 :(得分:0)
发生的情况是,您的servlet会立即变为不可重入,并且在第一次同时被多个客户端调用时肯定会失败。你不能这样做。
答案 5 :(得分:-2)
这是一个问题,永远不建议将HttpServletRequest请求/ HttpServletResponse响应声明为实例变量。实际上Servlet正在实现单线程模型,这意味着只创建了一个servlet实例。每个请求都有一个线程。因此,如果它们有很多请求,则thr必须是多个线程,并且每个线程共享相同的servlet实例,这将导致数据不匹配或数据不一致问题。线程将在相同的实例上工作。