2012-07-04 48 views
3

JSF表达式语言,我发现这个问题,并回答Mixing JSF EL in a JavaScript file包括JavaScript的

问题2年多前有人问这样是否有与JSF 2.0任何其他替代方案不知道。

我一直在寻找使用

<h:outputStylesheet> 

用于包括在这些文件中的CSS和这个EL似乎得到解析。

但是使用

<h:outputScript> 

似乎并没有这样做。

所以

问题1)请问上面是这样做(如果它的工作)的更好的办法?

问题2)因为它似乎没有JS的工作,Mixing JSF EL in a JavaScript file后的哪个答案被认为是更好的选择。

感谢

回答

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对象(也就是设置了“类型”为“text/JSON”会做),然后通过阅读JSON.parse

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

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

2

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

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

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

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

至于哪个提到的替代方案是更好的选择,是你必须自己做的选择。对于你的特殊情况,这种方法或多或少的用处大于你自己。