Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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
是否可以在JSF中包含一个文件夹中的所有javascripts文件?_Java_Javascript_Jsf_Jsf 2 - Fatal编程技术网

是否可以在JSF中包含一个文件夹中的所有javascripts文件?

是否可以在JSF中包含一个文件夹中的所有javascripts文件?,java,javascript,jsf,jsf-2,Java,Javascript,Jsf,Jsf 2,我正在使用JSF2.0,并且正在寻找一种方法来包含页面上给定文件夹中的所有Java脚本,例如 <h:outputScript library="javascript" name="*.js" target="head" /> 这种事情可能发生吗?我应该使用java代码编写自定义组件来实现这一点吗 谢谢你的帮助, 塞巴斯蒂安·特罗普(Sébastien Tromp)我没有对此进行测试,但如果不接受通配符,您可以通过支持bean中的java代码获取文件列表,并使用c:forEach

我正在使用JSF2.0,并且正在寻找一种方法来包含页面上给定文件夹中的所有Java脚本,例如

<h:outputScript library="javascript" name="*.js" target="head" />

这种事情可能发生吗?我应该使用java代码编写自定义组件来实现这一点吗

谢谢你的帮助,

塞巴斯蒂安·特罗普(Sébastien Tromp)

我没有对此进行测试,但如果不接受通配符,您可以通过支持bean中的java代码获取文件列表,并使用
c:forEach
ui:repeat
将其插入头部,如:

<ui:repeat value="#{bean.files}" var="file">
    <h:outputScript library="javascript" name="#{file}" target="head" />
</ui:repeat>


请注意,您不能为
h:outputScript
提供绝对路径,但必须从中提取前缀(位于JSF资源路径前面的部分)。

好主意。JSFAPI不支持这一点,但在理论上,使用自定义脚本渲染器是可能的。我在这方面做了一些尝试,这确实是可能的。只需创建一个
MultiScriptRenderer
,它
扩展ScriptRenderer
并覆盖以检查
name
属性是否包含
*
通配符,然后通过扫描资源文件夹中与此模式匹配的文件进行相应处理

以下是一个启动示例:

package com.example;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import com.sun.faces.renderkit.html_basic.ScriptRenderer;

public class MultiScriptRenderer extends ScriptRenderer {

    @Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
        Map<String, Object> attributes = component.getAttributes();
        String name = (String) attributes.get("name");
        if (name.contains("*")) {
            String pattern = name.replace(".", "\\.").replace("*", ".*");
            String library = (String) attributes.get("library");
            File root = new File(context.getExternalContext().getRealPath("/resources/" + (library != null ? library : "")));
            for (File file : root.listFiles()) {
                if (file.getName().matches(pattern)) {
                    attributes.put("name", file.getName());
                    super.encodeEnd(context, component);
                }
            }
            attributes.put("name", name); // Put original name back. You never know.
        } else {
            super.encodeEnd(context, component);
        }
    }
}

在Mojarra 2.0.3上工作良好。您可以使用像
*.js
前缀*.js
这样的模式。特定的代码示例仅与特定的JSF实现紧密耦合以保存代码样板。它还要求在部署时展开WAR,否则无法通过
文件#listFiles()
浏览目录(因此排除了某些(较旧的)servletcontainer版本/配置)。对于其他JSF实现,你必须扩展它的
ScriptRenderer
,或者如果你想独立于实现的话,就写一个全新的(虽然这应该很简单,如果你有点笨拙的话,只要看看标准的
ScriptRenderer
源代码)。

我没有答案,但这确实是一个有趣的问题。如果标准工具无法实现这一点,那么它将对JSF2.1提出一个很好的特性请求。谢谢。与此同时,我已经找到了一些方法来解决包含多个javascript文件的问题,但我肯定会把这些文件留到以后使用。你(自动)将所有松散的JS文件压缩/缩小为一个JS文件吗?为了节省HTTP请求的数量,通常也会这样做
<render-kit>
    <renderer>
        <component-family>javax.faces.Output</component-family>
        <renderer-type>javax.faces.resource.Script</renderer-type>
        <renderer-class>com.example.MultiScriptRenderer</renderer-class>
    </renderer>
</render-kit>