我需要知道这是如何工作的:
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
这意味着,在某些服务器收到请求的地方(实际上是Faces API那样做),它做了类似的事情:
FacesContext fx = new FacesContext();
fx.setRequest(httpServletRequest);
FacesContext.setCurrentInstance(fx);
所以..假设这种情况:
发送了一个请求...填充了FacesContext对象..然后它在此等待5秒(通过任何方式,例如使用Thread.sleep()
)..另一个请求发送谁 - 我的理解 - 将覆盖FacesContext.getCurrentInstance()
对象的内容..所以当前一个请求来自睡眠时,它将读取覆盖内容..
我的理解是否真实?
答案 0 :(得分:4)
不,这不是真的。每个HTTP请求/响应周期都在一个完全专用的线程中执行。 FacesContext
在请求开始时创建,并存储为ThreadLocal
变量,该变量在响应完成时被删除。 getCurrentInstance()
会返回ThreadLocal
变量。在同一个线程中执行的代码中的任何位置(读取:相同的请求)都可以访问相同的FacesContext
实例。使用他们自己的 FacesContext
实例在他们自己的线程中运行不同的请求。 FacesContext
的创建和销毁由FacesServlet
管理。
ThreadLocal