我该如何使用 <h:outputScript /> 标签来调用远程文件?

7
我有一台专用于静态内容的服务器,因此我不希望使用资源目录来存储JavaScript文件,但我仍想继续使用<h:outputScript />标签。如何使该标记生成到包含文件的静态服务器链接而不是 RES_NOT_FOUND ?我甚至不需要JSF检查文件是否存在。
我尝试过:<h:outputScript name="# {requestBean.staticURL} /javascript.js"/> 以生成:<script type="text/javascript" src="http://static.server.com/javascript.js"></script> 但它生成了:< script type = "text / javascript" src = "RES_NOT_FOUND"> </ script> 我该怎么办? 解决方案: Daniel向我介绍了一个好的解决方案!我已经下载了Omnifaces的源代码,并修改了 org.omnifaces.resourcehandler.CDNResourceHandle.createResource(String resourceName, String libraryName)方法:
public Resource createResource(String resourceName, String libraryName) {
    final Resource resource = wrapped.createResource(resourceName, libraryName);

    if (cdnResources == null) {
        return resource;
    }

    String resourceId = ((libraryName != null) ? libraryName + ":" : "") + resourceName;

    String path = cdnResources.get(resourceId);

    if(path == null){
        if(libraryName != null){
            resourceId = libraryName + ":%";
            path = cdnResources.get(resourceId);
            if(path == null){
                return resource;
            }
            path += "/"+resourceName;
        }
        else return resource;
    }

    final String requestPath = path;

    return new ResourceWrapper() {

        @Override
        public String getRequestPath() {
            return requestPath;
        }

        @Override
        public Resource getWrapped() {
            return resource;
        }
    };
}

有了这个改变,我可以将它添加到我的web.xml文件中。

<context-param>
    <param-name>org.omnifaces.CDN_RESOURCE_HANDLER_URLS</param-name>
    <param-value>
        somelib2:%=http://cdn.example.com/somelib2,
        js/script1.js=http://cdn.example.com/js/script1.js,
        somelib:js/script2.js=http://cdn.example.com/somelib/js/script2.js,
        otherlib:style.css=http://cdn.example.com/otherlib/style.css,
        images/logo.png=http://cdn.example.com/logo.png
   </param-value>
</context-param>

请注意somelib2:%=http://cdn.example.com/somelib2,这将把somelib2库中的任何资源指向http://cdn.example.com/somelib2的相对路径,例如:

<h:outputScript name="js/myjs.js" library="somelib2" />

将输出:

<script type="text/javascript" src="http://cdn.example.com/somelib2/js/myjs.js"></script>

这适用于<h:outputScript /><h:outputStylesheet /><h:graphicImage />等使用资源的所有内容;

2个回答

8

由于 <h:outputScript /> 只能读取 Web 应用程序内部的本地资源文件夹,因此您无法这样做。

您可以使用 Omnifaces CDNResourceHandler,请参见Omnifaces CDNResourceHandler,并查看JavaDoc

它将允许您使用来调用远程文件。

这是一些来自演示文稿的代码

为使其运行,必须在 faces-config.xml 中进行如下注册:

<application>
    <resource-handler>org.omnifaces.resourcehandler.CDNResourceHandler</resource-handler>
</application>



<context-param>
    <param-name>org.omnifaces.CDN_RESOURCE_HANDLER_URLS</param-name>
    <param-value>
        js/script1.js=http://cdn.example.com/js/script1.js,
        somelib:js/script2.js=http://cdn.example.com/somelib/js/script2.js,
        otherlib:style.css=http://cdn.example.com/otherlib/style.css,
        images/logo.png=http://cdn.example.com/logo.png
    </param-value>
</context-param>

通过以上配置,以下资源:

<h:outputScript name="js/script1.js" />
<h:outputScript library="somelib" name="js/script2.js" />
<h:outputStylesheet library="otherlib" name="style.css" />
<h:graphicImage name="images/logo.png" />

谢谢,你的建议帮了我很多,解决了我的问题 :) 我修改了CDNResourceHandle.createResource(String resourceName, String libraryName)方法,允许使用库链接到我的服务器,而不是列出每个单独的文件,现在它完美地工作 :) - José Roberto Araújo Júnior
如果您对更改感兴趣,我已经更改了这部分代码:String resourceId = ((libraryName != null) ? libraryName + ":" : "") + resourceName; String path = cdnResources.get(resourceId); if(path == null){ if(libraryName != null){ resourceId = libraryName + ":%"; path = cdnResources.get(resourceId); if(path == null){ return resource; } path += "/"+resourceName; } else return resource; } final String requestPath = path; - José Roberto Araújo Júnior
这段代码可以完成任务:<context-param> <param-name>org.omnifaces.CDN_RESOURCE_HANDLER_URLS</param-name> <param-value> alibraryname:%=http://cdn.example.com </param-value> </context-param>,现在你可以这样做:<h:outputScript name="js/javascript.js" library="alibraryname" />。 - José Roberto Araújo Júnior
结果将是:<script type="text/javascript" src="http://cdn.example.com/js/javascript.js"></script> - José Roberto Araújo Júnior

1

我认为你不需要那个。它用于显示从类路径中获取的存档脚本。对于常规脚本,您可以直接键入相应的<script>标记。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接