【问题标题】:JSF outputScript and JavaScripts not parsed by EL? [duplicate]JSF outputScript 和 JavaScript 不被 EL 解析? [复制]
【发布时间】:2012-09-24 04:33:33
【问题描述】:

**Possible Duplicate:在这种情况下这个帖子的解决方法是不可行的,请重新打开这个帖子! **
JSF bean property not evaluated in external JavaScript file

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

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

myScripts.js 文件:

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

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

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

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

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

【问题讨论】:

    标签: java jsf-2 java-ee-6 el


    【解决方案1】:

    小服务程序

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

    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。如果需要,可以使用 #{view.locale} 将视图的语言环境传递给 servlet:

    <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 可以访问它)。

    【讨论】:

    • 有趣的解决方案,但不知道当应用程序支持多语言时该解决方案如何?
    • 您可以使用#{view.locale} 将语言环境作为get 参数传递给您的servlet。
    • 我有一个变通方法,以便 EL 解析器翻译位于单独文件中的 JavaScript。该解决方案涉及使用 EL 解析的 标记。但现在我不能分享这一点,因为 stackoverflow 的忙碌人士关闭了这种可能性。如果有人想查看解决方案,我可以为答案制作单独的常见问题解答。
    • 您所说的“单独的常见问题解答”是什么意思?
    • 本帖已关闭,无法在此处发布解决方案。感谢您的努力。
    猜你喜欢
    • 2012-02-10
    • 2011-07-31
    • 2011-01-12
    • 1970-01-01
    • 2013-04-24
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    相关资源
    最近更新 更多