3

私はこの質問と回答を見つけました JavaScriptファイルにJSF ELを混在させる

この質問は 2 年以上前に出されたもので、JSF 2.0 に別の選択肢があるかどうか疑問に思っていました。

私は使用して見てきました

<h:outputStylesheet> 

これらのファイルに CSS とこの EL を含めるため、解析されるようです。

ただし、

<h:outputScript>

同じことをしていないようです。

そう

質問1)上記の方法がより良い方法でしょうか(うまくいく場合)?

質問 2) JS では動作しないように思われるため 、JavaScript ファイルの投稿で JSF EL を混在させる のどの回答がより適切なオプションと見なされますか。

ありがとう

4

2 に答える 2

2

オプションのリストに追加したい BalusC は、グローバル変数を回避する最初のもののバリエーションを提供しました。

<script id='message-data' type='text/json'>
  { "messages": [    
  <ui:repeat items="#{bean.messages}" var="message">"#{message.value}",</ui:repeat> null
  ] }
</script>

次に、JavaScript から、メッセージが必要なときに次のことができます。

var msgData = document.getElementById('message-data').innerHTML;
msgData = JSON.parse(msgData);

アイデアは、解析されていないタグで JSON オブジェクトを作成し<script>(「タイプ」を「text/json」に設定することで実現します) JSON.parse、.

もう 1 つの (一般的な) アプローチは、クラスとdata-xxx属性を使用して JSF コンテキストから HTML にドロップし、JavaScript によって「検出」できるようにすることです。

サーバー側のテンプレート システムを使用して JavaScript ファイル全体を処理すると、それらのファイルがクライアントによってキャッシュ不可になるという重大な欠点があります。

于 2012-07-04T20:34:18.453 に答える
2

現在、JSF API を介して JS を EL 対応リソースに追加する方法はありません。Mojarra の場合、com.sun.faces.application.resource.ResourceHelperクラスにハードコーディングされています。

private static final String[] EL_CONTENT_TYPES = {
    "text/css"
};

リソース管理コンポーネントの 1 つをラップしてこれをオーバーライドする方法はありません。#{resource['library:image.png']}EL は、CSS 背景画像宣言で「静的」表現をサポートすることのみを目的として、CSS でサポートされています。「静的」とは、アプリケーション全体で同じ評価結果が保証されることを意味します。JS の他の使用例は、JSF 仕様では考慮されていません。リクエストごとに異なる結果を評価する可能性のある EL 式は、JS/CSS リソースでは失敗します。これは、Web ブラウザーがデフォルトで、最初のリクエストから決められた時間 (少なくとも 1 週間続く可能性がある) の間、これらのリソースをキャッシュするためです。

入力ストリームを評価する EL を介して JS ファイルをプルし、ブラウザがそれらをキャッシュしないように適切な応答ヘッダーを設定するカスタム リソース ハンドラーを実装することで、いつでも動作させることができます。ただし、基本的にリソース管理システム全体を書き直す必要があるため、これは簡単な作業ではありません。あなたが本当にそうするつもりで、十分な経験を積んでいるなら、出発点はResourceHandlerWrapperクラスを拡張することです. その時、レムナントは自分自身のために話す必要があります。

言及された選択肢のどれがより良い選択肢であるかについては、あなた自身が選択しなければなりません. 特定のケースに対して、どちらかのアプローチが多かれ少なかれ有用であるかを自分自身よりも重視してください。

于 2012-07-04T20:55:33.947 に答える