1. 概要

この記事では、Spring BootアプリケーションでHTMLコンテンツを生成するためのMustacheテンプレートの使用に焦点を当てます。

ダイナミックコンテンツを作成するためのロジックレステンプレートエンジンであり、そのシンプルさから人気があります。

基本を知りたい場合は、口ひげの紹介の記事を確認してください。

2. Mavenの依存関係

MustacheをSpringBootと一緒に使用できるようにするには、専用のSpringBootスターターpom.xml:に追加する必要があります。

<dependency>			
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mustache</artifactId>
</dependency>
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
</dependency>

さらに、spring-boot-starter-web依存関係が必要です。

3. テンプレートの作成

例を示し、Springを使用して簡単なMVCアプリケーションを作成しましょう-Webページ上の記事を提供するブート。

記事の内容の最初のテンプレートを書いてみましょう。

<div class="starter-template">
    {{#articles}}
    <h1>{{title}}</h1>
    <h3>{{publishDate}}</h3>
    <h3>{{author}}</h3>
    <p>{{body}}</p>
    {{/articles}}
</div>

このHTMLファイル( article.htmlなど)を保存し、次に index.html:で参照します。

<div class="container">
    {{>layout/article}}
</div>

ここで、レイアウトはサブディレクトリであり、記事はテンプレートファイルのファイル名です。

デフォルトの口ひげテンプレートファイル拡張子が。mustacheになっていることに注意してください。 この構成を次のプロパティでオーバーライドできます。

spring.mustache.suffix:.html

4. コントローラ

それでは、記事を提供するためのコントローラーを作成しましょう。

@GetMapping("/article")
public ModelAndView displayArticle(Map<String, Object> model) {

    List<Article> articles = IntStream.range(0, 10)
      .mapToObj(i -> generateArticle("Article Title " + i))
      .collect(Collectors.toList());

    model.put("articles", articles);

    return new ModelAndView("index", model);
}

コントローラは、ページに表示される記事のリストを返します。 記事テンプレートでは、タグ articles #で始まり/で終わるタグがリストを処理します。

これにより、渡されたモデルが繰り返され、HTMLテーブルの場合と同様に、各要素が個別にレンダリングされます。

 {{#articles}}...{{/articles}}

generateArticle()メソッドは、いくつかのランダムデータを使用してArticleインスタンスを作成します。

コントローラによって返されるArticleModelのキーは、 articletemplateタグのキーと同じである必要があることに注意してください。

それでは、アプリケーションをテストしてみましょう。

@Test
public void givenIndexPage_whenContainsArticle_thenTrue() {

    ResponseEntity<String> entity 
      = this.restTemplate.getForEntity("/article", String.class);
 
    assertTrue(entity.getStatusCode()
      .equals(HttpStatus.OK));
    assertTrue(entity.getBody()
      .contains("Article Title 0"));
}

次のコマンドを使用してアプリケーションをデプロイすることで、アプリケーションをテストすることもできます。

mvn spring-boot:run

デプロイしたら、 localhost:8080 / article、を押すと、記事が一覧表示されます。

5. デフォルト値の処理

口ひげの環境では、プレースホルダーに値を提供しない場合、 MustacheException メッセージとともにスローされます 「名前が「変数名…」のメソッドまたはフィールドはありません。

このようなエラーを回避するには、すべてのプレースホルダーにデフォルトのグローバル値を指定することをお勧めします。

@Bean
public Mustache.Compiler mustacheCompiler(
  Mustache.TemplateLoader templateLoader, 
  Environment environment) {

    MustacheEnvironmentCollector collector
      = new MustacheEnvironmentCollector();
    collector.setEnvironment(environment);

    return Mustache.compiler()
      .defaultValue("Some Default Value")
      .withLoader(templateLoader)
      .withCollector(collector);
}

6. SpringMVCを使用した口ひげ

それでは、Spring Bootを使用しないことにした場合に、SpringMVCと統合する方法について説明しましょう。 まず、依存関係を追加しましょう。

<dependency>
    <groupId>com.github.sps.mustache</groupId>
    <artifactId>mustache-spring-view</artifactId>
    <version>1.4</version>
</dependency>

最新のものはここで見つけることができます。

次に、SpringのInternalResourceViewResolverの代わりにMustacheViewResolverを構成する必要があります。

@Bean
public ViewResolver getViewResolver(ResourceLoader resourceLoader) {
    MustacheViewResolver mustacheViewResolver
      = new MustacheViewResolver();
    mustacheViewResolver.setPrefix("/WEB-INF/views/");
    mustacheViewResolver.setSuffix("..mustache");
    mustacheViewResolver.setCache(false);
    MustacheTemplateLoader mustacheTemplateLoader 
      = new MustacheTemplateLoader();
    mustacheTemplateLoader.setResourceLoader(resourceLoader);
    mustacheViewResolver.setTemplateLoader(mustacheTemplateLoader);
    return mustacheViewResolver;
}

テンプレートが保存されるサフィックス、テンプレートの拡張プレフィックス、およびテンプレートの読み込みを担当するtemplateLoaderを構成する必要があります。 。

7. 結論

このクイックチュートリアルでは、Spring BootでMustacheテンプレートを使用し、UIで要素のコレクションをレンダリングし、エラーを回避するために変数にデフォルト値を提供する方法について説明しました。

最後に、 MustacheViewResolver。を使用して、Springと統合する方法について説明しました。

いつものように、ソースコードはGitHubから入手できます。