Thymeleaf:将webjar CSS文件的内容插入样式标签

时间:2018-09-12 14:26:04

标签: java spring spring-boot thymeleaf

在某些情况下,内联CSS文件比通过URL引用更为容易(例如,在渲染包含HTML的网页时)。该CSS文件可能来自webjar。

拨打电话需要做些什么:

<style th:insert="/webjars/bootstrap/bootstrap.css"></style>

这是在没有任何网络服务器的春季启动环境中运行的。

1 个答案:

答案 0 :(得分:0)

因此,我使它可以与特殊的TemplateResolver一起使用。它的逻辑类似于Spring的WebJarsResourceResolver,并使用WebJarAssetLocator

public class WebJarTemplateResolver extends ClassLoaderTemplateResolver {

    private final static String WEBJARS_PREFIX = "/webjars/";

    private final static int WEBJARS_PREFIX_LENGTH = WEBJARS_PREFIX.length();

    private final WebJarAssetLocator webJarAssetLocator = new WebJarAssetLocator();

    @Override
    protected ITemplateResource computeTemplateResource(IEngineConfiguration configuration, String ownerTemplate, String template, String resourceName, String characterEncoding, Map<String, Object> templateResolutionAttributes) {

        resourceName = findWebJarResourcePath(template);
        if (resourceName == null) {
            return null;
        }

        return super.computeTemplateResource(configuration, ownerTemplate, template, resourceName, characterEncoding, templateResolutionAttributes);
    }

    @Nullable
    protected String findWebJarResourcePath(String templateName) {
        if (!templateName.startsWith(WEBJARS_PREFIX)) {
            return null;
        }

        int startOffset = WEBJARS_PREFIX_LENGTH;
        int endOffset = templateName.indexOf('/', startOffset);

        if (endOffset == -1) {
            return null;
        }

        String webjar = templateName.substring(startOffset, endOffset);
        String partialPath = templateName.substring(endOffset + 1);
        return this.webJarAssetLocator.getFullPathExact(webjar, partialPath);
    }
}

这是通过以下配置集成到应用程序中的:

@Configuration
public class ThymeleafConfiguration {

    private SpringTemplateEngine templateEngine;

    public ThymeleafConfiguration(SpringTemplateEngine templateEngine) {
        this.templateEngine = templateEngine;
    }

    @PostConstruct
    public void enableWebjarTemplates() {
        templateEngine.addTemplateResolver(new WebJarTemplateResolver());
    }
}