実際、「js」、「css」、「img」などの一般的なコンテンツ/ファイル タイプがライブラリ名として使用されている Web 上の例はすべて誤解を招くものです。
実際の例
まず、 MojarraやMyFacesなどの既存の JSF 実装と、 PrimeFacesやOmniFacesなどの JSF コンポーネント ライブラリがどのように JSF を使用しているかを見てみましょう。リソース ライブラリをこのように使用する人は誰もいません。彼らはそれを(隠れて、@ResourceDependency
またはによってUIViewRoot#addComponentResource()
)次のように使用します。
<h:outputScript library="javax.faces" name="jsf.js" />
<h:outputScript library="primefaces" name="jquery/jquery.js" />
<h:outputScript library="omnifaces" name="omnifaces.js" />
<h:outputScript library="omnifaces" name="fixviewstate.js" />
<h:outputScript library="omnifaces.combined" name="[dynamicname].js" />
<h:outputStylesheet library="primefaces" name="primefaces.css" />
<h:outputStylesheet library="primefaces-aristo" name="theme.css" />
<h:outputStylesheet library="primefaces-vader" name="theme.css" />
基本的に、これらすべてのリソースが共通に属する共通のライブラリ/モジュール/テーマ名を表すことが明らかになるはずです。
より簡単な識別
このようにして、それらのリソースがどこに属しているか、どこから来ているかを指定して区別することが非常に簡単になります。primefaces.css
PrimeFaces のデフォルト CSS をオーバーライド/微調整している独自の webapp にリソースがあると想像してください。PrimeFaces が独自のライブラリ名を使用しなかった場合primefaces.css
、PrimeFaces 独自のものは読み込まれず、代わりに webapp が提供するものが読み込まれ、ルック アンド フィールが損なわれます。
また、カスタム を使用しているResourceHandler
場合、 を適切に使用すると、特定のライブラリからのリソースをより細かく制御することもできますlibrary
。すべてのコンポーネント ライブラリがすべての JS ファイルに「js」を使用していたResourceHandler
場合、それが特定のコンポーネント ライブラリから来ているかどうかをどのように区別するのでしょうか? 例としては、OmniFacesCombinedResourceHandler
とGraphicResourceHandler
; createResource()
チェーン内の次のリソース ハンドラに委譲する前にライブラリがチェックされるメソッドをチェックします。CombinedResource
このようにして、作成するタイミングやGraphicResource
目的を知ることができます。
RichFaces が間違っていたことに注意してください。まったく使用せず、そのlibrary
上に別のリソース処理レイヤーを自作したため、RichFaces リソースをプログラムで識別することは不可能です。これこそまさに、OmniFaces がRichFaces リソースで動作するようにするために、リフレクション ベースのハックCombinedResourceHander
を導入しなければならなかった理由です。
あなた自身のウェブアプリ
独自の webapp には、必ずしもリソース ライブラリは必要ありません。省略したほうがいいですよね。
<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />
または、本当に必要な場合は、「デフォルト」や会社名など、より適切な一般名を付けることができます。
<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />
または、リソースが一部のマスター Facelets テンプレートに固有のものである場合は、テンプレートの名前を付けて、相互の関連付けを容易にすることもできます。言い換えれば、それはセルフドキュメンタリーの目的のためのものです. たとえば、/WEB-INF/templates/layout.xhtml
テンプレート ファイルでは次のようになります。
<h:outputStylesheet library="layout" name="css/style.css" />
<h:outputScript library="layout" name="js/script.js" />
そして/WEB-INF/templates/admin.xhtml
テンプレートファイル:
<h:outputStylesheet library="admin" name="css/style.css" />
<h:outputScript library="admin" name="js/script.js" />
実際の例については、OmniFaces ショーケースのソース コードを確認してください。
または、複数の webapps で同じリソースを共有し、この回答と同じ例に基づいてそのための「共通」プロジェクトを作成し、それが webapp の に JAR として埋め込まれている/WEB-INF/lib
場合は、それをライブラリとしても参照します。 (名前は自由に選択できます。OmniFaces や PrimeFaces などのコンポーネント ライブラリも同様に機能します):
<h:outputStylesheet library="common" name="css/style.css" />
<h:outputScript library="common" name="js/script.js" />
<h:graphicImage library="common" name="img/logo.png" />
ライブラリのバージョン管理
もう 1 つの主な利点は、リソース ライブラリのバージョン管理を、独自の webapp によって提供されるリソースに適切な方法で適用できることです (これは、JAR に埋め込まれたリソースには機能しません)。\d+(_\d+)*
リソース ライブラリのバージョンを示すパターンの名前を使用して、ライブラリ フォルダーに直接の子サブフォルダーを作成できます。
WebContent
|-- resources
| `-- default
| `-- 1_0
| |-- css
| | `-- style.css
| |-- img
| | `-- logo.png
| `-- js
| `-- script.js
:
このマークアップを使用する場合:
<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />
v
これにより、ライブラリのバージョンをパラメーターとして使用して、次の HTML が生成されます。
<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&v=1_0" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&v=1_0"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&v=1_0" alt="" />
そのため、リソースを編集/更新した場合は、バージョン フォルダーを新しい値にコピーまたは名前変更するだけです。複数のバージョン フォルダがある場合、JSFResourceHandler
は、数値の順序規則に従って、バージョン番号が最も大きいリソースを自動的に提供します。
したがって、resources/default/1_0/*
フォルダをresources/default/1_1/*
次のようにコピー/名前変更する場合:
WebContent
|-- resources
| `-- default
| |-- 1_0
| | :
| |
| `-- 1_1
| |-- css
| | `-- style.css
| |-- img
| | `-- logo.png
| `-- js
| `-- script.js
:
次に、最後のマークアップの例では、次の HTML が生成されます。
<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&v=1_1" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&v=1_1"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&v=1_1" alt="" />
これにより、パラメーターが変更された URL が初めて要求されたときに、Web ブラウザーはキャッシュから同じ名前のリソースを表示するのではなく、サーバーから直接リソースを要求するようになります。このように、エンドユーザーは、更新された CSS/JS リソースを取得する必要があるときにハード リフレッシュ (Ctrl+F5 など) を行う必要がありません。
JAR ファイルに含まれるリソースについては、ライブラリのバージョン管理ができないことに注意してください。カスタムが必要ですResourceHandler
。jar 内のリソースに JSF バージョニングを使用する方法も参照してください。
以下も参照してください。