在JavaScript中包含JSF表达式语言

时间:2012-07-04 20:24:01

标签: javascript jsf el

我找到了这个问题并回答Mixing JSF EL in a JavaScript file

2年前问过这个问题,所以想知道JSF 2.0是否还有其他选择。

我一直在考虑使用

<h:outputStylesheet> 

包含CSS,这些文件中的EL似乎得到了解析。

但是使用

<h:outputScript>

似乎没有做同样的事情。

所以

问题1)上述是否是更好的方法(如果有效)?

问题2)由于它似乎不适用于JS,Mixing JSF EL in a JavaScript file帖子中的哪个答案被认为是更好的选择。

由于

2 个答案:

答案 0 :(得分:2)

我将添加到选项列表中BalusC提供了第一个避免全局变量的变体:

<script id='message-data' type='text/json'>
  { "messages": [    
  <ui:repeat items="#{bean.messages}" var="message">"#{message.value}",</ui:repeat> null
  ] }
</script>

然后从JavaScript中,当您需要消息时,您可以:

var msgData = document.getElementById('message-data').innerHTML;
msgData = JSON.parse(msgData);

我们的想法是在未解析的<script>标记中创建一个JSON对象(这就是将“type”设置为“text / json”的方式),然后通过JSON.parse读取它。

另一种(通用)方法是使用类和data-xxx属性将事物从JSF上下文中删除到HTML中,然后可以通过JavaScript“发现”。

使用服务器端模板系统处理整个JavaScript文件具有使这些文件不被客户端缓存的显着缺点。

答案 1 :(得分:2)

目前,没有办法通过JSF API将JS添加到EL支持的资源。在Mojarra的情况下,它在com.sun.faces.application.resource.ResourceHelper类中被硬编码。

private static final String[] EL_CONTENT_TYPES = {
    "text/css"
};

无法通过包装其中一个资源管理组件来覆盖它。 CSS支持EL,其唯一目的是支持CSS背景图像声明中的“静态”#{resource['library:image.png']}表达式。对于“静态”,我的意思是,他们保证应用范围内的相同评估结果。 JSF规范中没有考虑JS的其他用例。可以在每个请求的基础上评估不同结果的EL表达式在JS / CSS资源中会失败,因为默认情况下webbrowser会在第一个请求之后将这些资源缓存一段确定的时间,这可能持续至少一周。 / p>

您始终可以通过实现自定义资源处理程序来使其工作,其中您通过EL评估输入流提取JS文件并设置相应的响应标头,以便浏览器不会缓存它们。但这并不是一项微不足道的工作,因为您基本上需要重写整个资源管理系统。如果你真的打算并且经验丰富,那么起点就是扩展ResourceHandlerWrapper类。剩下的话应该说不出话来。

至于哪个替代方案是更好的选择,是您自己做出的选择。超过你自己对你的特定情况或多或少有用的方法。