在容器外的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类。

  • 没有arg构造函数
  • 制定者和获得者访问私人领域
  • 实现可序列化。
  • 如果遵循这些约定,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