JSF 2.2 中的自定义 FaceletFactory / 虚拟主机 facelets 的替代品
Custom FaceletFactory in JSF 2.2 / Alternatives for virtual host facelets
自 Mojarra/JSF 2.2。无法再使用 web.xml
上下文参数提供自定义 FaceletFactory
:
<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
returns 与 http://www.otherdomain.com/index.xhtml
不同的内容。使用自定义资源解析器,其背后的机制并不是什么大问题。这样做的真正问题是,jsf 仅根据其请求的 uri 缓存 facelets,该 uri 不包含主机名(在两种情况下均为 "/index.xhtml"
)。我通过在我的自定义 FaceletFactory
: uri = "/" + getCleanHostName() + "://" + uri;
中简单地添加主机名来解决这个问题。使用 JSF 2.2,这似乎不再可能了。有没有其他方法可以在 JSF 2.2 中存档正确的缓存行为?由于其性能影响,禁用面部缓存不是一个选项。
曾计划根据 issue 611. However, it was cancelled later, because there were abstraction leaks. See also the What's new in JSF 2.2? 在 JSF 规范中对其进行标准化,但尽管 Ed 在问题 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
(not ResourceResolver
, as that's deprecated in JSF 2.2), along with a custom FaceletCacheFactory
(自 JSF 2.1 起标准化),可以通过 faces-config.xml
中的 <factory><facelet-cache-factory>
进行注册。
自 Mojarra/JSF 2.2。无法再使用 web.xml
上下文参数提供自定义 FaceletFactory
:
<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
returns 与 http://www.otherdomain.com/index.xhtml
不同的内容。使用自定义资源解析器,其背后的机制并不是什么大问题。这样做的真正问题是,jsf 仅根据其请求的 uri 缓存 facelets,该 uri 不包含主机名(在两种情况下均为 "/index.xhtml"
)。我通过在我的自定义 FaceletFactory
: uri = "/" + getCleanHostName() + "://" + uri;
中简单地添加主机名来解决这个问题。使用 JSF 2.2,这似乎不再可能了。有没有其他方法可以在 JSF 2.2 中存档正确的缓存行为?由于其性能影响,禁用面部缓存不是一个选项。
曾计划根据 issue 611. However, it was cancelled later, because there were abstraction leaks. See also the What's new in JSF 2.2? 在 JSF 规范中对其进行标准化,但尽管 Ed 在问题 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
(not ResourceResolver
, as that's deprecated in JSF 2.2), along with a custom FaceletCacheFactory
(自 JSF 2.1 起标准化),可以通过 faces-config.xml
中的 <factory><facelet-cache-factory>
进行注册。