3

由于显示来自外部源的标头的给定要求,我们提出了以下设置(在 Tomcat 7 上使用 JEE6):

我们的页面经常使用模板:

...
<ui:composition ... template="/WEB-INF/templates/template.xhtml">
...

除了布局页面结构之外,此模板还包括另一个 XHTML 文件在其正文中:

...
<h:body>
  <ui:include src="./header.xhtml" />
...

然后包含的文件再次使用模板,但这次指向一个外部资源,该资源返回一个<div>包含要使用的标头的元素:

...
<ui:composition ... template="http://someserver/somefile">
...

我知道这个设置有点奇怪,但是为了包含<div>我们必须包含在页面中的外部生成元素,间接是必要的。(如果有人可以为给定的问题提供更智能的解决方案,我会很高兴。)

到目前为止,这工作正常,但似乎是这种情况,这个包含的文件被我们的 Tomcat 缓存,导致在更改后不显示当前标题。如果 Tomcat 重新启动,则会显示新的标头。

有人可以给我一些见解,这一切是如何在幕后工作的,以及它是否与 Facelets、Tomcat 或我的特定设置有关?

4

2 回答 2

2

在 JSF 2(即在 Facelets 中)中,模板是一段静态内容,其中可以包含动态内容。

如果你想使用不同的模板,首先你必须用不同的 URL 路径指向不同的页面,然后不同的页面可以使用不同的模板:

<ui:include src="./header{$HeaderTemplateSuffix}.xhtml" />

然后 headerABC.xml 可以有:

...
<ui:composition ... template="http://someserver/somefileABC">
...

和 headerDEF.xml 可以有

...
<ui:composition ... template="http://someserver/somefileDEF">
...

或者,您可以放弃对标头使用模板,并动态生成所有标头内容(甚至包括静态部分)。

注意:将 html 标头模板合并回主模板不是解决此问题的方法,因为它没有解决标头模板动态的核心挑战。

希望有帮助!干杯:^)


注意:可以在 web.xml 中设置以下内容:

<!-- Time in seconds that facelets should be checked for changes since last request. A value of -1 disables refresh checking. -->
<context-param>
    <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
    <param-value>0</param-value>
</context-param>

<!-- Set the project stage to "Development", "UnitTest", "SystemTest", or "Production". -->
<!-- An optional parameter that makes troubleshooting errors much easier. -->
<!-- You should remove this context parameter before deploying to production! -->
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

但是,这旨在服务于完全不同的目的:允许开发人员动态更改任何静态资源,JSF 容器将动态检查更改并在开发期间加载它。您无意使用它来模拟动态模板,并且设置上述属性将对生产环境中的性能和安全行为产生负面影响。

于 2013-04-18T04:18:54.163 回答
2

There are multiple solutions on different levels, that you might use: You could just implement a ResourceResolver and include a template from a defined URL (with a defined URL like external-resource/header.xhtml). This ResourceResolver might be configured with the external reference.

The next possibility would be to have a ServletFilter that post processes your HTML and adds the header at a defined position.

And finally you could implement a simple custom component to load the header either on server or on client side using jQuery or such.

You generally don't want to disable caching on the facelets since it will decrease performance.

于 2013-04-18T13:07:24.417 回答