在JavaScript文件中混合使用JSF EL
有没有一种方法可以让expression式语言 (EL)expression式包含JSF对JavaScript文件进行评估?
我希望Seam可以解决这个问题,但是到目前为止还没有运气。 我所要的只是能够在页面间共享的JavaScript函数中使用本地化的消息。
五种方式:
-
在父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>
-
将整个
<script>
放在一个XHTML文件中,并使用ui:include
来包含它。<script type="text/javascript" src="script.js"></script> <ui:include src="script-variables.xhtml" />
-
通过
JspServlet
传递*.js
(仅当它足以仅评估${}
expression式时)。 例如在web.xml
(JspServlet
的<servlet-name>
可以在servletcontainer的web.xml
中find,通常是jsp
)。<servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping>
-
利用修改过的内容types的“好老”的JSP。 将
script.js
重命名为script.jsp
,并将以下行添加到JSP的顶部(仅当它足以仅评估${}
expression式时):<%@page contentType="text/javascript" %>
-
让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?' }