かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

ThymeleafのHello world

HTMLとかXHTMLとかHTML5とかのテンプレートエンジンのThymeleafいい感じっぽいのでHello worldしてみます。
NetBeansMavenJavaアプリケーションのプロジェクトを作成して依存性の追加でthymeleafで検索するとorg.thymeleafが出てくるので、それを追加します。pom.xmlには以下のような記述が追加されます。

<dependency>
  <groupId>org.thymeleaf</groupId>
  <artifactId>thymeleaf</artifactId>
  <version>2.0.15</version>
</dependency>

Thymeleafは、色んな場所からテンプレートを取得するためのTemplateResolverというものが定義されています。一番シンプルだと思うのはClassLoaderTemplateResolverだと思います。こいつにテンプレートエンジンのモード(HTML5だとかXHTMLだとか)をセットしたりテンプレートファイルのサフィックスを設定したりしてTemplateEngineを作ります。

テンプレートエンジンを作ったらContextにテンプレート内部で使用する変数とかを設定してprocessを呼び出せば完成です。

package okazuki.mavenproject6;

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

public class App {

    public static void main(String[] args) {
        // クラスローダーからテンプレート探す
        ClassLoaderTemplateResolver r = new ClassLoaderTemplateResolver();
        r.setTemplateMode("HTML5");
        r.setSuffix(".html");
        
        // テンプレートエンジンを作ってTemplateResolverを設定する
        TemplateEngine templateEngine = new TemplateEngine();
        templateEngine.setTemplateResolver(r);
        
        // Contextにテンプレート内部で使う変数を設定して実行!
        Context ctx = new Context();
        ctx.setVariable("message", "こんにちは世界");
        String result = templateEngine.process("index", ctx);
        
        // 結果を表示
        System.out.println(result);
    }
}

テンプレートは、デフォルトパッケージにindex.htmlというファイルを作って以下のように書きました。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title></title>
    </head>
    <body>
        <div th:text="${message}">TODO write content</div>
    </body>
</html>

th:textがThymeleaf固有の設定になります。ここらへんは、公式のドキュメントを参照のこと。
http://www.thymeleaf.org/documentation.html
Using Thymeleafの"4 STANDARD EXPRESSION SYNTAX"あたりを読むと捗ります。


実行すると以下のように、こんにちは世界が埋め込まれたHTMLが出力されます。

<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8" />
        <title></title>
    </head>
    <body>
        <div>こんにちは世界</div>
    </body>
</html>

うん、いいね。