かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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>

うん、いいね。