【问题标题】:FacesContext and "Servlet" ContextFacesContext 和“Servlet”上下文
【发布时间】:2011-04-14 20:04:36
【问题描述】:

是否有任何等效于 FacesContext,但在 servlet 环境中?

我有一些 DAOSessionManager 来处理我的数据库的事务。当当前页面使用 JSF 编写时,我可以使用 FacesContext 来识别当前的 http 请求,但是 servlet 的呢?

我找不到任何方法来获取当前的 Servlet 上下文或 httpRequest...

谢谢。

PS:是的,从我的 DAO 层引用 FacesContext 是一种耻辱,但这是一个开始。

【问题讨论】:

    标签: java jsf servlets facescontext


    【解决方案1】:

    这是ServletContext。它可以通过继承的getServletContext() 方法在 servlet 类中使用。

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        ServletContext context = getServletContext();
        // ...
    }
    

    FacesContext 的主要区别在于ServletContext 不是ThreadLocal,因此您不能像FacesContext#getCurrentInstance() 那样从当前线程“静态”获取它。您确实需要将ServletContext 引用传递到您需要的DAO 方法中:

    someDAO.doSomething(getServletContext());
    

    或者更好的是,为了避免紧密耦合,只需从中提取所需的信息并传递它:

    Object interestingData = getServletContext().getAttribute("interestingData");
    someDAO.doSomething(interestingData);
    

    【讨论】:

    • 我完全理解您的方法,但它不适合我的架构。我有 3 层(dao、域和 GUI——不需要像 MVC/MVP 那样的专用控制层)。
    • 所以,我的域层不是也无法知道 servlet 上下文。我只想调用我的存储库,dao 层的一些技术部分将处理事务、持久性管理器(但它必须在一个“会话”内相同)。事实上,我正在尝试在没有 spring 的情况下模拟开放会话:我对 java 不是很熟练,而且我正在使用谷歌应用引擎。
    • 为此,通常使用FilterThreadLocal 的组合。不过要小心。
    【解决方案2】:
    ServletContext servletContext = (ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();
    

    【讨论】:

      猜你喜欢
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 2015-11-18
      • 2011-04-16
      • 2010-12-21
      • 1970-01-01
      相关资源
      最近更新 更多