在容器外的POJO中检索servlet上下文,会话和请求
有没有办法从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运行在与运行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()
方法中doFilter()
以下操作,并映射到感兴趣的url-pattern
,例如/*
或前端控制器servlet的servlet-name
上。
@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);
}
}
请注意试用资源声明的重要性。 它确保在过滤器完成其作业并清除ThreadLocal
资源后,将调用YourContext#close()
。 否则,该线程在为其他HTTP请求回收时仍将包含该线程。
以下是你如何在POJO中使用它:
YourContext context = YourContext.getCurrentInstance();
HttpSession session = context.getSession();
这一切基本上也是平均MVC框架的Context
对象的工作方式,如JSF的FacesContext
和Wicket中的。
说,你看过CDI吗? 也许CDI管理工件更容易,所以你可以@将它们@Inject
彼此。
Pojo是一个普通的旧Java对象。 POJOS与会话无关。
https会话在请求对象上可用。
看看这个
http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/api/index.html
特别是HttpServletRequest接口和getSession()方法。
对于你的问题的'bean'部分。 一个bean是一个符合3个标准的java类。
如果遵循这些约定,POJO就是一个bean。
假设你指的是Servlet编程....
从POJO到会话没有直接的途径。 您需要从HttpServletRequest对象获取会话。
有两种流行的解决方案,我已经看到处理这个问题。
第一个选项是创建一个包含Session的某种上下文对象。 然后将此上下文传递到您的业务层,以便您的POJO可以在需要时获取此信息。
第二个选择是利用ThreadLocal存储。 会话通常由过滤器或拦截器放置在ThreadLocal存储上。 然后系统中的任何对象都可以从线程中获取它。 这种模式出现在许多像Spring和Struts这样的Web框架中。
链接地址: http://www.djcxy.com/p/76537.html上一篇: Retrieving servlet context, session and request in a POJO outside container
下一篇: Differences between Anonymous, Singleton & Companion Object in Scala