gpt4 book ai didi

jsf - 了解 FacesContext 实例化细节

转载 作者:行者123 更新时间:2023-12-04 15:44:04 26 4
gpt4 key购买 nike

莫哈拉 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com