{"id":636,"date":"2026-01-10T00:44:06","date_gmt":"2026-01-09T23:44:06","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=636"},"modified":"2026-02-16T00:46:15","modified_gmt":"2026-02-15T23:46:15","slug":"die-java-template-engine-jte-performante-und-typsichere-templates","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=636","title":{"rendered":"Die Java Template Engine JTE \u2013 Performante und typsichere Templates"},"content":{"rendered":"\n<p>Die <strong>Java Template Engine (JTE)<\/strong> ist eine moderne Template-Engine f\u00fcr die JVM, die einen klaren Fokus auf <strong>Performance, Typsicherheit und Entwicklerfreundlichkeit<\/strong> legt. Im Gegensatz zu klassischen Template-Systemen wie JSP oder String-basierten Engines verfolgt JTE einen anderen Ansatz: Templates werden <strong>zu echtem Java-Code kompiliert<\/strong>. Dadurch entstehen zur Build-Zeit optimierte Klassen \u2013 ohne Reflection, ohne Interpreter und ohne versteckte Laufzeitmagie.<\/p>\n\n\n\n<p>In diesem Artikel werfen wir einen detaillierten Blick auf Architektur, Funktionsweise, Integration, Performance und typische Einsatzszenarien.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Was ist JTE?<\/h2>\n\n\n\n<p>Java Template Engine wurde entwickelt, um HTML-Templates so effizient wie m\u00f6glich zu rendern. Das zentrale Konzept:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Ein Template ist kein String, sondern wird zu einer Java-Klasse kompiliert.<\/p>\n<\/blockquote>\n\n\n\n<p>Das bedeutet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keine Template-Interpretation zur Laufzeit<\/li>\n\n\n\n<li>Volle Typsicherheit<\/li>\n\n\n\n<li>IDE-Autovervollst\u00e4ndigung<\/li>\n\n\n\n<li>Fr\u00fcherkennung von Fehlern beim Kompilieren<\/li>\n<\/ul>\n\n\n\n<p>JTE eignet sich besonders f\u00fcr:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Spring Boot Webanwendungen<\/li>\n\n\n\n<li>REST-Services mit serverseitigem HTML<\/li>\n\n\n\n<li>Microservices mit minimalem Overhead<\/li>\n\n\n\n<li>High-Performance-Webanwendungen<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Architektur und Funktionsweise<\/h2>\n\n\n\n<p>Der Kernmechanismus von JTE ist die <strong>Ahead-of-Time-Kompilierung<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Klassischer Template-Ansatz (z. B. Thymeleaf)<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Template wird zur Laufzeit gelesen<\/li>\n\n\n\n<li>Parser analysiert Platzhalter<\/li>\n\n\n\n<li>Reflection oder Expression Language wird ausgef\u00fchrt<\/li>\n\n\n\n<li>HTML wird zusammengesetzt<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">JTE-Ansatz<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Template-Datei (<code>.jte<\/code>) wird beim Build verarbeitet<\/li>\n\n\n\n<li>Daraus wird Java-Code generiert<\/li>\n\n\n\n<li>Dieser wird normal kompiliert<\/li>\n\n\n\n<li>Zur Laufzeit wird nur noch eine Methode aufgerufen<\/li>\n<\/ol>\n\n\n\n<p>Das Ergebnis: <strong>nahezu identische Performance wie handgeschriebener Java-Code<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Projektstruktur und erstes Beispiel<\/h2>\n\n\n\n<p>Ein typisches Template liegt im Verzeichnis:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">src\/main\/jte\/\n<\/code><\/span><\/pre>\n\n\n<p>Beispiel: <code>hello.jte<\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">@param String name\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>Hallo ${name}!<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Der <code>@param<\/code>-Block definiert typsichere Parameter.<\/p>\n\n\n\n<p>Wird hier ein falscher Typ \u00fcbergeben, schl\u00e4gt bereits die Kompilierung fehl \u2013 nicht erst zur Laufzeit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rendering im Code<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">templateEngine<\/span><span class=\"hljs-selector-class\">.render<\/span>(\"<span class=\"hljs-selector-tag\">hello<\/span><span class=\"hljs-selector-class\">.jte<\/span>\", <span class=\"hljs-selector-tag\">model<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Oder typsicher:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Templates<\/span><span class=\"hljs-selector-class\">.hello<\/span><span class=\"hljs-selector-class\">.render<\/span>(<span class=\"hljs-selector-tag\">output<\/span>, \"<span class=\"hljs-selector-tag\">Welt<\/span>\");\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Diese Klasse wurde automatisch generiert.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Integration in Spring Boot<\/h2>\n\n\n\n<p>Spring Boot l\u00e4sst sich sehr einfach mit JTE kombinieren.<\/p>\n\n\n\n<p>Vorteile gegen\u00fcber klassischen Engines:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Schnellere Startzeit<\/li>\n\n\n\n<li>Kein Reflection-Overhead<\/li>\n\n\n\n<li>Native-Image-freundlich (z. B. mit GraalVM)<\/li>\n\n\n\n<li>Sehr geringer Speicherverbrauch<\/li>\n<\/ul>\n\n\n\n<p>In der Praxis ersetzt JTE h\u00e4ufig Engines wie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Thymeleaf<\/li>\n\n\n\n<li>FreeMarker<\/li>\n\n\n\n<li>JSP<\/li>\n<\/ul>\n\n\n\n<p>Gerade in Cloud-Umgebungen mit vielen Instanzen macht sich die reduzierte CPU-Last deutlich bemerkbar.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Layouts und Template-Komposition<\/h2>\n\n\n\n<p>JTE unterst\u00fctzt Layouts \u00fcber sogenannte Template-Aufrufe.<\/p>\n\n\n\n<p>Beispiel: <code>layout.jte<\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">@param String title\n@param Content content\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>${title}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n  ${content}\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Verwendung:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">@template.layout(\"Startseite\") {\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>Willkommen<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Damit entsteht eine klare Trennung zwischen Struktur und Inhalt \u2013 \u00e4hnlich wie bei modernen Frontend-Frameworks.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Typsicherheit als zentrales Merkmal<\/h2>\n\n\n\n<p>Der gr\u00f6\u00dfte Vorteil von JTE ist die strikte Typsicherheit:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Parameter m\u00fcssen definiert sein<\/li>\n\n\n\n<li>Falsche Typen f\u00fchren zu Compilerfehlern<\/li>\n\n\n\n<li>Keine String-basierten Expression-Languages<\/li>\n\n\n\n<li>IDE-Unterst\u00fctzung inklusive Refactoring<\/li>\n<\/ul>\n\n\n\n<p>Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-keyword\">@param<\/span> User user\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Greift man im Template auf ein nicht existierendes Feld zu, erkennt das der Compiler sofort.<\/p>\n\n\n\n<p>Dieser Ansatz reduziert:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Runtime-Fehler<\/li>\n\n\n\n<li>Debugging-Aufwand<\/li>\n\n\n\n<li>Produktionsprobleme<\/li>\n<\/ul>\n\n\n\n<p>Gerade in gro\u00dfen Enterprise-Projekten ist das ein entscheidender Vorteil.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. Performance-Betrachtung<\/h2>\n\n\n\n<p>Da Templates zu reinem Java-Code werden:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keine Reflection<\/li>\n\n\n\n<li>Keine Expression Language<\/li>\n\n\n\n<li>Kein Parsing zur Laufzeit<\/li>\n<\/ul>\n\n\n\n<p>Benchmark-Vergleiche zeigen regelm\u00e4\u00dfig, dass JTE schneller ist als klassische Engines wie Thymeleaf oder FreeMarker.<\/p>\n\n\n\n<p>Besonders vorteilhaft ist das bei:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hochfrequentierten APIs<\/li>\n\n\n\n<li>Serverseitigem Rendering (SSR)<\/li>\n\n\n\n<li>Microservices mit kurzer Lebensdauer<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. Entwicklungserfahrung<\/h2>\n\n\n\n<p>JTE unterst\u00fctzt zwei Modi:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Development Mode<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Templates werden dynamisch neu geladen<\/li>\n\n\n\n<li>Ideal f\u00fcr lokale Entwicklung<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Production Mode<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Templates sind vorcompiliert<\/li>\n\n\n\n<li>Maximale Performance<\/li>\n<\/ul>\n\n\n\n<p>Dadurch vereint JTE schnelle Iteration im Development mit hoher Effizienz im Betrieb.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9. Sicherheit<\/h2>\n\n\n\n<p>JTE unterst\u00fctzt kontextsensitives Escaping:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>HTML<\/li>\n\n\n\n<li>Attribute<\/li>\n\n\n\n<li>JavaScript<\/li>\n\n\n\n<li>CSS<\/li>\n<\/ul>\n\n\n\n<p>Dadurch wird Cross-Site-Scripting (XSS) reduziert.<\/p>\n\n\n\n<p>Im Gegensatz zu manchen \u00e4lteren Engines ist das Escaping-Konzept bewusst einfach gehalten und stark typisiert.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10. Vergleich mit anderen Template-Engines<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>JTE<\/th><th>Thymeleaf<\/th><th>FreeMarker<\/th><\/tr><\/thead><tbody><tr><td>Typsicherheit<\/td><td>\u2705 Voll<\/td><td>\u274c Teilweise<\/td><td>\u274c Nein<\/td><\/tr><tr><td>Laufzeit-Parsing<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>\u2705 Ja<\/td><\/tr><tr><td>Reflection<\/td><td>\u274c Nein<\/td><td>\u2705 Ja<\/td><td>Teilweise<\/td><\/tr><tr><td>Performance<\/td><td>Sehr hoch<\/td><td>Mittel<\/td><td>Gut<\/td><\/tr><tr><td>Native-Image-Support<\/td><td>Sehr gut<\/td><td>Eingeschr\u00e4nkt<\/td><td>Eingeschr\u00e4nkt<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>JTE positioniert sich klar als <strong>High-Performance-Engine f\u00fcr moderne JVM-Architekturen<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">11. Typische Einsatzszenarien<\/h2>\n\n\n\n<p>JTE eignet sich besonders f\u00fcr:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>REST-Backends mit HTML-Ausgabe<\/li>\n\n\n\n<li>E-Mail-Template-Generierung<\/li>\n\n\n\n<li>SSR in Microservices<\/li>\n\n\n\n<li>Cloud-native Anwendungen<\/li>\n\n\n\n<li>Anwendungen mit GraalVM Native Image<\/li>\n<\/ul>\n\n\n\n<p>Weniger geeignet ist JTE f\u00fcr:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Designer-getriebene HTML-Workflows<\/li>\n\n\n\n<li>Projekte, die stark auf WYSIWYG-Tools setzen<\/li>\n<\/ul>\n\n\n\n<p>Da JTE st\u00e4rker entwicklerzentriert ist, profitieren vor allem Backend-Teams.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">12. Fazit<\/h2>\n\n\n\n<p>Die <strong>Java Template Engine (JTE)<\/strong> ist eine moderne, performante und kompromisslos typsichere Template-Engine f\u00fcr Java.<\/p>\n\n\n\n<p>Ihre Kernst\u00e4rken sind:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kompilierte Templates<\/li>\n\n\n\n<li>Hohe Performance<\/li>\n\n\n\n<li>Native-Image-Kompatibilit\u00e4t<\/li>\n\n\n\n<li>Klare Architektur<\/li>\n\n\n\n<li>Exzellente Typsicherheit<\/li>\n<\/ul>\n\n\n\n<p>F\u00fcr Projekte, bei denen Performance, Wartbarkeit und saubere Build-Zeit-Validierung wichtig sind, ist JTE eine hervorragende Wahl.<\/p>\n\n\n\n<p>Sie verbindet die Klarheit von Java-Code mit der Ausdrucksst\u00e4rke von Templates \u2013 und verzichtet dabei bewusst auf die Laufzeitkosten klassischer Engines.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Java Template Engine (JTE) ist eine moderne Template-Engine f\u00fcr die JVM, die einen klaren Fokus auf Performance, Typsicherheit und Entwicklerfreundlichkeit legt. Im Gegensatz zu klassischen Template-Systemen wie JSP oder String-basierten Engines verfolgt JTE einen anderen Ansatz: Templates werden zu echtem Java-Code kompiliert. Dadurch entstehen zur Build-Zeit optimierte Klassen \u2013 ohne Reflection, ohne Interpreter und [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-636","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/636","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=636"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/636\/revisions"}],"predecessor-version":[{"id":637,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/636\/revisions\/637"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=636"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=636"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=636"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}