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>

我能做些什么?

解决方案: 丹尼尔向我指出了一个很好的解决方案!

我已经下载了 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>

请注意,这会将somelib2somelib2:%=http://cdn.example.com/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 />任何使用资源的东西;

4

2 回答 2

8

你不能

仅仅因为只能<h:outputScript />读取您的网络应用程序内的本地资源文件夹

你可以做的是使用 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" />
于 2012-12-02T06:55:35.923 回答
1

我想你不需要那个。它用于显示从类路径中的档案中获取的脚本。对于常规脚本,您只需键入相应的<script>标记即可。

于 2012-12-02T06:48:47.900 回答