在POJO外部容器中检索servlet上下文,会话和请求

The*_*olf 7 java session jsp servlets javabeans

有没有办法从POJO中检索会话?或者最终从POJO中检索bean.

澄清:

基本上我是从servlet创建一个bean,我需要从Web容器外部(从POJO)访问该bean的属性.我无法将请求传递给pojo; 并且需要请求来检索会话.

更具体地说,我有一个Web应用程序,它使用Cactus框架从Web界面运行JUnit测试.但是,调用JUnit测试运行器的servlet是在jar中编译的; 我添加了额外的下拉菜单来更改JUnit测试将从中读取的设置以在不同环境(WLI集群)之间切换,因此,如果已经编译了运行器servlet,我无法修改它以处理来自多个环境的额外参数.我已经尝试过写入.dat文件的持久化方法,JUnit测试将通过Reader类读取该文件; 我也尝试过最终无法通过JUnit测试访问的bean方法.

Bal*_*usC 11

只有当你的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).    
}
Run Code Online (Sandbox Code Playgroud)

实现javax.servlet.FilterdoFilter()方法中执行以下操作并映射到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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意try-with-resources语句的重要性.它保证YourContext#close()在过滤器完成其工作后将调用它,并ThreadLocal清除资源.否则,线程在为另一个HTTP请求回收时仍会包含它.

以下是如何在POJO中使用它:

YourContext context = YourContext.getCurrentInstance();
HttpSession session = context.getSession();
Run Code Online (Sandbox Code Playgroud)

这一切基本上也是Context普通MVC框架的对象如何工作,如JSF FacesContext和Wicket中的对象.

说,你看过CDI吗?也许更容易制作CDI管理的工件,因此您可以将@Inject它们彼此放在一起.