Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中包含JSF表达式语言_Javascript_Jsf_El - Fatal编程技术网

在JavaScript中包含JSF表达式语言

在JavaScript中包含JSF表达式语言,javascript,jsf,el,Javascript,Jsf,El,我找到了这个问题和答案 这个问题是两年前提出的,所以我想知道JSF2.0是否还有其他替代方案 我一直在考虑使用 <h:outputStylesheet> 因为在这些文件中包含CSS和EL似乎确实得到了解析 然而使用 <h:outputScript> 似乎不一样 所以 问题1)上述方法是否更好(如果有效) 问题2)由于它似乎不适用于JS,在文章中的哪个答案被认为是更好的选择 谢谢我将添加到选项列表中,BalusC在第一个选项上提供了一个可以避免全局变量的变量:

我找到了这个问题和答案

这个问题是两年前提出的,所以我想知道JSF2.0是否还有其他替代方案

我一直在考虑使用

<h:outputStylesheet> 

因为在这些文件中包含CSS和EL似乎确实得到了解析

然而使用

<h:outputScript>

似乎不一样

所以

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

问题2)由于它似乎不适用于JS,在文章中的哪个答案被认为是更好的选择


谢谢

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

<script id='message-data' type='text/json'>
  { "messages": [    
  <ui:repeat items="#{bean.messages}" var="message">"#{message.value}",</ui:repeat> null
  ] }
</script>
我们的想法是在未解析的
标记中创建一个JSON对象(这就是将“type”设置为“text/JSON”将要做的),然后通过
JSON.parse
读取它

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


使用服务器端模板系统来处理整个JavaScript文件有一个显著的缺点,即使客户端无法缓存这些文件

目前,没有办法通过jsfapi将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。在JS/CSS资源中,可能基于每个请求计算不同结果的EL表达式将失败,因为webbrowser默认情况下会在第一个请求后将这些资源缓存一段确定的时间,这可能会持续至少一周

通过实现一个定制的资源处理程序,您可以通过一个输入流提取JS文件,并设置适当的响应头,这样浏览器就不会缓存它们,从而始终可以让它工作。但这并不是一项简单的工作,因为您基本上需要重写整个资源管理系统。如果你真的打算并且有足够的经验,那么你的出发点就是扩展这个类。剩下的人应该为自己说话

至于上述哪种选择是更好的选择,这是你必须自己做出的选择。超过你自己的一个或另一个方法对你的特殊情况有多大或少的用处

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