1

**可能重复:在这种情况下该帖子的解决方案不可行,请重新打开该帖子!**
JSF bean 属性未在外部 JavaScript 文件中评估

EL 解析器不翻译包含<outputScript>标签的文件(JavaScript 文件)。尝试访问资源包时。

<h:outputScript library="js" name="myScripts.js" target="head"/>;

myScripts.js 文件:

alert("#{msg.browser_not_html5_compatible}");

结果是当警报窗口呈现时我得到了相同的字符串。

如果我的 XHTML 文件的标记中有这行 JavaScript <script>,EL 解析器将用捆绑包中的正确资源字符串替换它;

<script>
    alert("#{msg.browser_not_html5_compatible}");
</script>

我可以让 EL 解析器翻译我包含的 ( <h:outputScript>) JavaScript 文件以访问资源包吗?

4

1 回答 1

1

小服务程序

一种选择可能是创建一个servlet,它加载您的消息包并创建一个 Javascript 文件,其中包含一个 JSON 对象,该对象包含消息键和值。它可能看起来像:

var messages = {
  "browser_not_html5_compatible": "You browser..."
, "other_key": "Other value"
};

如果您有一个大型资源包,并且您不想将所有消息公开给 Javascript,您可以在特定的 Javascript 消息前加上js_. 这样您就可以轻松地遍历资源包keySet并仅使用 Javascript 键:

for (String key : resourceBundle.keySet()){
  if (key.startsWith("js_")){
    // Do something with resourceBundle.getString(key);
  }
}

在您的 JSF 页面上,您必须添加生成的 Javascript。如果需要,可以使用以下命令将视图的语言环境传递给 servlet #{view.locale}

<h:outputScript library="js" name="/path-to-servlet/#{view.locale}" target="head"/>
<h:outputScript library="js" name="myScripts.js" target="head"/>

myScripts.js可以使用:

alert(messages.browser_not_html5_compatible);

JSP

servlet 选项的一个变体是使用 JSP 创建包含 JSON 的 Javascript。您可以通过将内容类型设置为application/javascript

<%@ page contentType="application/javascript; charset=UTF-8" %>

您需要EL 2.2 来迭代资源包keySet(因为没有 getter 可以访问它)。

于 2012-10-03T10:34:37.103 回答