仅且仅当POJO与运行中的线程在 同一
线程
HttpServletRequest中运行时,您才能在的帮助下实现此目标
ThreadLocal<T>。
创建以下类:
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在
doFilter()方法中执行以下操作并映射到
url-pattern感兴趣的对象(例如,
/*或在
servlet-name您的前端控制器servlet上)的实现。
@Overridepublic 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和Wicket中的对象。
话说回来,您看过CDI吗?使工件进行CDI管理也许更容易,所以您可以将
@Inject它们相互配合。



