4

h:outputScriptタグを使用して、動的リソース(生成されたJavaScript、技術的にはJSONでの構成)を動的リソースとしてロードしたいと思います。私は、独自のサーブレットを作成し、通常のタグスクリプトを介してそれをロードすることでそれを実行できることを認識しています。これは、リソースをロードする「JSF-way」を好むためです。

それは可能ですか、そしてどのように?

4

1 に答える 1

6

はい、可能です。これは、特定のリソースライブラリ名を使用してカスタムインターセプトを設定し、特定のライブラリのリソースが要求されたときにResourceHandlerカスタムを返すことで実現できます。Resource

例えば

<h:outputScript library="dynamicJs" name="some.js" />

public class DynamicJsResourceHandler extends ResourceHandlerWrapper {

    public DynamicJsResourceHandler(ResourceHandler wrapped) {
        super(wrapped);
    }

    @Override
    public Resource createResource(String resourceName, String libraryName) {
        if ("dynamicJs".equals(libraryName)) {
            return new DynamicJsResource(resourceName);
        } else {
            return super.createResource(resourceName, libraryName);
        }
    }

}

public class DynamicJsResource extends Resource {

    private String resourceName;

    public DynamicJsResource(String resourceName) {
        this.resourceName;
    }

    @Override
    public String getRequestPath() {
        // TODO: return "/context/javax.faces.resource/" + resourceName + ".xhtml?ln=dynamicJs";
    }

    @Override
    public URL getURL() {
        // TODO: return new URL("http://localhost:8080" + getRequestPath());
    }

    @Override
    public Map<String, String> getResponseHeaders() {
        // TODO: return desired HTTP response headers. 
    }

    @Override
    public InputStream getInputStream() throws IOException {
        // TODO: return InputStream by resourceName.
    }

    @Override
    public boolean userAgentNeedsUpdate(FacesContext context) {
        // TODO: return true when resource has been modified in server side.
    }

}

実行するには、faces-config.xmlに次のように登録します。

<application>
    <resource-handler>com.example.DynamicJsResourceHandler</resource-handler>
</application>

JSFユーティリティライブラリOmniFacesを使用している場合は、ボイラープレートコードを保存して、代わりにそのコードから拡張することもできるため、org.omnifaces.resourcehandler.DynamicResource実装するだけで済みますgetInputStream()。OmniFacesを使用しない場合は、いつでもそのソースコードをガイダンスとして使用できます。

于 2013-02-06T11:29:03.030 に答える