Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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>

参考

mr-hisa-child
自称フルスタックエンジニアです。デザイン(CSS)は苦手ですが、フロントエンドからサーバサイドまで面倒見れます。 Java / SpringBoot / JavaEE / Quarkus / AWS / vuejs / Nuxtjs / AWSソリューションアーキテクトアソシエイト / VSCode / BootStrap / Vuetify / TypeScript
frevoworks
AWSを用いたクラウドアプリケーションの開発・保守を行っています。
https://www.frevo-works.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away