仅且仅当您的 POJO 运行在same线程作为HttpServletRequest
正在运行,那么您将能够在以下帮助下实现这一目标ThreadLocal<T> http://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html.
创建以下类:
public final class YourContext implements AutoCloseable {
private static ThreadLocal<YourContext> instance = new ThreadLocal<>();
private HttpServletRequest request;
private HttpServletResponse response;
private YourContext(HttpServletRequest request, HttpServletResponse response) {
this.request = request;
this.response = response;
}
public static YourContext create(HttpServletRequest request, HttpServletResponse response) {
YourContext context = new YourContext(request, response);
instance.set(context);
return context;
}
public static YourContext getCurrentInstance() {
return instance.get();
}
@Override
public void close() {
instance.remove();
}
public HttpServletRequest getRequest() {
return request;
}
public HttpSession getSession() {
return request.getSession();
}
public ServletContext getServletContext() {
return request.getServletContext();
}
// ... (add if necessary more methods here which return/delegate the request/response).
}
实施javax.servlet.Filter http://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html它执行以下操作doFilter()
方法并映射到url-pattern
感兴趣的,例如/*
或在servlet-name
您的前端控制器 servlet 的。
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
try (YourContext context = YourContext.create(request, response)) {
chain.doFilter(request, response);
}
}
请注意 try-with-resources 语句的重要性。它保证了YourContext#close()
将在过滤器完成其工作后调用ThreadLocal
资源将被清除。否则,当为另一个 HTTP 请求回收时,线程仍将包含它。
以下是在 POJO 中使用它的方法:
YourContext context = YourContext.getCurrentInstance();
HttpSession session = context.getSession();
这一切基本上也是如何的Context
普通 MVC 框架的对象工作原理,如 JSF 的FacesContext http://docs.oracle.com/javaee/7/api/javax/faces/context/FacesContext.html以及威基特的那个。
说了这么多,你有没有看过CDI https://javaee.github.io/tutorial/partcdi.html#GJBNR?也许让工件由 CDI 管理更容易,这样您就可以@Inject
他们在彼此之中。