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

2024-01-06

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

澄清:

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

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


仅且仅当您的 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他们在彼此之中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检索 POJO 外部容器中的 servlet 上下文、会话和请求 的相关文章

随机推荐