3

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

这个问题是在 2 年前提出的,所以想知道 JSF 2.0 是否还有其他替代方案。

我一直在研究使用

<h:outputStylesheet> 

在这些文件中包含 CSS 和这个 EL 似乎确实被解析了。

但是使用

<h:outputScript>

似乎没有做同样的事情。

所以

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

问题 2)由于它似乎不适用于 JS,因此 在 JavaScript 文件中混合 JSF EL 中的哪个答案被认为是更好的选择。

谢谢

4

2 回答 2

2

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

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

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

您始终可以通过实现自定义资源处理程序来使其工作,其中您通过 EL 评估输入流拉取 JS 文件并设置适当的响应标头,以便浏览器不会缓存它们。但这并不是一件小事,因为您基本上需要重写整个资源管理系统。如果您真的打算并且有足够的经验,那么起点将是扩展ResourceHandlerWrapper课程。那么余民应该为自己说话。

至于提到的哪个替代方案是更好的选择,是您必须自己做出的选择。胜过自己,一种或另一种方法对您的特定情况有多有用或多或少有用。

于 2012-07-04T20:55:33.947 回答
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);

这个想法是在未解析的标签中创建一个 JSON 对象<script>(这就是将“type”设置为“text/json”的作用),然后通过JSON.parse.

另一种(通用)方法是使用类和data-xxx属性将 JSF 上下文中的内容放到 HTML 中,然后 JavaScript 可以“发现”这些内容。

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

于 2012-07-04T20:34:18.453 回答