我找到了这个问题并回答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帖子中的哪个答案被认为是更好的选择。
由于
答案 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
类。剩下的话应该说不出话来。
至于哪个替代方案是更好的选择,是您自己做出的选择。超过你自己对你的特定情况或多或少有用的方法。