Thymeleaf in Version 3 erschienen

Thymeleaf Logo

Die Template Engine Thymeleaf (sprich /ˈtaɪmˌlɪːf/) wurde für das nächste große Major Release vollständig überarbeitet und steht nun in der Version 3 zur Verfügung. Die Release-Ankündigung findet sich im Thymeleaf-Forum.

Thymeleaf ist eine Open Source Template Engine, die als Alternative zu anderen Technologien, wie JSP oder Velocity, verwendet werden kann. Thymeleaf kann für die Darstellungsschicht von MVC-Anwendungen oder auch als offline XML-Prozessor verwendet werden. Zum Beispiel bringt Thymeleaf eine vollständige Spring-Integration mit, sodass die Template Engine sehr gut als Grundlage für Spring MVC-Applikationen verwendet werden kann.

Thymeleaf steht unter der Apache License 2.0.

Was ist Thymeleaf?

Einer der ganz großen Vorteile von Thymeleaf, verglichen mit anderen Template Engines, ist, dass Thymeleaf auf HTML5-Templates aufsetzt, deren HTML-Elemente mit einigen Steuerattributen angereichert werden. Diese HTML5-Templates können dadurch problemlos durch einen Browser angezeigt werden, ohne dass dabei die Templating-Steueranweisungen die Template-Darstellung beeinträchtigen würden. Der Browser ignoriert einfach die ihm unbekannten Steuerattribute. Man kann damit zu jeder Zeit ganz unkompliziert die Optik seiner Templates mit dem Browser überprüfen.

Die Steuerattribute, die man einem HTML-Template hinzufügt, sorgen dafür, dass bestimmte Teile des HTML-Dokuments später durch die Template Engine mit den Anwendungsdaten ausgetauscht werden. Ein Thymeleaf-Template kann Platzhaltertexte und -elemente enthalten, die später in der laufenden Anwendung nicht mehr sichtbar sind. Öffnet man ein solches Template im Browser, sind die Platzhalterelemente sichtbar und vermitteln so einen Eindruck von der Anwendung. Man kann also direkt die UI Mockups, die von Web-Designern erstellt wurden, als Template verwenden. Zudem können durch dieses Prinzip auch mehrere Templates über Links miteinander verbunden werden, sodass die Templates auch als Click Dummy für eine Anwendung selbst herhalten können.

Diesen Vorteil hat man bei anderen Template Engines, wie z. B. JSP, nicht. Bei diesen muss erst ein Template-Prozessor ein Template vorverarbeiten und in HTML umwandeln, bevor man sich ein Bild von der optischen Gestaltung des Templates machen kann. Thymeleaf kommt für die Vorschau ohne laufenden Server-Prozess aus.

Thymeleaf 3

Der Kern von Thymeleaf wurde nun für die Version 3 komplett überarbeitet und zum großen Teil ganz neu geschrieben. Damit ändern sich weite Teile der API von Thymeleaf. Davon sind allerdings vor allem eigene Dialekte und Prozessoren betroffen. Die vorhandenen Templates, die für ältere Versionen von Thymeleaf erstellt wurden, sollen zum Großteil unverändert auch mit Thymeleaf 3 funktionieren. Um den Umstieg auf die neue Version zu erleichtern, wird ein Ten-Minute Migration Guide zur Verfügung gestellt.

Die folgenden Neuerungen und Verbesserungen werden besonders hervorgehoben:

  • Verbesserte Performance durch ereignisgetriebene Template-Verarbeitung
  • Volle Unterstützung von HTML5, ohne zwingend XML-konformes Markup verwenden zu müssen
  • Möglichkeit, auch reine Text-Daten zu verarbeiten, z. B. zum Erzeugen von Emails
  • Verbesserte Inlining-Fähigkeit
  • Verbessertes Fragment- und Layout-Management
  • Template-Logik kann von eigentlichen Templates entkoppelt werden
  • Verbesserte Integration für nicht-servlet-basierte Szenarien

Hier einige der neuen Features im Detail:

Ereignisgetriebener Template-Verarbeitungsprozessor

Die Template-Verarbeitung bei älteren Thymeleaf-Versionen lief in drei Stufen ab: Parsen — Verarbeiten — Ausgabe. Jede dieser Phasen musste komplett abgeschlossen sein, bevor die nächste Phase beginnen konnte. Stehen sehr großen Mengen von Markup-Daten an, die verarbeitet werden müssen (zum Beispiel beim Iterieren über sehr große Collections), ist dieser Ansatz verhältnismäßig langsam. Es musste erst der komplette Prozess abgewartet werden, bevor man irgendein Ergebnis zu sehen bekam.

Der bisherige DOM-basierte Ansatz zur Template-Verarbeitung wird von Thymeleaf 3 zugunsten einer neuartigen, ereignisgetriebenen Template-Verarbeitung ersetzt. Hierbei werden nacheinander Template/Cache Events verarbeitet, die ihre Ausgabe sofort produzieren. Ein Template wird damit blockweise verarbeitet. Dadurch wird die Template-Prozessierung wesentlich performanter und speichersparender.

(Quelle)

Volle HTML5 Unterstützung

Ältere Thymeleaf-Versionen verwenden unter der Haube einen SAX-basierten XML-Parser, um Templates zu parsen. Dadurch konnten HTML5-Dokumente nur als wohlgeformte XML-Struktur verwendet werden. Zudem musste durch diesen Umstand der Inhalt von <script>– oder <style>-Tags in einen <![CDATA[ ... ]]>-Block eingefasst werden.

Diese Notwendigkeit entfällt bei Thymeleaf 3 komplett. Der SAX-basierte Parser wurde durch eine eigene (nicht SAX-konforme) Parser-Implementierung namens Attoparser ersetzt. Attoparser ist ein schneller, ereignisgetriebener Open Source Java Parser für XML- und HTML-Markup. Dieser Parser erlaubt auch das Parsen von nicht wohlgeformtem XML-Markup, wodurch er sich besonders zum Verarbeiten von HTML-Code eignet. Zum Beispiel kann der Parser ein img-Tag (<img src="...">) ohne Ende-Tag und in nicht minimierter Form (<img src="..." />) problemlos parsen.

(Quelle)

Entkoppelte Template-Logik

Bisher bestanden Thymeleaf-Templates aus HTML-Code, der mit bestimmten Steuerattributen angereichert war. Die Steuerattribute bestimmen dabei, wie die HTML-Struktur bei der Template-Verarbeitung umgewandelt und mit Daten angereichert werden muss. Durch diesen Ansatz konnte man auch mit Thymeleaf keine vollständige Trennung von Darstellung und Template-Logik erreichen.

Thymeleaf 3 führt nun eine neue Möglichkeit ein, genau dies zu erreichen. Ein Thymeleaf 3-Template wird dafür in zwei Dateien unterteilt. Die eine Datei enthält ausschließlich das reine HTML-Markup des Templates, ohne jegliche Steueranweisungen. Die zweite Datei ist eine XML-Datei, mit der vorgegeben wird, wie das HTML-Template mit den Thymeleaf-Steueranweisungen angereichert werden soll. Dadurch kann eine hundertprozentige Trennung von Darstellung und Template-Logik erreicht werden. Es wird mit diesem Mechanismus zum Beispiel möglich, die von den Web-Designern erstellten HTML-Mockups direkt und unverändert zu verwenden.

Ein Beispiel soll dies verdeutlichen. Das HTML-Template wird, wie das folgende Beispiel-Markup, in einer Datei home.html vorgegeben.

<!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>

Dieses Markup wird nun durch die Steuerdatei home.th.xml mit Thymeleaf-Steueranweisungen angereichert:

<?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>

Diese beiden Dateien werden durch den Template-Prozessor miteinander verschmolzen. Als Ergebnis kommt das folgende Thymeleaf-Template heraus, das in der Form auch von älteren Thymeleaf-Versionen verstanden wird:

<!DOCTYPE html>
<html>
  <body>
    <table id="usersTable" th:remove="all-but-first">
      <tr th:each="user : ${users}">
        <td class="username" th:text="${user.name}">Jeremy Grapefruit</td>
        <td class="usertype" th:text="#{|user.type.${user.type}|}">Normal User</td>
      </tr>
      <tr>
        <td class="username">Alice Watermelon</td>
        <td class="usertype">Administrator</td>
      </tr>
    </table>
  </body>
</html>

(Quelle)

Neue Template-Modi

Neben der Verwendung von HTML- und XML-Markup können nun auch weitere Datenformate für Templates verwendet werden. Dazu wurden weitere Template-Modi eingeführt:

  • TEXT: Mit dem TEXT-Modus können nun auch Plain-Text-Dokumente verarbeitet werden. Dieser Modus eignet sich zum Beispiel zur Erstellung von Emails oder Dokumentationen aus Vorlagen.
  • JAVASCRIPT: Erlaubt die Verarbeitung von JavaScript-Dateien. Dadurch können die Daten des Datenmodells einer Anwendung auch zum Anreichern von JavaScript-Code verwendet werden. Der Modus bietet JavaScript-spezifische Integrationen, wie z. B. Escaping.
  • CSS: Ebenso wie JavaScript-Dateien können auch CSS-Dateien von Thymeleaf verarbeitet werden.
  • RAW: Dieser Modus verarbeitet ein Template, ohne das Template dabei zu prozessieren. Die Daten werden einfach nur durchgereicht.

(Quelle)

Für die neuen textuellen Modi TEXT, JAVASCRIPT und CSS wurde auch eine neue Template-Syntax eingeführt, die sich von der markup-basierten Syntax für XML- und HTML-Code unterscheidet.

(Quelle)

Unterstützung von nicht-servlet-basierten Umgebungen

Durch die Einführung eines neuen Link Builder Extension Points können URLs nun auch über andere Mechanismen als über die Verwendung der Servlet API erzeugt werden (Quelle). Damit ist Thymeleaf dafür vorbereitet, in Kontexten verwendet zu werden, die nicht die Servlet API verwenden. Zudem ist es möglich, die Geschwindigkeit der Template-Verarbeitung zu steuern und herunterzuregeln. Die Ausgabegeschwindigkeit der Template Engine kann dadurch mit der Empfangsbereitschaft eines Clients synchronisiert werden. Damit wird die Integration in reaktive Umgebungen, wie z. B. Spring Reactive, vert.x oder Ratpack, erleichtert.

(Quelle)

Weitere Verbesserungen können der Release-Ankündigung entnommen werden.

Short URL for this post: http://wp.me/p4nxik-2Ct
Roland Krüger

About Roland Krüger

Software Engineer at Orientation in Objects GmbH. Find me on Google+, follow me on Twitter.
This entry was posted in Java Web Frameworks and tagged , , . Bookmark the permalink.

Leave a Reply