42

有没有办法让JSF 评估包含表达式语言(EL) 表达式的 JavaScript 文件?

我希望 Seam 可能有办法解决这个问题,但到目前为止还没有运气。我想要的只是能够在跨页面共享的 JavaScript 函数中使用本地化消息。

4

2 回答 2

71

五种方式:

  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. 通过(仅当仅评估表达式就足够了*.js)。例如 in (可以在相关的 servletcontainer 中找到of ,通常是)。JspServlet${}web.xml<servlet-name>JspServletweb.xmljsp

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    
  4. 使用经过修改的内容类型的“旧”JSP。重命名并添加以下行script.jsscript.jspJSP 的顶部(仅当它足以仅评估${}表达式时):

    <%@page contentType="text/javascript" %>
    
  5. 让JS在加载过程中ajaxically获取数据。这是一个针对jQuery的示例。

    $.getJSON('json/messages', function(messages) {
        $.each(messages, function(key, value) {
            $.messages[key] = value;
        });
    });
    
于 2010-03-30T19:04:34.407 回答
3

由于我不喜欢不允许浏览器缓存本地化字符串的技术,因此我使用以下技术来本地化 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?'
}
于 2014-03-24T08:04:11.513 回答