10 分で Thymeleaf 3 に移行
Thymeleaf2 から Thymeleaf3 に移行する予定のユーザーの場合。まず、良いニュースとして、現在の Thymeleaf テンプレートは Thymeleaf3 と完全に互換性があります。したがって、移行する場合は、構成をいくつか変更するだけで済みます。
Thymeleaf 3.0 ベータ版は安定しており、バージョン 2.1 の機能を完全にカバーしているため、アップグレードすることをお勧めします。新しいバージョンのパフォーマンスが向上し、多くの新機能が追加されたためです。
唯一の問題は、Thymeleaf の方言のすべてが Thymeleaf 3 に移行されていないことです。したがって、移行前にこの領域の互換性チェックを行う必要があります。
以下では、Thymeleaf 3 のいくつかの変更点と機能を紹介します。
唯一の変更点は、テンプレートの th:inline="text" 属性を削除することが推奨されることです。 HTML または XML テンプレートでは、テキスト内のインライン式の機能をサポートするためにこの属性は必要なくなりました。もちろん、この属性を削除することのみが推奨されます。削除しなくても、元のテンプレートは引き続き機能します。これを削除する利点は、実行パフォーマンスが向上することです。
詳細については、以下の インライン メカニズム セクションを参照してください。
thymeleaf-spring4 統合構成ファイルの例を見てください。
最初に Maven の依存関係を更新する必要があります
<dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>3.0.0.BETA02</version></dependency><dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring4</artifactId> <version>3.0.0.BETA02</version></dependency>
次にスプリング構成
@Configuration@EnableWebMvc@ComponentScan("com.thymeleafexamples") public class ThymeleafConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware { private ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Bean public ViewResolver viewResolver() { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); resolver.setCharacterEncoding("UTF-8"); return resolver; } private TemplateEngine templateEngine() { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setTemplateResolver(templateResolver()); return engine; } private ITemplateResolver templateResolver() { SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); resolver.setApplicationContext(applicationContext); resolver.setPrefix("/WEB-INF/templates/"); resolver.setTemplateMode(TemplateMode.HTML); return resolver; }}
Thymeleaf 2 と比較した最初の違いは、現在推奨テンプレートである解析です。クラスは SpringResourceTemplateResolver です。このクラスは Spring の ApplicationContext コンテキストに依存します。したがって、構成クラスは ApplicationContextAware インターフェイスを実装する必要があります。
2 番目の違いは次のとおりです。 TemplateMode.HTML 列挙定数が提供されます。テンプレート型のメソッド パラメーターは文字列型ではなくなりました。
他の方言を追加する必要がある場合は、engine.addDialect(...) メソッドを使用できます。もちろん、Thymeleaf 3 がそれをサポートしているかどうかを最初に確認する必要があります。
公式 Web サイトからいくつかの統合構成サンプルをダウンロードできます。
Thymeleaf 3 + Spring 4 + Java 構成例
Thymeleaf 3 + Spring 4 + XML 構成例
Thymeleaf 3 + Servlet 3 の例
Thymeleaf 3.0 は XML 構造に基づいていません。新しい解析エンジンの導入により、テンプレートのコンテンツ形式は XML 仕様に厳密に準拠する必要がなくなりました。つまり、ラベルのクロージャーや引用符で囲んだ属性などは必要なくなりました。もちろん、読みやすさを考慮して、XML 標準に従ってテンプレートを作成することをお勧めします。
次のコードは Thymeleaf 3.0 で有効です:
<p><p th:text=${mytext} ng-app>Whatever
Thymeleaf 3 では以前のバージョンのテンプレート タイプが削除され、新しいテンプレートはタイプは:
HTML
XML
TEXT
JAVASCRIPT
CSS
RAW
2 つのマークアップ テンプレート (HTML および XML) )、3 つのテキスト テンプレート (TEXT、JAVASCRIPT、CSS) と 1 つの no-op テンプレート (RAW)。
HTML テンプレートは、HTML5、HTML4、XHTML を含むすべてのタイプの HTML タグをサポートしています。また、マークが完全に閉じているかどうかはチェックしません。このとき、マーカーの範囲は可能な限り最大化されます。
テキスト テンプレートにより、Thymeleaf は CSS、JavaScript、およびテキスト ファイルの出力をサポートできます。この機能は、CSS または Javascript ファイルでサーバー側変数を使用する場合、または電子メールなどのプレーン テキスト コンテンツを出力する場合に便利ですか?
テキスト モードで Thymeleaf 機能を使用するには、次のような新しい構文を使用する必要があります。
[# th:each="item : ${items}"] - [# th:utext="${item}" /][/]
今は必要ありません 追加のタグデータをテキストで直接出力します:
この製品は [[${product.name}]] と呼ばれ、優れています!
詳細については、次を参照してください: インライン化された出力式 インライン化について メカニズムの説明: インライン化メカニズムのリファクタリング
Thymeleaf 3.0 では、新しいフラグメント式が導入されています。形状は ~{commons::footer} です。
この機能は非常に便利です (本当に便利かどうかは別として、私を悩ませていたユニバーサル ヘッダーとフッターの定義の問題を直接解決します)。構文を理解するには、例を見てください:
<head th:replace="base :: common_header(~{::title},~{::link})"> <title>Awesome - Main</title> <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}"> <link rel="stylesheet" th:href="@{/themes/smoothness/jquery-ui.css}"></head>
ここでは、
head th:fragment="common_header(title,links)"> <title th:replace="${title}">The awesome application</title> <!-- Common styles and scripts --> <link rel="stylesheet" type="text/css" media="all" th:href="@{/css/awesomeapp.css}"> <link rel="shortcut icon" th:href="@{/images/favicon.ico}"> <script type="text/javascript" th:src="@{/sh/scripts/codebase.js}"></script> <!--/* Per-page placeholder for additional links */--> <th:block th:replace="${links}" /></head>
レンダリング結果は次のとおりです:
<head> <title>Awesome - Main</title> <!-- Common styles and scripts --> <link rel="stylesheet" type="text/css" media="all" href="/awe/css/awesomeapp.css"> <link rel="shortcut icon" href="/awe/images/favicon.ico"> <script type="text/javascript" src="/awe/sh/scripts/codebase.js"></script> <link rel="stylesheet" href="/awe/css/bootstrap.min.css"> <link rel="stylesheet" href="/awe/themes/smoothness/jquery-ui.css"></head>
6. ノーオペレーション トークン (トークン)
Thymeleaf 3.0 のもう 1 つの新機能は、no-オペレーション (NO-OP ノーオペレーション) マーク、下線「_」は何もしないことを意味します。
例:
<span th:text="${user.name} ?: _">no user authenticated</span>
user.name が空の場合、タグ本体の内容が直接出力されます。ユーザーは認証されていません。この機能を使用すると、プロトタイプ テンプレートの値をデフォルト値として直接使用できます。
この機能の詳細については、次を参照してください。 NO-OP トークン
7 テンプレート ロジックの分離
Thymeleaf 3.0 では、テンプレート コンテンツと制御ロジックを完全に分離できます。 HTML モードと XML モードの結合。
たとえば、バージョン 3.0 では、「クリーンな」home.html テンプレートのコンテンツは次のとおりです:
<!DOCTYPE html><html> <body> <table id="usersTable"> <tr> <td class="username">Jeremy Grapefruit</td> <td class="usertype">Normal User</td> </tr> <tr> <td class="username">Alice Watermelon</td> <td class="usertype">Administrator</td> </tr> </table> </body></html>
我们只需额外定义一个home.th.xml文件,就可以把之前的home.html文件当作Thymeleaf模板来使用,内容如下:
<?xml version="1.0"?><thlogic> <attr sel="#usersTable" th:remove="all-but-first"> <attr sel="/tr[0]" th:each="user : ${users}"> <attr sel="td.username" th:text="${user.name}" /> <attr sel="td.usertype" th:text="#{|user.type.${user.type}|}" /> </attr> </attr></thlogic>
逻辑解耦时,指定的属性会在模本解析的过程中插入指定的位置。通过sel属性指定选择器。
逻辑解耦,意味着可以使用纯HTML文件作为设计模板,允许设计人员不再需要具备Thymeleaf的相关知识。 详细介绍: Decoupled Template Logic
8. 性能提升
除了之前提到的特性之外,Thymeleaf 3.0 的另外一个重要突破就是有明显的性能提升。
2.1版本之前采用的基于XML的模板引擎,虽然有助于实现很多的特性,但是在有些情况下也造成了性能的损失。在绝大多数的项目里Thymeleaf的渲染时间是几乎可以忽略不计的,这也就凸显出来了Thymeleaf在某些特定情景下的性能问题。(例如:在高负载的网站中处理成千上万行的表格)。
Thymeleaf 3 重点关注性能问题并完全重写了引擎。因此与之前版本相比性能有很大的提升。而且,这种提升不仅仅局限于渲染时间,也包括更低的内存占用以及在高并发场景下的低延迟。
关于Thymeleaf 3 技术架构的讨论可参见: New event-based template processing engine
值得一提的是,性能提升不仅是架构层面的事,也包括3.0 版本里的一些有助于性能提升的新特性。例如,在3.0版本里使用SpringEL表达式的编译器(从Spring Framework4.2.4版本开始),在使用Spring的场景下,可进一步的提升性能。具体参见: Configuring the SpringEL compiler
即使没有使用Spring而是使用OGNL表达式,在3.0版本里也有性能优化。Thymeleaf甚至给OGNL代码库贡献了很多源码,这些代码有助于提升Thymeleaf在新的MVC1.0(JSR371)标准环境下的性能。
9. 不依赖于Servlet API
其实Thymeleaf3.0 之前版本在离线执行的情况下已经做到了不依赖于Java Servlet API,就是说在执行模板的过程中不依赖于Web容器。一个实用的场景就是用作邮件模板。
然而,在Thymeleaf3.0里做到了在Web环境下也完全不依赖Servlet API。这样就使得与那些不依赖Java Servlet框架(如 vert.x, RatPack, Play Framework)的集成更加简单方便。
更多参见: New extension point: Link Builders和 Generalisation of the IEngineContext mechanism.
10. 新的方言系统
Thymeleaf 3 提供了新的方言系统。如果你在早期版本上开发了Thymeleaf的方言,你需要使其与Thymeleaf 3 兼容。
新的方言接口十分简单
public interface IDialect { public String getName(); }
可以通过实现IDialect的子类接口,实现更多不同的特性。
列举一下新方言系统增强的点:
除了processors之外,还提供了pre-processors 和 post-processors,模板的内容可以在处理之前和之后被修改。例如,我们可以使用pre-processors来缓存内容或者用post-processors来压缩输出结果。
提出了方言优先级的概念,可以对方言的处理器(processor)进行排序。处理器优先级的排序是跨方言的。
对象表达式方言提供可以模本内任意地方使用的新的表达式对象和工具对象。如:#strings, #numbers, #dates 等。
更多特性,可参见:
New Dialect API
New Pre-Processor and Post-Processor APIs
New Processor API
11 重构了核心API
核心接口进行了深度重构,详见:
Refactoring of the Template Resolution API
Refactoring of the Context API
Refactoring of the Message Resolution API
12 总结
Thymeleaf 3 是Thymeleaf 模板引擎经过4年多不懈的努力和工作后的一个重要的里程碑式的成果。提供了许多令人兴奋的新特性以及许多隐藏的改进。 所以,别再犹豫,赶紧来试试吧。