thymeleaf

2013-12-31T00:00:00+00:00 Java

Javaなテンプレートエンジンらしい。ドキュメント読みつつちょっとやってみた。とりあえずは暫定的なメモ

※日本語情報的にはhttp://tech.nulab.co.jp/2012/02/thymeleaf/が良いかと

src/main/java/Main.java

import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;

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

public class Main {

    public static void main(String[] args) throws Exception {
        TemplateResolver resolver = new ClassLoaderTemplateResolver();
        resolver.setSuffix(".html");

        TemplateEngine engine = new TemplateEngine();
        engine.setTemplateResolver(resolver);

        Context context = new Context();
        context.setVariable("welcome", "<script>alert("hoge");</script>");
        context.setVariable("now", new Date());
        context.setVariable("cal", Calendar.getInstance());
        context.setVariable("sample", new Sample("foobar"));
        context.setVariable("samples", Arrays.asList(new Sample("a"), new Sample("b")));
        context.setVariable("ok", true);

        System.out.println(engine.process("test", context));
    }
}

Sampleクラスに関してはただのnameフィールドを持ちゲッターメソッドなりがあるクラス

src/main/resources/test.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<!--
変数を評価するのであればth:text等を使う事で可能。utextを使うとエスケープされない
変数でもコンテキスト変数とメッセージ変数があり、前者では${}で評価される
後者なメッセージ変数はレンダリングされるテンプレート?.propertiesで指定されるデータを
#{}形式で参照する事が出来る

又、th:textのような形式はHTML5 Friendlyなdata-[prefix]-[name]な形式でも
指定することが可能。そこは以下のループなところを参照
-->
<p th:utext="|ok: ${welcome}|"></p>
<p th:text="#{welcome}"></p>

<!--
*{}な変数評価を使えばゲッターメソッドで値を取ってきたり出来る。${sample.name}のように
でも出来るけど、*{}を使うことでコンテキストスタックをth:objectで指定されたのを使用する事
が出来る?
-->
<div th:object="${sample}">
    <p th:text="*{name}" />
</div>

<!--
http://www.thymeleaf.org/doc/html/Using-Thymeleaf.html#expression-utility-objects

を参照

ちなみに#datesユーティリティの実体はhttp://www.thymeleaf.org/apidocs/thymeleaf/2.0.2/org/thymeleaf/expression/Dates.html
-->
<p th:text="${#dates.year(now)}"></p>
<p th:text="${#calendars.format(cal, "yyyy/MM/dd")}"/>

<!--
th:ifで評価することも可能。以下のように特定の属性をbooleanでサポートするのもある

http://www.thymeleaf.org/doc/html/Using-Thymeleaf.html#fixed-value-boolean-attributes

を参照
-->
<div th:if="${ok} == true">OK</div>
<input type="checkbox" th:checked="${ok}" />

<!--
ループを使いたいならth:eachで出来る。又、そのループ内状態変数を「ループ内変数+Stat」
で利用する事が出来る
-->
<ul>
<li th:each="sample : ${samples}">
    <span th:attr="id=|sample_${sampleStat.count}|" data-th-text="${sample.name}" />
</li>
</ul>

<!--
別のテンプレートの部分的なのを評価する事も出来る
th:withを使えば
-->
<div th:include="footer :: footer" th:with="message=${welcome}"></div>
</body>
</html>

んまぁざっくりとしてますけど、他にもth:switch/th:caseを使ったswitch/case文とかもサポートされていたりとかで非常に使いやすいのではという印象

とりあえず今後調査予定として

  • WebContext及びサーブレット環境下での動作 (上記だと@{}なリンク方式を使うとエラーを起こすため)
  • Spring Frameworkとの連携とか
  • thymeleaf-testingパッケージに関して

を色々調査する予定

thymeleaf+spring mvc Spring WebMVCをやってみる (16) - Converter -