ThymeleafはJava向けのXML/HTMLテンプレートエンジンであり、構文規則に従ったテンプレート作成の提供を主な目的としている。Thymeleaf 2.0には、Thymeleafの拡張を作成する開発者を対象とした機能強化も含め、数多くの新機能が用意されている。ここではそれらの新機能について簡単に見ていくことにする。
パフォーマンス
Thymeleafの内部アーキテクチャは再設計されており、テンプレート実行エンジンは完全に書き換えられている。これによりパフォーマンス面が大幅に改善されている。あるベンチマークの実行時間を見てみると、以前のバージョンでは4.19ミリ秒だったのに対し1.26ミリ秒を記録している。
th:switch/th:case
th:switchに指定する式は、内側にあるth:case属性の式の結果に対して評価や比較が行われる。デフォルトのオプションには「*」を指定する。同様の処理を以前のバージョンで行うには各p要素にth:ifを指定する必要があった。
<div th:switch="${user.role}"> <p th:case="'admin'">Administrator</p> <p th:case="*">User</p> </div>
th:remove="all-but-first"
通常、テーブルを使用してテンプレートを作成した場合、余分なプレースホルダ行を削除する必要がある。新しいth:remove="all-but-first"を使用することで、この処理を簡単に行うことができる。同様の処理を以前のバージョンで行うには、削除対象のすべてのテーブル行にth:remove="all"を指定する必要があった。
<table th:remove="all-but-first"> <tr th:each="user : ${users}"> <td th:text="${user.name}">John</td> </tr> <tr> <td>Joe</td> </tr> <tr> <td>Mike</td> </tr> </table>
行番号情報
これまで最も要望の多かった機能の一つは、Thymeleafでテンプレートの解析エラーが発生した際に行番号情報を出力する機能だが、新しいテンプレートエンジンではこの機能が使用できるようになっている。
DOM Selector
Thymeleaf 1.1ではXPath式を指定することでテンプレートフラグメントの組み込みが可能であったが、Thymeleaf 2.0ではテンプレートエンジンの書き換えに伴い、このXPathのサポートは「DOM Selector」と呼ばれるものに置き換えられている。DOM Selectorを使用すると、DOMの特定部分の選択が可能になり、XPath構文のサブセットも使用可能になる。
- /xは、カレントノード直下にあるxという子ノードを表す。
- //xは、カレントノード配下にあるxという子ノードを表す(深さは問わない)。
- x[@z='v']は、属性zの値が「v」である要素xを表す。
- x[@z1='v1' and @z2='v2']は、属性z1の値が「v1」および属性z2の値が「v2」である要素xを表す。
- x[i]は、兄弟ノードでi番目にある要素xを表す。
- x[@z='v'][i]は、属性zの値が「v」、兄弟ノードでi番目にある要素xを表す。
テンプレートフラグメント
新しいテンプレートエンジンでは、完全なXMLドキュメントの代わりに断片的なテンプレートを処理できる。例えば、DOCTYPEやドキュメントルートは必須ではないが、その場合、このテンプレートは単なる<div>ブロックになる。
キャッシュインフラストラクチャの汎用化
Thymeleaf 2.0では、キャッシュインフラストラクチャがアップデートされており、使用するキャッシュとその動作を開発者が制御できるようになっている。新しいICacheManagerインタフェースには、ユーザ独自のICacheの実装を指定できるように拡張ポイントが定義されている。ICacheManagerのデフォルト実装としてはStandardCacheManagerが組み込まれている。
新しいXHTML DTD
新しい属性であるth:switchとth:caseを使用するには、ThymeleafのDTDを変更する必要がある。以下がその新しいDTDだ。
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-3.dtd"> <!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-transitional-thymeleaf-3.dtd"> <!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-frameset-thymeleaf-3.dtd"> <!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring3-3.dtd"> <!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-transitional-thymeleaf-spring3-3.dtd"> <!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-frameset-thymeleaf-spring3-3.dtd">
Java DOM APIからの置き換え
Thymeleaf 2.0では、アーキテクチャからJava DOM APIが削除され、固有のDOM表現に置き換えられている。新しいDOMはThymeleaf専用にカスタマイズされており、前の規格よりもシンプルになっている。また、テンプレート処理をより少ないリソースで高速化できるように最適化も行われている。
IProcessor
Thymeleaf 1.1では、プロセッサは属性プロセッサおよびタグプロセッサという2つのグループに分類されていたが、Thymeleaf 2.0では、新しいDOMによってこのスキーマが標準化されたため、属性プロセッサおよびタグ(要素)プロセッサは、新しい汎用的なIProcessorインタフェースを実装している。これにより、要素、テキストノード、コメントなど、あらゆるDOMノードにプロセッサを適用できるようになった。
テンプレートモードの汎用化
Thymeleaf 2.0ではテンプレートモードが汎用化されており、Thymeleafの拡張を作成する場合、6つの標準テンプレートモード(XML、VALIDXML、XHTML、VALIDXHTML、HTML5およびLEGACYHTML5)に加えて独自のテンプレートモードも作成できる。テンプレートモードは、templateResolverの設定時に列挙型のTemplateMode(非推奨)ではなくStringとして指定する必要がある。