在 JavaScript 文件中混合 JSF EL

Posted

技术标签:

【中文标题】在 JavaScript 文件中混合 JSF EL【英文标题】:Mixing JSF EL in a JavaScript file 【发布时间】:2011-02-02 14:50:59 【问题描述】:

有没有办法让 JSF 评估包含 Expression Language (EL) 表达式的 javascript 文件?

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

【问题讨论】:

请发布一个 JavaScript 函数的示例。 【参考方案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>
    

    将整个&lt;script&gt; 放入一个Xhtml 文件并使用ui:include 包含它。

    <script type="text/javascript" src="script.js"></script>
    <ui:include src="script-variables.xhtml" />
    

    通过JspServlet 传递*.js(仅当仅评估$ 表达式就足够了)。例如。在web.xmlJspServlet&lt;servlet-name&gt; 可以在相关servletcontainer 的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在加载的时候ajaxally获取数据。这是一个jQuery 目标示例。

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

【讨论】:

我可能会补充一点,第一个是最简单的。让 Facelets 为您处理。 谢谢。不知道我可以在 &lt;script&gt; 块内使用 &lt;ui:repeat&gt;。顺便说一句:我认为&lt;ui:repeat&gt; 属性应该是value 而不是items【参考方案2】:

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

【讨论】:

以上是关于在 JavaScript 文件中混合 JSF EL的主要内容,如果未能解决你的问题,请参考以下文章

在由 @ResourceDependency 加载的 Javascript 文件中获取 EL

JSF/Facelets:为啥将 JSF/Facelets 与 HTML 标签混合不是一个好主意?

在 JSF2 项目中混合 JSP 和 XHTML (Facelets) - 可能吗?

如何调试 JSF/EL

JSF 何时评估 EL 表达式

JSF 2 - 如何使用 JSF EL 从 web.xml 获取上下文参数值?