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

できません

Web アプリ内のローカル リソース フォルダーからのみ<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 に答える