Frage Thymeleaf -> Prefix / Suffix ändern?

internet

Top Contributor
Ich versuche mich gerade mit

Weiß jemand, ob / wie ich es einstelle, dass mein Suff / Prefix anders sind als der Standard?
Anstatt [[${name}] hätte ich gerne {{name}} ?

Java:
public class Test {

    public static void main(String[] args) {

        StringTemplateResolver templateResolver = new StringTemplateResolver();
        templateResolver.setTemplateMode(TemplateMode.HTML);
        
        TemplateEngine templateEngine = new TemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
 
        String templateString = "<p>Hello, [[${name}]]!</p>";

        Context context = new Context();
        context.setVariable("name", "John Doe");

        StringWriter stringWriter = new StringWriter();
        templateEngine.process(templateString, context, stringWriter);

        System.out.println(stringWriter.toString());
    }

}

Ich habe es mal probiert mit, aber setPrefix setSuffix gibt es gar nicht...

Code:
StringTemplateResolver templateResolver = new StringTemplateResolver();       
templateResolver.setTemplateMode(TemplateMode.HTML);       
templateResolver.setPrefix("[[");       
templateResolver.setSuffix("]]");

Ich verwende:
Code:
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.1.2.RELEASE</version>
        </dependency>
 
Keine Ahnung, ob das die richtige Lösung ist, aber ich könnte im Nachgang {{name}} einfach wieder ersetzen?

Java:
String templateString = "<p>Hello, {{name}}!</p>";

private static String replaceCustomVariableSyntax(String templateString) {
   String output = templateString.replaceAll("\\{\\{([^}]+)\\}\\}", "[[\\${$1}]]");
   return output;
}
 
Funktioniert das dann mit allen SpEl Expressions?

Außerdem muss man dann beim Parsen / vor dem Parsen überhaupt jedesmal das ganze Dokument suchen und ersetzen... Sieht ineffizient aus.
 
Ausdrücke zwischen [[...]] werden in Thymeleaf als Ausdrucks-Inlining betrachtet. Das braucht man so gut wie nie.
Normalerweise verwendet man das th:text-Attribut.
<p>Hello, <span th:text="${session.user.name}">Karl</span>!</p>

Die Steuerzeichen einfach zu ändern hat vermutlich weitreichende Folgen und würde die gesamte Syntax betreffen. Das wird vermutlich nicht funktionieren.
 
Die Steuerzeichen einfach zu ändern hat vermutlich weitreichende Folgen und würde die gesamte Syntax betreffen. Das wird vermutlich nicht funktionieren.
Der erste Test hat gezeigt, dass es wohl gehen würde - aber ich habe es nur mit obigen Test versucht. Nicht weiter mit von Thymeleaf - Funktionen etc.

Aber prinzipiell müsste es doch gehen:
1. HTML Code enthält die Platzhalter mit {{meineVariable}}
2. HTML Code wird durchsucht mit diesen Platzhalter {{xxxxx}}.
3. HTML Code wird ersetzt mit dem Syntax von Thymeleaf, also alle {{xxxxx}} werden ersetzt durch ${xxxxx}
-> Nun habe ich die Syntax, die Thymeleaf benötigt...

4. Nun startet der Prozess von Thymeleaf.

Also vom Grundgedanke sehe ich auch erstmal kein Problem dabei?

Normalerweise verwendet man das th:text-Attribut.
<p>Hello, <span th:text="${session.user.name}">Karl</span>!</p>
Das kann ich bei Templates machen, die direkt von mir kommen.
Mein HTML Code kommt aber vom User selbst, das er erstellen kann. Bspw. eine "Emailvorlage" und dort habe ich dann eben Platzhalter wie:
"customer.surname" -> wird dann eben zu "Max"
 
Wenn du die die Platzhalter noch mal ersetzen willst, dann kannst du diese ja gleich durch den richtigen Wert ersetzen. Möglicherweise solltest du Freemarker statt Thymeleaf verwenden. Dass kommt deiner angestrebten Syntax etwas mehr entgegen.
 
Was ist der Unterschied zu Freemarker?
Ich habe gesehen „Mustache“ gibt es auch noch..

Neben dem einfachen ersetzen, bräuchte ich auch noch Logiken:
  • Liste erstellen (Schleife)
  • Funktionen für Formatierung von Datum, Kommazahlen
  • If / Else Anweisungen

Das sind nun mal die wichtigsten…
Ich will solch eine Bibliothek nutzen um aus einem html Code die Platzhalter zu nutzen für:
  • Emailtexte
  • Dokumente (Rechnungen, Angebote…)
 
Letztendlich bieten diese Template-Engines alle ähnliche Möglichkeiten. Allerdings ist die Syntax bei jedem System anders. Du kannst eben wählen, was für dich am Besten passt.

Die Template-Engine den Kunden bereitzustellen sehe ich ziemlich kritisch. Nach einem Refactoring oder anderen Änderungen am Domain-Model würden die Templates der Kunden dann plötzlich nicht mehr funktionieren. Weiterhin könnte die Bereitstellung einiger Objekte dein gesamtes Domain-Model offenlegen.

Wir lösen das, indem wir immer komplette Textbausteine bereitstellen. Etwa im Stil von Web-Components:
<customer-address />
oder
<current-date format="dd.MM.yyyy" />
oder als Liste von Rechnungsposten:
<invoice-items number-format="#,##" style="font-wight: bold" />
Wie du siehst, bleibt die Implementierung verborgen und es werden keine Domain-Objekte veröffentlicht. Wenn man also ein Refactoring durchführen möchte, dann werden die Templates der Kunden weiterhin funktionieren. Die Elemente verfügen auch über Slots, damit kann man den Aufbau vollständig individualisieren. Hier wird z.B.: das Name-Feld der Adresse angepasst. Dabei ist der Inhalt von props nur genau das, was dem Template customer-address bereitgestellt wird. Ein Hangeln durch die Objektstruktur ist nicht möglich. Jedes Template kann auch JavaScript enthalten. Auch Conditions sind möglich, z.B. negative Zahlen rot darstellen etc.
<customer-address>
<template #name="props">
<div>{{ props.firstName }}<span style="...">{{ props.name }}</span></div>
</template>
</customer-address>
Das stammt aber nicht komplett von uns, dahinter steckt letztendlich vue.js.
 
Also mein Prozess ist anders..
Mein User kann über ein Drop Down Liste möglichen Platzhalter in den HTML Code Editor einfügen.
Am Ende entsteht eben ein HTML Code wie "Mein User ist {{user.name}}.

Aktuell habe ich eigene Methoden, die dann in jeder Klasse die Platzhalter entsprechend ersetzt, mit simplen String replacement.
Das funktioniert auch, ist aber aufwändig und ich würde gerne zusätzlich Funktionen nutzen (insbesondere if / else), die bspw. Thymeleaf bietet.
Gerade letzteres bewegt mich eben doch Thymeleaf oder Freemarker zu nutzen, da ich damit einfach noch mehr Möglichkeiten haben...
 

Zurück
Oben