了解 FacesContext 实例化详细信息

2024-05-02

莫贾拉 2.2.12

这是接管实例化的代码段面孔上下文 http://grepcode.com/file/repo1.maven.org/maven2/javax.faces/jsf-api/2.1/javax/faces/webapp/FacesServlet.java:

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
}

Where

String javax.faces.FactoryFinder.FACES_CONTEXT_FACTORY = "javax.faces.context.FacesContextFactory"

JavaDocs 为FactoryFinder描述了所谓的

中指定的所有工厂对象的标准发现算法 JavaServer Faces API。

这就是我所困惑的。

现在,让我们考虑创建工厂实例的实际方法:javax.faces.FactoryFinderInstance#getFactory(String factoryName) http://grepcode.com/file/repo1.maven.org/maven2/javax.faces/jsf-api/2.1/javax/faces/FactoryFinder.java#FactoryFinder.FactoryManager.getFactory%28java.lang.ClassLoader%2Cjava.lang.String%29

try {
      factoryOrList = factories.get(factoryName);
      if (!(factoryOrList instanceof List)) {
          return factoryOrList;
      }
} finally {
      lock.readLock().unlock();
}

The factories字段初始化如下copyInjectionProviderFromFacesContext() http://grepcode.com/file/repo1.maven.org/maven2/com.sun.faces/jsf-api/2.2.8/javax/faces/FactoryFinderInstance.java#FactoryFinderInstance.copyInjectionProviderFromFacesContext%28%29:

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。你不能解释一下这个循环吗?


有一个特殊的“初始化 FacesContext http://grepcode.com/file/repo1.maven.org/maven2/org.glassfish/javax.faces/2.2.11/com/sun/faces/config/InitFacesContext.java#InitFacesContext" 在 servlet 容器初始化期间可用,确保至少有“a”FacesContext在 JSF 初始化期间。这个特殊的“init FacesContext”有很多空/空/默认属性,特别是依赖于 HTTP servlet 请求/响应的属性,但与应用程序和配置相关的属性,例如通过FacesContext#getApplication()基于 a.o. 已经可用faces-config.xml.

对于 Mojarra,这个“init FacesContext”是created http://grepcode.com/file/repo1.maven.org/maven2/org.glassfish/javax.faces/2.2.11/com/sun/faces/config/FacesInitializer.java#130在 a.o.这com.sun.faces.config.FacesInitializer http://grepcode.com/file/repo1.maven.org/maven2/org.glassfish/javax.faces/2.2.11/com/sun/faces/config/FacesInitializer.java#FacesInitializer, a ServletContainerInitializer https://stackoverflow.com/questions/10776599/servletcontainerinitializer-vs-servletcontextlistener在 webapp 启动期间运行的实现。在那一刻,工厂被创建。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 FacesContext 实例化详细信息 的相关文章