Edited at

Java のテンプレートエンジン Thymeleaf で Hello world


概要


  • Java のテンプレートエンジン Thymeleaf で基本的な出力方法を使用する


今回の環境


  • macOS Mojave

  • OpenJDK 11.0.2

  • Thymeleaf 3.0.11

  • Gradle 5.6.2


ソースコード


ソースコード一覧


  • build.gradle : Gradle 用のビルド設定ファイル

  • MyApp.java : メインとなるクラス

  • index.html : テンプレート HTML

├── build.gradle

└── src
└── main
├── java
│   └── com
│   └── example
│   └── MyApp.java
└── resources
└── templates
└── index.html


build.gradle

Gradle 用のビルド設定ファイル。

Thymeleaf 3.0.11 を指定。

gradle コマンドでプログラムを実行できる run タスクを使用するため、application プラグインを設定している。

plugins {

id 'java'
id 'application'
}

group 'com.example'
version '1.0.0'

sourceCompatibility = 11

repositories {
mavenCentral()
}

dependencies {
// https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf
implementation 'org.thymeleaf:thymeleaf:3.0.11.RELEASE'
}

application {
mainClassName = 'com.example.MyApp'
}


MyApp.java

メインとなるクラス。

Thymeleaf を利用して、オブジェクトの値を HTML テンプレートに埋め込んで出力する。

package com.example;

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

import java.util.ArrayList;
import java.util.HashMap;

public class MyApp {

public static void main(String[] args) {

// ITemplateResolver インターフェースの一実装
// テンプレートファイルを読み込むためのリゾルバクラス
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
resolver.setPrefix("templates/");
resolver.setSuffix(".html");
resolver.setTemplateMode("HTML5");

// テンプレート処理のメインクラスにリゾルバをセットする
TemplateEngine engine = new TemplateEngine();
engine.setTemplateResolver(resolver);

// IContext インターフェースの一実装
// ロケールや、テンプレートに埋め込むためのコンテキスト変数を持つ
Context context = new Context();

// シンプルなコンテキスト変数をセットする
context.setVariable("myTitle", "Hello, world.");

// コンテキスト変数として JavaBean オブジェクトをセットする
MyData myData = new MyData("Hello, world.");
context.setVariable("myData", myData);

// コンテキスト変数として Map オブジェクトをセットする
HashMap<String, String> myMap = new HashMap<String, String>();
myMap.put("message", "Hello, world");
context.setVariable("myMap", myMap);

// コンテキスト変数として List オブジェクトをセットする
ArrayList<String> myList = new ArrayList<String>();
myList.add("Hello, world.");
context.setVariable("myList", myList);

// テンプレート処理を実行
String result = engine.process("index", context);

System.out.println(result);
}

// JavaBean クラス
public static class MyData {

private final String msg;

public MyData(String message) {
this.msg = message;
}

public String getMessage() {
return msg;
}
}
}


index.html

テンプレート HTML ファイル。

基本的なテンプレート機能を記述。

<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title th:text="${myTitle}"></title>
</head>
<body>

<div id="variable">
<p th:text="${myData.message}"></p>
</div>

<div id="mydata" th:object="${myData}">
<p th:text="*{message}"></p>
</div>

<div id="mymap" th:object="${myMap}">
<p th:text="*{message}"></p>
</div>

<div id="mylist" th:each="item : ${myList}">
<p th:text="*{item}"></p>
</div>

<div id="myif" th:if="${#strings.equals('Hello, world.', myData.message)}">
'Hello, world' == [[${myData.message}]]
</div>

<div id="myunless" th:unless="${#strings.equals('Goodbye, world.', myData.message)}">
'Goodbye, world.' != '[[${myData.message}]]'
</div>

<div id="myfalse" th:if="false">
false
</div>

</body>
</html>


実行方法

run タスクを実行する。

$ gradle run


実行結果

<!DOCTYPE html>

<html>
<head>
<meta charset="UTF-8">
<title>Hello, world.</title>
</head>
<body>

<div id="variable">
<p>Hello, world.</p>
</div>

<div id="mydata">
<p>Hello, world.</p>
</div>

<div id="mymap">
<p>Hello, world</p>
</div>

<div id="mylist">
<p>Hello, world.</p>
</div>

<div id="myif">
'Hello, world' == Hello, world.
</div>

<div id="myunless">
'Goodbye, world.' != 'Hello, world.'
</div>

</body>
</html>


th: 属性の説明


th:text


  • th:text 属性に指定した値は要素の中のテキストを置き換える

  • th:text には OGNL (Object-Graph Navigation Language) で値を指定できる

Tutorial: Using Thymeleaf (ja)


この\${today}式は単純で「todayという名前の変数を取得する」という意味ですが、もっと複雑なこともできます(例えば\${user.name}は「user変数を取得してそのgetName()メソッドを呼び出す」という意味になります)。



th:object


  • th:object 属性にはオブジェクトを指定する

  • *{member_name} にてオブジェクトのメンバ変数等を指定する


th:each


  • 配列やリストのループ処理に使用する

Tutorial: Using Thymeleaf (ja)


Thymeleafの繰り返し処理で使用可能なのはjava.util.Listだけではありません。実際にth:each属性では、ほぼすべてのオブジェクトが繰り返し可能として扱われます:



th:if と th:unless


  • 条件によって表示・非表示をする際に使用する


参考資料