式言語 (EL)式に含まれるJavaScriptファイルをJSFで評価する方法はありますか?
Seamがこれを回避する方法があることを望んでいましたが、今のところ運がありません。ページ全体で共有されるJavaScript関数でローカライズされたメッセージを使用できるようにしたいだけです。
5つの方法:
親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>
<script>
全体をXHTMLファイルに入れ、ui:include
を使用してそれを含めます。
<script type="text/javascript" src="script.js"></script>
<ui:include src="script-variables.xhtml" />
*.js
をJspServlet
を介して渡します(${}
式のみを評価するだけで十分な場合のみ)。例えば。 web.xml
(JspServlet
の<servlet-name>
は、問題のサーブレットコンテナのweb.xml
にあります。通常はjsp
です)。
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
コンテンツタイプを変更した「古き良き」JSPを利用してください。 script.js
の名前をscript.jsp
に変更し、JSPの先頭に次の行を追加します(${}
式のみを評価するのに十分な場合のみ):
<%@page contentType="text/javascript" %>
JSにロード中にデータを無秩序に取得させます。これが jQuery ターゲットの例です。
$.getJSON('json/messages', function(messages) {
$.each(messages, function(key, value) {
$.messages[key] = value;
});
});
ブラウザにローカライズされた文字列をキャッシュさせない手法が好きではないので、次の手法を使用して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?'
}