1. 序章

Thymeleaf は、SpringBootアプリケーションに使用できるテンプレートエンジンです。 多くのものと同様に、 Spring Bootは、テンプレートを見つけることを期待するデフォルトの場所を提供します。

この短いチュートリアルでは、テンプレートの場所を変更する方法を見ていきます。 その後、複数の場所を設定する方法を学習します。

2. 設定

Thymeleafを使用するには、適切なSpringBootスターターpom.xmlに追加する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <versionId>2.2.2.RELEASE</versionId>
</dependency>

3. デフォルトの場所の変更

デフォルトでは、SpringBootはsrc/ main / resources/templatesでテンプレートを検索します。テンプレートをそこに配置してサブディレクトリに整理できます。問題はありません。

ここで、すべてのテンプレートがtemplates-2というディレクトリに存在するという要件があると想像してみましょう。

こんにちはと言うためのテンプレートを作成し、それを src / main / resources /templates-2に入れましょう。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Enums in Thymeleaf</title>
</head>
<body>
    <h2>Hello from 'templates/templates-2'</h2>
</body>
</html>

コントローラも必要です。

@GetMapping("/hello")
public String sayHello() {
    return "hello";
}

その基本的なセットアップが邪魔にならないように、 application.properties のプロパティをオーバーライドして、templates-2ディレクトリを使用するようにSpring Bootを構成しましょう。

spring.thymeleaf.prefix=classpath:/templates-2/

これで、 HelloController を呼び出すと、hello.htmlからの挨拶が表示されます。

4. 複数の場所を使用する

デフォルトの場所を変更する方法を学習したので、複数のテンプレートの場所を使用する方法を見てみましょう。

これを行うには、 ClassLoaderTemplateResolverbeanを作成しましょう。

@Bean
public ClassLoaderTemplateResolver secondaryTemplateResolver() {
    ClassLoaderTemplateResolver secondaryTemplateResolver = new ClassLoaderTemplateResolver();
    secondaryTemplateResolver.setPrefix("templates-2/");
    secondaryTemplateResolver.setSuffix(".html");
    secondaryTemplateResolver.setTemplateMode(TemplateMode.HTML);
    secondaryTemplateResolver.setCharacterEncoding("UTF-8");
    secondaryTemplateResolver.setOrder(1);
    secondaryTemplateResolver.setCheckExistence(true);
        
    return secondaryTemplateResolver;
}

カスタムbeanでは、使用しているセカンダリテンプレートディレクトリにプレフィックスを設定します。templates-2。CheckExistanceフラグもtrueに設定します。 ]。 これは、リゾルバーがチェーンで動作できるようにするための鍵です。

これを構成すると、アプリケーションはデフォルトの main / resources /templatesディレクトリとmain/ resources /templates-2のテンプレートを使用できます。

5. エラー

Thymeleafを使用しているときに、次のエラーが表示される場合があります。

Error resolving template [hello], template might not exist or might not be accessible
  by any of the configured Template Resolvers

このメッセージは、Thymeleafが何らかの理由でテンプレートを見つけられない場合に表示されます。 これの考えられる理由のいくつかとそれらを修正する方法を見てみましょう。

5.1. コントローラのタイプミス

単純なタイプミスが原因で、このエラーがよく見られます。 最初に確認することは、ファイル名から拡張子を差し引いたものと、コントローラーで要求しているテンプレートが完全に一致していることです。 サブディレクトリを使用している場合は、それらも正しいことを確認する必要があります。

さらに、問題は特定のオペレーティングシステムで問題になる可能性があります。 Windowsでは大文字と小文字は区別されませんが、他のオペレーティングシステムでは大文字と小文字が区別されます。 たとえば、ローカルのWindowsマシンですべてが正常に機能している場合は、これを調べる必要がありますが、展開した後は調べないでください。

5.2. コントローラにファイル拡張子を含める

通常、ファイルには拡張子が付いているため、コントローラーでテンプレートパスを返すときにそれらを含めるのが自然な場合があります。 Thymeleafは自動的にサフィックスを追加するため、サフィックスを指定しないようにする必要があります

5.3. デフォルトの場所を使用しない

テンプレートをsrc/ main / resources / templates 以外の場所に配置した場合にも、このエラーが表示されます。 別の場所を使用する場合は、 spring.thymeleaf.prefix プロパティを設定するか、独自のClassLoaderTemplateResolverBeanを作成して複数の場所を処理する必要があります。

6. 結論

このクイックチュートリアルでは、Thymeleafテンプレートの場所について学びました。 最初に、プロパティを設定してデフォルトの場所を変更する方法を確認しました。 次に、複数の場所を使用する独自の ClassLoaderTemplateResolver を作成することにより、その上に構築しました。

最後に、Thymeleafがテンプレートを見つけられなかったときに表示されるエラーとその解決方法について説明しました。

いつものように、サンプルコードはGitHubにあります。