ThreadLocal在servlet中存储ServletRequest和Response:对于什么?

gla*_*666 9 java servlets thread-local java-ee

一旦我遇到了一个模式,将where ServletRequest和响应对象放到servlet的局部ThreadLocal变量中.servlet类还有获取当前请求和响应对象的方法.因此,为了获得这些对象,您仍然需要使用servlet对象.

拥有这些ThrealLocal局部变量有什么意义?

Boz*_*zho 17

关键是在类中具有请求和响应对象,否则它们将不具有它们(例如它们不是servlet).一个例子是JSF管理的bean -他们的方法不带HttpServletRequest参数,这样你就可以得到通过的请求FacesContext,其中有他们ThreadLocal的变量.

这样做的原因是因为每个请求都由一个单独的线程(由servlet容器)处理.所以thread = request.但有一点需要注意 - 容器倾向于使用线程池.因此,必须始终在threadlocal中设置一个新的请求,最好在之后清理它(例如在a中Filter).否则你会得到一些意想不到的行为.

但是你应该在代码中避免这种情况.如果您需要请求或响应中的任何内容,请将其作为方法参数传递.否则,您可能会违反图层边界(例如,如果您想在服务图层中使用该请求)