2010-11-24 3 views
9

JSF 2で作業を開始しましたので、h:outputStylesheetを試してみたいです。それはうまく動作しますが、その後、ブラウザに変更をフェッチさせるためにファイルバージョンによって変更されるリクエストにクエリ文字列を追加するという "パターン"やトリックを適用しようとしました。JSF 2 h:outputStylesheetを使用して(キャッシュの問題を解決するために)「CSSのバージョン管理」を実装するにはどうすればよいですか?

と同様のものwhat is used here

残念ながら私はそれを行うことができませんでした。実際には、そのタグを使用すると単純なURLではなく、すでにクエリ文字列を持つ計算済みURLを生成します。 JSF 2のリソースのバージョン管理に関する情報を、仕様とhereの両方で見つけましたが、必要なものではない複数のバージョンのリソースを参照しているようです。

私はいつでも新しいタグを使用しないように戻ることができます。しかし、私はここでこれを議論のために共有したかったのです。

アップデート1 - いくつかの例:

<h:outputStylesheet library="css" name="estilo.css?v=1" target="head"/> 

としてレンダリング:

<link type="text/css" rel="stylesheet" href="RES_NOT_FOUND" /> 

かなりわかりやすい

私が試したことは、このようなものです。 JSPを使用して、私はこの方法を置くために使用され、

<link rel="stylesheet" type="text/css" href="../css/estilo.css?v=1"/> 

:;-)

私は何を取得しようとすると、このようなものです

<link rel="stylesheet" type="text/css" 
href="<c:url value='/css/estilo.css?v=${initParam.version}'/>"/> 
+0

あなたが試したものの一例を投稿することができますか? :) –

+0

これについては面倒なことがあります。この機能はすべてのWebフレームワークにバンドルする必要があります。静的リソースにすでにHTTPヘッダーの有効期限を追加していますか、それともなぜ必要なのですか?そうでなければ、クライアントはファイルが変更されていないかどうかを確認する要求を常に行います。 –

+0

いくつかの例で更新しています。 – sargue

答えて

7

同じ課題に直面し、私は終わりましたjavax.faces.application.ResourceHandlerWrapper and javax.faces.application.ResourceWrapperを延長して、ResourceWrapper#getRequestString()の結果に「& v = xyz」を追加します。

この種のソリューションは、PrimefacesとOpenfacesで実装されています。 だけ

org.primefaces.application.PrimeResourceHandler#createResource(String resourceName, String libraryName) 

org.primefaces.application.PrimeResource#getRequestPath() 

Available here

のソースを見てみましょう。

のfaces-config.xmlのにあなたの実装を追加することを忘れないでください:

<application> 
    <resource-handler>your.package.YourResourceHandlerWrapper</resource-handler> 
</application>