一旦我遇到了一个模式,ServletRequest和响应对象被放到servlet的本地ThreadLocal变量中. servlet类还有获取当前请求和响应对象的方法.因此,为了获得这些对象,您仍然需要使用servlet对象.
拥有这些ThrealLocal局部变量有什么意义?
解决方法:
关键是在类中具有请求和响应对象,否则它们将不具有它们(例如它们不是servlet).一个例子是JSF托管bean – 它们的方法不接受HttpServletRequest参数,因此您可以通过FacesContext获取请求,FacesContext将它们包含在ThreadLocal变量中.
这样做的原因是因为每个请求都由一个单独的线程(由servlet容器)处理.所以thread = request.但有一点需要注意 – 容器倾向于使用线程池.因此,必须始终在threadlocal中设置一个新请求,最好在之后清理它(例如在Filter中).否则你会得到一些意想不到的行为.
但是你应该在代码中避免这种情况.如果您需要请求或响应中的任何内容,请将其作为方法参数传递.否则,您可能会违反图层边界(例如,如果您想在服务图层中使用该请求)
标签:thread-local,java,java-ee,servlets
来源: https://codeday.me/bug/20190927/1822665.html