在JavaScript文件中混合使用JSF EL

有没有一种方法可以让expression式语言 (EL)expression式包含JSF对JavaScript文件进行评估?

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

五种方式:

  1. 在父JSF页面声明它为全局variables。

    <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. 通过JspServlet传递*.js (仅当它足以仅评估${}expression式时)。 例如在web.xmlJspServlet<servlet-name>可以在servletcontainer的web.xml中find,通常是jsp )。

     <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> 
  4. 利用修改过的内容types的“好老”的JSP。 将script.js重命名为script.jsp ,并将以下行添加到JSP的顶部(仅当它足以仅评估${}expression式时):

     <%@page contentType="text/javascript" %> 
  5. 让JS在加载期间逐渐获取数据。 这是一个jQuery目标示例。

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

由于我不喜欢使浏览器caching本地化string的技术,因此我使用了以下技术来本地化JavaScript警报等。如果您在JavaScript代码中需要的string不同于Web服务器所需的:

 <h:head> <h:outputScript library="javascript" name="#{fw.JsFwStrings}" /> ... 

然后,将资源stringJsFwStrings分配给定义给定语言的本地化string的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?' }