从 Mojarra/JSF 2.2 开始。不再可能提供自定义 FaceletFactory
使用 web.xml
上下文参数:
<context-param>
<param-name>com.sun.faces.faceletFactory</param-name>
<param-value>my.faces.overrides.MyFaceletFactory</param-value>
</context-param>
我的应用程序提供了一些 CMS 功能,包括虚拟主机支持以根据当前请求的域提供不同的页面(facelets)。所以
http://www.domain1.com/index.xhtml
返回与 http://www.otherdomain.com/index.xhtml
不同的内容.使用自定义资源解析器,其背后的机制并不是什么大问题。这样做的真正问题是,jsf 仅根据其请求的 uri 缓存 facelets,该 uri 不包含主机名(两种情况下都是 "/index.xhtml"
)。我通过简单地在我的自定义 FaceletFactory
中添加主机名来解决这个问题。 :uri = "/" + getCleanHostName() + "://" + uri;
.对于 JSF 2.2,这似乎不再可能。有没有其他方法可以在 JSF 2.2 中存档正确的缓存行为?由于其性能影响,禁用人脸缓存不是一个选项。
最佳答案
有计划按照 issue 611 在 JSF 规范中对其进行标准化。 .但是后来被取消了,因为存在抽象泄漏。另见 What's new in JSF 2.2?但是,尽管 Ed 在 issue 611 中提出要求,但原始状态不再回滚,如下所述:
But when I removed the standardized FaceletFactory, in r11053, I didn't put back the context param. Would you be satisfied if I just put it back and it worked as in 2.1?
您可能想要创建一个新问题来唤醒它。
另一种方法是将其替换为自定义
ResourceHandler
(不是 ResourceResolver
,因为它是 JSF 2.2 中的 deprecated),以及自定义 FaceletCacheFactory
(自 JSF 2.1 起标准化)可通过 <factory><facelet-cache-factory>
注册在 faces-config.xml
.
关于jsf - JSF 2.2 中的自定义 FaceletFactory/虚拟主机 facelets 的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31984924/