LoginSignup
0
0

More than 3 years have passed since last update.

JSFの<h:outputScript><h:outputStylesheet>で出力されたURLに任意のパラメータをつける

Posted at

はじめに

JSFのFaceletsで読み込んでいるJavascriptやCSSについて、最新のものを取得するためにビルド時に動的にパラメータを付ける方法です。
修正前)vendor.js
修正後)vendor.js?v=12345678

これでスーパーリロードともお別れ。

手順

ResourceHandlerWrapperクラスを継承したクラスを作成します。

CustomResourceHandler.java
package com.sample;

import java.util.Arrays;
import javax.faces.application.Resource;
import javax.faces.application.ResourceHandler;
import javax.faces.application.ResourceHandlerWrapper;
import javax.faces.application.ResourceWrapper;

public class CustomResourceHandler extends ResourceHandlerWrapper {

    private final ResourceHandler wrapped;

    public CustomResourceHandler(ResourceHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public Resource createResource(String resourceName) {
        return createResource(resourceName, null, null);
    }

    @Override
    public Resource createResource(String resourceName, String libraryName) {
        return createResource(resourceName, libraryName, null);
    }

    @Override
    public Resource createResource(String resourceName, String libraryName, String contentType) {
        final Resource resource = super.createResource(resourceName, libraryName, contentType);

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

        if (!Arrays.asList("js", "css").contains(libraryName)) {
            // JavascriptとCSSの対象とする
            return resource;
        }

        return new ResourceWrapper() {

            @Override
            public String getRequestPath() {
                return super.getRequestPath() + "&(任意のクエリパラメータ)";
            }

            @Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2).
            public String getResourceName() {
                return resource.getResourceName();
            }

            @Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2).
            public String getLibraryName() {
                return resource.getLibraryName();
            }

            @Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2).
            public String getContentType() {
                return resource.getContentType();
            }

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

    @Override
    public ResourceHandler getWrapped() {
        return wrapped;
    }

}

faces-config.xmlに上記で作成したハンドラを登録します。

WEB-INF/faces-config.xml
<application>
  <resource-handler>com.sample.CustomResourceHandler</resource-handler>
</application>

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0