web-dev-qa-db-ja.com

JavaScriptファイルでのJSF ELの混合

式言語 (EL)式に含まれるJavaScriptファイルをJSFで評価する方法はありますか?

Seamがこれを回避する方法があることを望んでいましたが、今のところ運がありません。ページ全体で共有されるJavaScript関数でローカライズされたメッセージを使用できるようにしたいだけです。

42
user283680

5つの方法:

  1. 親JSFページでグローバル変数として宣言します。

    <script type="text/javascript" src="script.js"></script>
    <script type="text/javascript">
        var messages = [];
        <ui:repeat value="#{bean.messages}" var="message">
            messages['#{message.key}'] = '#{message.value}';
        </ui:repeat>
    </script>
    

    または、すでにJSON形式である場合。

    <script type="text/javascript" src="script.js"></script>
    <script type="text/javascript">var messages = #{bean.messagesAsJson};</script>
    
  2. <script>全体をXHTMLファイルに入れ、ui:includeを使用してそれを含めます。

    <script type="text/javascript" src="script.js"></script>
    <ui:include src="script-variables.xhtml" />
    
  3. *.jsJspServletを介して渡します(${}式のみを評価するだけで十分な場合のみ)。例えば。 web.xmlJspServlet<servlet-name>は、問題のサーブレットコンテナのweb.xmlにあります。通常はjspです)。

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    
  4. コンテンツタイプを変更した「古き良き」JSPを利用してください。 script.jsの名前をscript.jspに変更し、JSPの先頭に次の行を追加します(${}式のみを評価するのに十分な場合のみ):

    <%@page contentType="text/javascript" %>
    
  5. JSにロード中にデータを無秩序に取得させます。これが jQuery ターゲットの例です。

    $.getJSON('json/messages', function(messages) {
        $.each(messages, function(key, value) {
            $.messages[key] = value;
        });
    });
    
68
BalusC

ブラウザにローカライズされた文字列をキャッシュさせない手法が好きではないので、次の手法を使用してJavaScriptアラートなどをローカライズしました。JavaScriptコードで必要な文字列がWebサーバーに必要なもの:

<h:head>
    <h:outputScript library="javascript" name="#{fw.JsFwStrings}" />
    ...

次に、リソース文字列JsFwStringsを、特定の言語にローカライズされた文字列を定義するJavaScriptファイルのファイル名に割り当てます。

たとえば、fw_en.propertiesファイルにはエントリJsFwStrings = JsFwStrings_en.jsが含まれています

そして、JsFwStrings_en.jsファイルには

var TosFramework = TosFramework || {};
TosFramework.Strings = {
    UnSavedChangesWarning : 'You have unsaved changes.',
    CancelConfirmQuestion : 'Are you sure you want to cancel?'
}
3
timr