由于显示来自外部源的 header 的给定要求,我们提出了以下设置(在 Tomcat 7 上使用 JEE6):
我们的页面经常使用模板:
...
<ui:composition ... template="/WEB-INF/templates/template.xhtml">
...
此模板除了布置页面结构外,还在其正文中包含另一个 XHTML 文件:
...
<h:body>
<ui:include src="./header.xhtml" />
...
然后包含的文件再次使用模板,但这次指向返回 <div>
的外部资源。包含要使用的 header 的元素:
...
<ui:composition ... template="http://someserver/somefile">
...
我知道这个设置有点奇怪,但是为了包含外部生成的 <div>
,间接访问是必要的我们必须包含在页面中的元素。 (如果有人可以为给定的问题提供更聪明的解决方案,我会很高兴。)
到目前为止一切正常,但似乎是这种情况,这个包含的文件被我们的 Tomcat 缓存,导致在更改后不显示当前 header 。如果 Tomcat 重新启动,则会显示新 header 。
谁能告诉我这一切在幕后是如何工作的,以及它是否与 Facelets、Tomcat 或我的特定设置有关?
最佳答案
您可能会使用不同级别的多种解决方案: 你可以只实现一个 ResourceResolver并包含来自定义的 URL 的模板(具有定义的 URL,如 external-resource/header.xhtml)。此 ResourceResolver 可能配置有外部引用。
下一个可能性是拥有一个 ServletFilter,它会后处理您的 HTML 并在定义的位置添加 header 。
最后,您可以实现一个简单的自定义组件,以使用 jQuery 等在服务器或客户端加载 header 。
您通常不希望在 facelets 上禁用缓存,因为它会降低性能。
关于jsf-2 - 外部 facelets 模板 - 它是否被缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15903420/