1. Einführung
Thymeleaf ist eine Java-Template-Engine für die Verarbeitung und Erstellung von HTML, XML, JavaScript, CSS und Nur-Text. Ein Intro zu Thymeleaf und Spring finden Sie unter dieser Beitrag .
In diesem Artikel werden wir neue Funktionen von Thymeleaf 3.0 in Spring MVC mit Thymeleaf-Anwendung besprechen. Version 3 enthält neue Funktionen und viele Verbesserungen unter der Haube. Um genauer zu sein, behandeln wir die Themen natürliche Verarbeitung und Javascript-Inlining.
Thymeleaf 3.0 enthält drei neue textuelle Vorlagenmodi: TEXT , JAVASCRIPT und CSS -, die zur Verarbeitung von einfachen, JavaScript- bzw. CSS-Vorlagen verwendet werden sollen.
2. Abhängigkeiten von Maven
Lassen Sie uns zunächst die für die Integration von Thymeleaf mit Spring erforderlichen Konfigurationen sehen. thymeleaf-spring library ist in unseren Abhängigkeiten erforderlich:
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring4</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
Beachten Sie, dass für ein Spring 4-Projekt die thymeleaf-spring4 -Bibliothek anstelle von thymeleaf-spring5 verwendet werden muss. Die neueste Version der Abhängigkeiten finden Sie unter https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.thymeleaf%22%20AND%20a%3A%22thymeleaf-spring5%22 Hier].
3. Java Thymeleaf-Konfiguration
Zuerst müssen wir neue Template Engine, View und Template Resolver konfigurieren. Dazu müssen wir die erstellte Java-Konfigurationsklasse aktualisieren
Um dies zu tun, müssen wir die Java-Konfigurationsklasse aktualisieren: Link:/thymeleaf-in-spring-mvc Neben neuen Arten von Resolvern implementieren unsere Vorlagen die Spring-Schnittstelle ApplicationContextAware :
@Configuration
@EnableWebMvc
@ComponentScan({ "com.baeldung.thymeleaf" })
public class WebMVCConfig implements WebMvcConfigurer, ApplicationContextAware {
private ApplicationContext applicationContext;
//Java setter
@Bean
public ViewResolver htmlViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine(htmlTemplateResolver()));
resolver.setContentType("text/html");
resolver.setCharacterEncoding("UTF-8");
resolver.setViewNames(ArrayUtil.array("** .html"));
return resolver;
}
@Bean
public ViewResolver javascriptViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine(javascriptTemplateResolver()));
resolver.setContentType("application/javascript");
resolver.setCharacterEncoding("UTF-8");
resolver.setViewNames(ArrayUtil.array("** .js"));
return resolver;
}
@Bean
public ViewResolver plainViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine(plainTemplateResolver()));
resolver.setContentType("text/plain");
resolver.setCharacterEncoding("UTF-8");
resolver.setViewNames(ArrayUtil.array("** .txt"));
return resolver;
}
}
Wie wir oben sehen können, haben wir drei verschiedene Ansichtsauflöser erstellt - eine für HTML-Ansichten, eine für Javascript-Dateien und eine für reine Textdateien.
Thymeleaf unterscheidet sie, indem sie die Dateinamenserweiterungen .html , .js und .txt jeweils überprüfen.
Wir haben auch die statische ArrayUtil -Klasse erstellt, um die Methode array () zu verwenden, die das erforderliche String[] -Array mit Ansichtsnamen erstellt.
Im nächsten Teil dieser Klasse müssen wir die Template Engine konfigurieren:
private <span class="pl-smi x x-first x-last">ISpringTemplateEngine</span> templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(templateResolver);
return engine;
}
Schließlich müssen wir drei separate Vorlagenauflöser erstellen:
private ITemplateResolver htmlTemplateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/views/");
resolver.setCacheable(false);
resolver.setTemplateMode(TemplateMode.HTML);
return resolver;
}
private ITemplateResolver javascriptTemplateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/js/");
resolver.setCacheable(false);
resolver.setTemplateMode(TemplateMode.JAVASCRIPT);
return resolver;
}
private ITemplateResolver plainTemplateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/txt/");
resolver.setCacheable(false);
resolver.setTemplateMode(TemplateMode.TEXT);
return resolver;
}
Bitte beachten Sie, dass es zum Testen besser ist, nicht zwischengespeicherte Vorlagen zu verwenden. Aus diesem Grund wird empfohlen, die Methode setCacheable (false) zu verwenden.
Javascript-Vorlagen werden im Ordner /WEB-INF/js/ gespeichert. Die reinen Textdateien befinden sich im Ordner /WEB-INF/txt/ . Der Pfad zu den HTML-Dateien ist /WEB-INF/html .
4. Federsteuerungskonfiguration
Um unsere neue Konfiguration zu testen, haben wir folgenden Spring-Controller entwickelt:
@Controller
public class InliningController {
@RequestMapping(value = "/html", method = RequestMethod.GET)
public String getExampleHTML(Model model) {
model.addAttribute("title", "Baeldung");
model.addAttribute("description", "<strong>Thymeleaf</strong> tutorial");
return "inliningExample.html";
}
@RequestMapping(value = "/js", method = RequestMethod.GET)
public String getExampleJS(Model model) {
model.addAttribute("students", StudentUtils.buildStudents());
return "studentCheck.js";
}
@RequestMapping(value = "/plain", method = RequestMethod.GET)
public String getExamplePlain(Model model) {
model.addAttribute("username", SecurityContextHolder.getContext()
.getAuthentication().getName());
model.addAttribute("students", StudentUtils.buildStudents());
return "studentsList.txt";
}
}
Im Beispiel für eine HTML-Datei zeigen wir Ihnen, wie Sie die neue Inlining-Funktion mit und ohne HTML-Tags verwenden können.
Für das JS-Beispiel generieren wir eine AJAX-Anfrage, die die js-Datei mit den Schülerinformationen lädt. Bitte beachten Sie, dass wir die einfache buildStudents () -Methode innerhalb der StudentUtils -Klasse verwenden, und zwar unter diesem Link:/thymeleaf-in-spring-mvc[article].
Im Klartext-Beispiel zeigen wir schließlich die Schülerinformationen als Textdatei an. Ein typisches Beispiel für die Verwendung des Nur-Text-Vorlagenmodus könnte zum Senden von Nur-Text-E-Mails verwendet werden.
Als zusätzliche Funktion verwenden wir SecurityContextHolder , um den protokollierten Benutzernamen zu erhalten.
5. HTML/JS/TEXT-Beispieldateien
Der letzte Teil dieses Lernprogramms besteht darin, drei verschiedene Dateitypen zu erstellen und die Verwendung der neuen Thymeleaf-Funktionen zu testen. Beginnen wir mit der HTML-Datei:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Inlining example</title>
</head>
<body>
<p>Title of tutorial:[[${title}]]</p>
<p>Description:[(${description})]</p>
</body>
</html>
In dieser Datei verwenden wir zwei unterschiedliche Ansätze. Um den Titel anzuzeigen, verwenden wir eine Escape-Syntax, die alle HTML-Tags entfernt und nur Text anzeigt. Im Falle der Beschreibung verwenden wir eine nicht umschriebene Syntax, um HTML-Tags beizubehalten. Das Endergebnis sieht dann so aus:
<p>Title of tutorial: Baeldung</p>
<p>Description: <strong>Thymeleaf</strong> tutorial</p>
Das wird natürlich von unserem Browser analysiert, indem das Wort Thymeleaf fett dargestellt wird.
Als Nächstes testen wir die js-Vorlagenfunktionen:
var count =[[${students.size()}]];
alert("Number of students in group: " + count);
Attribute im JAVASCRIPT -Vorlagenmodus werden von JavaScript nicht angezeigt.
Dies führt zur Erstellung einer js-Warnung. Wir laden diese Warnung mithilfe von jQuery AJAX in die Datei listStudents.html:
<script>
$(document).ready(function() {
$.ajax({
url : "/spring-thymeleaf/js",
});
});
</script>
Die letzte, aber nicht die kleinste Funktion, die wir testen möchten, ist die Erzeugung von Textdateien. Wir haben die Datei studentsList.txt mit folgendem Inhalt erstellt:
Dear[(${username})],
This is the list of our students:[# th:each="s : ${students}"] -[(${s.name})]. ID:[(${s.id})][/]Thanks,
The Baeldung University
Beachten Sie, dass wie bei den Markup-Vorlagenmodi die Standard-Dialekte nur ein verarbeitbares Element ( [# …]) und eine Menge verarbeitbarer Attribute ( th: text, th: utext, th: if, th: falls nicht enthalten , th: each usw.). Das Ergebnis wird eine Textdatei sein, die wir beispielsweise in der E-Mail verwenden können, wie am Ende von Abschnitt 3 erwähnt.
-
Wie testen? ** Wir empfehlen, zuerst mit dem Browser zu spielen und dann den vorhandenen JUnit-Test zu überprüfen.
6. Fazit
In diesem Artikel haben wir die im Thymeleaf-Framework implementierten neuen Funktionen mit Fokus auf Version 3.0 beschrieben.
Die vollständige Implementierung dieses Tutorials finden Sie unter https://github.com/eugenp/tutorials/tree/master/spring-thymeleaf (GitHub-Projekt). Dies ist ein auf Eclipse basierendes Projekt, das in jeder modernen Umgebung leicht zu testen ist Internet-Browser.
Wenn Sie vorhaben, ein Projekt von Version 2 auf diese neueste Version zu migrieren, lesen Sie http://www.thymeleaf.org/doc/articles/thymeleaf3migration.html im Migrationsleitfaden]. Beachten Sie, dass Ihre vorhandenen Thymeleaf-Vorlagen zu fast 100% mit Thymeleaf 3.0 kompatibel sind. In dieser Konfiguration müssen Sie nur wenige Änderungen vornehmen.