jsf - 了解 FacesContext 实例化细节

标签 jsf lifecycle

莫哈拉 2.2.12

这是接管 FacesContext 实例化的一段代码:

FacesContext context = facesContextFactory.getFacesContext
              (servletConfig.getServletContext(), request, response, lifecycle);

表达是完全清楚的。一旦我们收到请求,我们就会从中获取全局信息并创建 FacesContext使用它的实例。因此,实例是为每个请求创建的。但是获取facesContextFactory的实例在我看来要棘手得多。
// Acquire our FacesContextFactory instance
try {
    facesContextFactory = (FacesContextFactory)
        FactoryFinder.getFactory
        (FactoryFinder.FACES_CONTEXT_FACTORY);
} catch (FacesException e) {
    //others
}

在哪里
String javax.faces.FactoryFinder.FACES_CONTEXT_FACTORY = "javax.faces.context.FacesContextFactory"

JavaDocs for the FactoryFinder描述了所谓的

standard discovery algorithm for all factory objects specified in the JavaServer Faces APIs.



这是我困惑的地方。

现在,让我们考虑创建工厂实例的实际方法:javax.faces.FactoryFinderInstance#getFactory(String factoryName)
try {
      factoryOrList = factories.get(factoryName);
      if (!(factoryOrList instanceof List)) {
          return factoryOrList;
      }
} finally {
      lock.readLock().unlock();
}
factories字段初始化如下 copyInjectionProviderFromFacesContext() :
private void copyInjectionProviderFromFacesContext() {
    InjectionProvider injectionProvider = null;
    FacesContext context = FacesContext.getCurrentInstance(); //USE FACES CONTEXT!!!!!
    if (null != context) {
        injectionProvider = (InjectionProvider) context.getAttributes().get("com.sun.faces.config.ConfigManager_INJECTION_PROVIDER_TASK");
    }
    if (null != injectionProvider) {
        factories.put(INJECTION_PROVIDER_KEY, injectionProvider);
    } else {
        if (LOGGER.isLoggable(Level.SEVERE)) {
            LOGGER.log(Level.SEVERE, "Unable to obtain InjectionProvider from init time FacesContext. Does this container implement the Mojarra Injection SPI?");
        }
    }
}

因此,创建使用 FacesContext实例,但工厂本身用于创建 FacesContext .你不能解释那个循环吗?

最佳答案

有一个特殊的“init FacesContext”,它在 servlet 容器初始化期间可用,确保至少有“一个”FacesContext在 JSF 初始化期间。这个特殊的“init FacesContext”有很多空/空/默认属性,特别是那些依赖于 HTTP servlet 请求/响应的属性,但与应用程序和配置相关的属性,例如可以通过 FacesContext#getApplication() 获得的属性。已经基于 a.o. faces-config.xml .

在 Mojarra 的情况下,这个“init FacesContext”是 created在 a.o. com.sun.faces.config.FacesInitializer , ServletContainerInitializer 在 webapp 启动期间运行的实现。在那一刻,工厂被创建。

关于jsf - 了解 FacesContext 实例化细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32391917/

相关文章:

验证错误 : Value is not valid

jsf - 为什么 JSF 文档中没有 InputHidden 只读属性?

java - JSF f :selectItems using List error

jaxb2 目标未调用

maven - 建立自定义Maven生命周期而不创建插件

java - JSF 2.0 组件

css - 更改 f :facet name ="header" in primefaces 的颜色

android - 是/否对话框和生命周期

javascript - Vue 兄弟组件 Hook 生命周期关系

android - onAttachedToWindow 和 onStart 之间的确切区别是什么