关键是将请求和响应对象放在本来没有类的类中(例如,它们不是servlet)。一个示例是JSF托管Bean-
它们的方法不带
HttpServletRequest参数,因此您可以通过来获取请求
FacesContext,该请求将它们包含在
ThreadLocal变量中。
之所以起作用,是因为每个请求都由一个单独的线程(由servlet容器)处理。所以线程=请求。但是需要注意的是-
容器倾向于使用线程池。因此,必须始终在threadlocal中设置一个新的请求,最好在之后将其清除(例如在中
Filter)。否则,您会得到一些意想不到的行为。
但是您应该在代码中真正避免这种情况。如果您需要请求或响应中的任何内容,请将其作为方法参数传递给周围。否则,您可能会违反层边界(例如,如果您倾向于在服务层中使用该请求)



