thymeleaf
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パッケージに関して
を色々調査する予定