gpt4 book ai didi

java - 在 POJO 外部容器中检索 servlet 上下文、 session 和请求

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:26 25 4
gpt4 key购买 nike

有什么方法可以从 POJO 中检索 session 吗?或者最终从 POJO 中检索 bean。

澄清一下:

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

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

最佳答案

仅当您的 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 上您的前端 Controller 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 和 Wicket 中的那个。

这么说,你看过CDI了吗? ?也许让工件由 CDI 管理更容易,这样您就可以 @Inject他们在彼此。

关于java - 在 POJO 外部容器中检索 servlet 上下文、 session 和请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4764285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com