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 ヘッダー テンプレートをメイン テンプレートにマージしても、この問題の解決にはなりません。これは、ヘッダー テンプレートがdynamicであるという主要な課題に対処していないためです。

それが役立つことを願っています! 乾杯:^)


注: 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

使用できるさまざまなレベルの複数のソリューションがあります。ResourceResolver を実装し、定義済みの URL (external-resource/header.xhtml のような定義済みの URL) からテンプレートを含めることができます。この ResourceResolver は、外部参照で構成されている可能性があります。

次の可能性は、HTML を後処理し、定義された位置にヘッダーを追加する ServletFilter を持つことです。

最後に、単純なカスタム コンポーネントを実装して、jQuery などを使用してサーバーまたはクライアント側でヘッダーをロードできます。

パフォーマンスが低下するため、通常、Facelets でキャッシュを無効にすることは望ましくありません。

于 2013-04-18T13:07:24.417 に答える