[JAVA] Wechseln Sie von JSP + JSTL zu Thymeleaf

Es ist der 7. Tag von Asoview Adventskalender 2019.

Ich bin Azuma, die braune Ratte vom Backend-Entwicklungsteam. Dieses Mal werde ich die Korrespondenztabelle einführen, wenn ich die JSP + JSTL-Funktion, die seit langem in Java-Webanwendungen verwendet wird, durch Thymeleaf ersetze.

Übertragung von JSP + JSTL nach Thymeleaf

JSP war früher die De-facto-Methode zum Erstellen von Java-Webanwendungen, aber jetzt, da Spring Boot Thymeleaf übernommen hat, gibt es Fälle, in denen die Präsentation aufgrund des Ersetzens vorhandener Anwendungen von JSP auf Thymeleaf ersetzt wird [^ 2].

Dieses Mal werde ich vorstellen, wie die in JSTL verwendete Funktion der in der alten Java-Webanwendung verwendeten JSP + -Tag-Bibliothek zusammen mit der Funktionskorrespondenztabelle durch Thymeleaf ersetzt wird.

[^ 2]: Ursprünglich wurde HTML von einem Servlet als Zeichenfolge ausgegeben, aber JSP ermöglicht das Schreiben von Java-Code, indem HTML als eine Vorlage betrachtet wird. Die Betriebsgeschwindigkeit von JSP ist jedoch nicht gut, die Lesbarkeit verschlechtert sich, da die Tags in den Tags überlagert werden und der JSP-Code zum ursprünglichen HTML-Code hinzugefügt wird. Wenn also das Bildschirmdesign oder -layout geändert wird, werden HTML und JSP geändert Die Wartbarkeit war nie gut, wie zum Beispiel Differenzkorrekturen.

Was ist diesmal angestrebt?

Zusätzlich zu JSTL-Tags werden wir auch Dinge im Zusammenhang mit der Verwendung von JSP- und EL-Ausdrücken vorstellen.

Namensraum Funktionsübersicht
c Grundbetrieb. Zur Ausgabe und temporären Speicherung von Werten.
fmt Formatierung des Ausgabeformats
fn Funktion zur Ausgabeverarbeitung

Unzutreffend

Namensraum Funktionsübersicht Grund für den Ausschluss
x XML-Operation(XPath und XSLT) Bearbeiten Sie XML oder Elemente in Thymeleaf nicht
sql Datenbankbetrieb Durchsuchen Sie die Datenbank nicht von Thymeleaf aus[^1]

[^ 1]: Es gibt eine Möglichkeit, das Thymeleaf-Spring-Plug-In zu verwenden, um auf eine Datenquelle von einer Spring-Management-Bean zu verweisen und diese auszugeben, insbesondere auf eine Klasse mit "@ Service" und "@ Repository". Es sollte jedoch eine angemessene Transaktionsverwaltung und Ressourcenzuweisung durchgeführt werden, und zwischengespeicherte Inhalte sollten nach Bedarf zurückgegeben werden.

Kern (Namensraum: c)

Das Core-Tag ist ein häufig verwendetes Tag, z. B. Wertausgabe und bedingte Verzweigung.

JSTL Thymeleaf Funktionsübersicht
<c:out> th:value、th:Stellt Attribute mit demselben Namen bereit, die mit dem in HTML ausgegebenen Attributnamen übereinstimmen, z. B. Text. Geben Sie den an die Vorlage übergebenen Wert in HTML aus
<c:set> th:with Speichern Sie den Wert in der temporären Variablen der Vorlage
<c:remove> (Kein entsprechendes Attribut) Entfernen Sie Werte aus temporären Variablen und Servlet-Attributen
<c:if> th:if Beschreiben Sie den bedingten Ausdruck des bedingten Zweigs.
<c:choose> th:switch Anschließend<c:when>Oder th:Listen Sie die Bedingungen im case-Element auf.
<c:when> th:case <c:choose>Und Th:Untergeordnetes Element des Schalters
<c:forEach> th:each Schleife und Ausgabe wiederholt. Definieren Sie hier temporäre Variablen wie Schleifenelemente und Regelvariablen
<c:forToken> #strings.arraySplit etc. Teilen Sie die Zeichenfolge mit einem Trennzeichen
<c:url> ${#uris.**} Generieren Sie eine URL. Dient auch als URL-Codierung.
<c:import> th:insert, th:replace, th:include Erfassen und Anzeigen externer Ressourcen
<c:redirect> (Keine entsprechende Funktion) Umleiten
<c:catch> (Keine entsprechende Funktion) Behandlung von Ausnahmen, die während der Ausgabe auftreten
<c:param> (In URL-Notation angegeben) Generieren Sie Anforderungsparameter für andere JSTL-Tags

Jetzt werde ich jede Funktion und jedes Verwendungsbeispiel vorstellen, während ich sie vergleiche.

th: text: Ausgabe in Tag-Text (= Elementwert)

Ausgabe auf Elementwert

<div>Botschaft</div>

Um dies anzuzeigen, vergleichen wir den Fall der Übergabe von Name: Nachricht und Wert: Nachricht.

thymeleaf JSP/JSTL
<div th:text="${message}">Text</div> <div><c:out value="${message}"/></div>

Thymeleaf gibt die im Elementwert des div geschriebenen Textzeichen als Inhalt von th: text aus. In JSP wird es angezeigt, auch wenn es nicht über "<c: out>" ausgegeben wird, sondern immer über "<c: out>" von JSTL, um den Ausgabewert zu bereinigen.

Ausgabe an Attributwert

<input type="text" value="Botschaft" />

Um dies anzuzeigen, die Art zu schreiben, wenn bei der Übergabe von Name: Nachricht, Wert: Nachricht,

thymeleaf JSP/JSTL
<input type="text" value="Text" th:value="${message}"/> <input type="text" value="<c:out value="${message}"/>" />

Der Wert wird wie folgt umgeschrieben: ** Geben Sie denselben Attributnamen wie das Attribut an, das Sie ausgeben möchten **, was auch eine Funktion von Thymeleaf ist. Andererseits ist es in JSP / JSTL etwas schwierig zu lesen, da es sich um eine Beschreibung handelt, die den Wert innerhalb des Attributwerts des Tags ausgibt und ihn weiter in das Tag einschließt.

String-Verkettung

Die Verkettung von Zeichenfolgen ist auch innerhalb der Attribute in Thymeleaf möglich. Wenn Sie die Zeichenfolge direkt schreiben, schließen Sie sie in einfache Anführungszeichen ein.

<div th:text="'das ist,' + ${message} + 'ist'">Text</div>

Das Ausgabeergebnis davon ist

<div>Dies ist eine Nachricht</div>

th: with: Wert in temporärer Variable speichern

Sie können den Ausgabewert während der Ausgabe von HTML wiederholt verwenden oder den Wert neu zuweisen, um den Ausgabeinhalt zu ändern.

thymeleaf JSP/JSTL
<div th:with="another='${original}' +ist">Text</div> <div><c:set value="${original}ist" var="another"/></div>

In Thymeleaf-Vorlagen definierte temporäre Variablen können von dem Element referenziert werden, das die temporäre Variable sowie ihre untergeordneten Elemente definiert. An Thymeleaf Name: Nachricht, Wert: Wenn als Nachricht übergeben

<div th:with="anotherMessage='das ist,' + ${message} + 'ist'" th:text="${anotherMessage}">Text</div>

Das Ausgabeergebnis davon ist

<div>Dies ist eine Nachricht</div>

Definieren Sie mehrere temporäre Variablen

Wenn Sie mehrere temporäre Variablen definieren möchten, verbinden Sie sie mit Kommas. Selbstverständlich ist die Verarbeitung und Berechnung von Zeichenfolgen auch dann möglich, wenn mehrere Definitionen beschrieben werden.

<div th:with="i=3, anotherMessage=${message} + 'ist'">
	<span th:text="${anotherMessage}">Text</span>
	<span th:text="${i}">Text</span>
</div>

Das Ausgabeergebnis davon ist

<div>
	<span>Ist eine Nachricht</span>
	<span>3</span>
</div>

Definieren Sie denselben Variablennamen

Was ist, wenn ich sie unter demselben Variablennamen speichere?

<div th:with="message=${message} + 'ist'">
	<span th:text="${message}">Text 1</span>
</div>
<div th:text="${message}">Text 2</div>

In diesem Fall wird die ** Nachrichtenzuweisung nur innerhalb des ** th: with-Elements durchgeführt.

<div>
	<span>Ist eine Nachricht</span>
</div>
<div>Botschaft</div>

Der vorübergehend in th: with von Thymeleaf definierte Wert ist ** nur für dieses Element und seine untergeordneten Elemente ** gültig. Andererseits behält JSP + JSTL den gespeicherten Inhalt und den gleichen Inhalt bis zur Ausgabe von Text 2 bei. Das ist ein großer Unterschied. Daher wird in JSP der Wert mit <c: remove> gelöscht und die nachfolgende Verarbeitung fortgesetzt.

Verwenden Sie temporäre Variablen in Thymeleaf in Kombination mit nachfolgenden Attributen wie bedingter Verzweigung und Schleifenverarbeitung wie th: if und th: each.

Untergeordnetes Element ausgeben und nachfolgendes Thymeleaf-Attribut verarbeiten, wenn th: Wenn die Bedingung erfüllt ist

Geben Sie den Inhalt des untergeordneten Elements aus oder führen Sie das Tag des untergeordneten Elements nur aus, wenn bestimmte Bedingungen erfüllt sind. Dies ist dasselbe für JSP / JSTL und Thymeleaf, aber Thymeleaf gibt die Elemente aus, die th: if definieren. Außerdem wird das Thymeleaf-Attribut (th: 〇〇) im selben Element ausgeführt.

thymeleaf JSP/JSTL
<div th:if="${original == 'Botschaft'}> <div><c:if test="${original == 'Botschaft'}"/></div>

Sie können fast dieselbe Methode und Methode zum Schreiben von bedingten Ausdrücken in Attributwerten verwenden.

Grundsystem des bedingten Ausdrucks

An Thymeleaf Name: Nachricht, Wert: Wenn als Nachricht übergeben

<div th:if="${message == 'Botschaft'}">
	<span th:text="${message}">Text</span>
</div>

Dieses Ausgabeergebnis ist

<div>
	<span>Botschaft</span>
</div>

Verwenden Sie Java-Code für bedingte Ausdrücke

Im bedingten Ausdruck von th: if können verschiedene Java-Codes geschrieben werden. Am häufigsten wird eine Methode der Java-Klasse aufgerufen, und es ist auch möglich, sie in einen bedingten Ausdruck zu integrieren oder einen Nur-Anzeige-Wert auszugeben.

<div th:if="${message.startsWith('Messe')}">
	<span th:text="${message}">Text</span>
</div>

Da es sich bei der variablen Nachricht um eine Nachricht mit String handelt, ist startWith () true, daher ist dieses Ausgabeergebnis

<div>
	<span>Botschaft</span>
</div>

Es wird sein.

Für die Ausgabe, wenn die Bedingung beispielsweise nicht erfüllt ist, bestimmt das Folgende, ob die Länge der Zeichenfolge der variablen Nachricht 256 oder mehr beträgt.

<div th:if="${message.length() >= 256}">
	<span th:text="${message}">Text</span>
</div>

Wenn die Bedingung dieser if-Anweisung nicht erfüllt ist, werden das Element und die untergeordneten Elemente nicht vollständig ausgegeben. Mit anderen Worten, dieses

-Element wird nicht ausgegeben.

Verzweigen Sie mit mehreren Bedingungen th: switch th: case

Der Wechsel zu case entspricht der Java-switch-Anweisung. Wenn eine Bedingung nicht erfüllt ist, wird die andere Bedingung überprüft. Wenn auch nur eine der Bedingungen nicht erfüllt ist, wird die Bedingung durch th: case =" * " dargestellt.

<div th:switch="${message}">
	<span th:case="Botschaft" th:text="${message}"></span>
	<span th:case="*">Es gab keine entsprechende Nachricht</span>
</div>

Wenn Sie diese Thymeleaf-Vorlage mit einem Namen: message und einem Wert: message übergeben, stimmt sie mit dem ersten th: case überein, sodass die Ausgabe wie folgt lautet.

<div>
	<span>Botschaft</span>
	
</div>

Elemente, die nicht ausgegeben werden, sind Leerzeilen. Wenn der Wert der Nachricht nicht Nachricht ist

<div>
	
	<span>Es gab keine entsprechende Nachricht</span>
</div>

Neben Strings kann th: case auch numerische Werte oder Aufzählungswerte (enum) sein.

<div th:switch="${price}">
	<span th:case="100" th:text="${price}">Preis</span>
	<span th:case="200" th:text="${price}">Preis</span>
	<span th:case="300" th:text="${price}">Preis</span>
	<span th:case="*" th:text="Es gibt keinen anwendbaren Preis"></span>
</div>

Wenn für diese Vorlage der Preiswert 200 beträgt,

<div>

	<span>200</spam>


</div>

Wird beispielsweise angezeigt, wenn der Preiswert 150 beträgt, wird das nachfolgende th: case-Tag ausgeführt.

<div>



	<span>Es gibt keinen anwendbaren Preis</spam>
</div>

Bei Verwendung des Aufzählungswerts

Wenn die folgenden Aufzählungstypen definiert sind

public enum Direction {
	North, South, East , West ;

	public String getValue() {
		return name();
	}
}

Die Verifizierungsmethode in Thymeleaf kann wie folgt beschrieben werden.

<div th:switch="${direction.getValue()}">
	<span th:case="North" th:text="Norden"></span>
	<span th:case="East" th:text="Osten"></span>
	<span th:case="South" th:text="Süden"></span>
	<span th:case="West" th:text="Westen"></span>
	<span th:case="*" th:text="Unzutreffend"></span>
</div>

Wenn für diese Vorlage der Name Richtung und Wert: Direction.East angegeben sind, wird der Inhalt von <span th: case =" East "th: text =" East "> </ span> ausgegeben.

Wiederholte Ausgabe th: jeweils

Es gibt einen Unterschied in der Beschreibungsmethode zwischen JSTL und Thymeleaf in der Methode der wiederholten Ausgabe von Elementen wie der Tabellenausgabe mit "" und dem Listenfeld mit "" und "

JSTL Thymeleaf Überblick
<c:forEach> th:each Wiederholte Ausgabe deklarieren

Um ein Listenfeld mit JSTL auszugeben, schließen Sie das Element, das Sie wiederholt ausgeben möchten, in <c: forEach> ein.

<select>
  <c:forEach var="result" items="${list}">
    <option value="<c:out value="${result.value}" />"><c:out value="${result.label}" /></option>
  </c:forEach>
</select>

Thymeleaf beschreibt th: each direkt für das Element, das Sie wiederholt ausgeben möchten. Es kann beschrieben werden, ohne die Tag-Hierarchie zu ändern.

<select>
  <option th:each="result : ${list}" th:value="${result.value}" th:inline="text">[[${result.label}]]</option>
</select>

Format (Namensraum: fmt)

Eine Funktion, die das Ausgabeformat definiert.

JSTL Thymeleaf Übersicht über die Tag-Funktion
<fmt:formatNumber> ${#numbers.formatInteger(..)} Zahlen- und Betragsformat
<fmt:formatDate> ${#dates.format(..)} Datumsformat
<fmt:parseNumber> ※${#conversions.convert(object, targetClass)} Konvertieren Sie Zeichenfolgen in Zahlen
<fmt:parseDate> ※${#conversions.convert(object, targetClass)} Zeichenfolge in Datum konvertieren
<fmt:setBundle> (Keiner) Ressourcenpaket festlegen
<fmt:bundle> (Keiner) Ressourcenpaket abrufen
<fmt:message> #{messageId} Geben Sie die angegebene Nachricht aus dem Ressourcenpaket aus
<fmt:requestEncoding> (Keiner) Ändern Sie die Zeichenkodierung der Anforderung.
<fmt:setLocale> (Keiner) Legen Sie das Gebietsschema fest. Das Gebietsschema nach dieser Deklaration wird geändert.
<fmt:setTimeZone> (Keiner) Stellen Sie die Zeitzone ein. Die Zeitzone nach dieser Deklaration wird umgeschaltet.
<fmt:timeZone> (Keiner) Gibt die Zeitzone zurück.

Neben der Definition des Formats des Werts kann fmt das Gebietsschema und die Zeitzone innerhalb derselben JSP-Datei wechseln. Dies bietet die Möglichkeit, den Variablentyp während der Vorlagenausgabe zu ändern und die Sprache und die Eigenschaftendatei zu ändern, die in die Nachricht ausgegeben werden sollen. Es ist jedoch besser, die JSP nach Gebietsschema zu wechseln, als innerhalb einer Datei zu wechseln. Es ist einfach zu warten und Sie werden häufig eine Methode anwenden, die das Bildschirmlayout für jede Sprache ändert.

Auf der anderen Seite bietet Thymeleaf eine Vielzahl von Formatkonvertierungen für Zeichenfolgen, Beträge und Datumsangaben. Hier sind einige davon.

Thymeleaf Überblick
${#dates.format(date, 'dd/MMM/yyyy HH:mm')} Ausgabe in einem Format mit einem bestimmten Datum
${#numbers.formatInteger(num,3)} Geben Sie die Mindestanzahl der anzuzeigenden Anzeigestellen an
${#numbers.formatPercent(num)} Prozentuale Notation
${#numbers.sequence(from,to)} Fortlaufende Nummern

In Thymeleaf können Sie die Konvertierungsfunktion verwenden, die den Typ einer Variablen während der Vorlagenausgabe konvertiert, um sie in einen anderen Typ zu konvertieren. Die Vorlage gibt jedoch nur den Typwert aus und konvertiert ihn versehentlich in die Vorlage. Das Schreiben eines Prozesses, der dies tut, verringert die Lesbarkeit und sollte vermieden werden.

Funktion (Namensraum: fn)

Funktionen, die mit Zeichenfolgen arbeiten. Wenn die Variable in Thymeleaf ein String-Typ ist, wird sie ausgeführt, wenn Sie die Methode so schreiben, wie sie ist, aber alle in JSTL bereitgestellten Funktionen werden in der Funktion # string bereitgestellt.

JSTL Thymeleaf Übersicht über die Tag-Funktion
<fn:contains> ${#strings.contains(name,'ez')} True, wenn die angegebene Zeichenfolge enthalten ist
<fn:containsIgnoreCase> ${#strings.containsIgnoreCase(name,'ez')} True, wenn es die angegebene Zeichenfolge enthält, wobei Groß- und Kleinschreibung ignoriert wird
<fn:indexOf> ${#strings.indexOf(name,frag)} Gibt die Position der angegebenen Zeichenfolge zurück
<fn:startsWith> ${#strings.startsWith(name,'Don')} True, wenn von der angegebenen Zeichenfolge gestartet
<fn:endsWith> ${#strings.endsWith(name,endingFragment)} True, wenn die angegebene Zeichenfolge am Ende steht
<fn:trim> ${#strings.trim(str)} Entfernen Sie das Feld mit der halben Breite vor und nach der Zeichenfolge
<fn:join> ${#strings.arrayJoin(namesArray,',')}Oder${#strings.listJoin(namesList,',')} Saiten kombinieren
<fn:replace> ${#strings.replace(name,'las','ler')} Zeichenfolge ersetzen
<fn:split> ${#strings.arraySplit(namesStr,',')}Oder${#strings.listSplit(namesStr,',')} Nach angegebenem Zeichen teilen
<fn:length> ${#strings.length(str)} Gibt die Länge der Zeichenfolge zurück
<fn:substring> ${#strings.substring(name,3,5)} Mit der angegebenen Zeichenfolge ausschneiden
<fn:substringAfter> ${#strings.substringAfter(name,prefix)} Schneidet die Zeichenfolge nach der angegebenen Position aus
<fn:substringBefore> ${#strings.substringBefore(name,suffix)} Schneiden Sie die Zeichenfolge bis zur angegebenen Position
<fn:lowerCase> ${#strings.toLowerCase(name)} Mach es niedriger
<fn:upperCase> ${#strings.toUpperCase(name)} Profitieren
<fn:escapeXml> ${#strings.escapeXml(str)} HTML-Escape
(Keiner) ${#strings.equals(first, second)} True, wenn die Zeichenfolgen gleich sind
(Keiner) ${#strings.equalsIgnoreCase(first, second)} True, wenn die Zeichenfolgen gleich sind, Groß- und Kleinschreibung ignorieren
(Keiner) ${#strings.randomAlphanumeric(count)} Gibt eine zufällige alphanumerische Zeichenfolge mit der angegebenen Anzahl von Zeichen zurück

Implizite Objekte und Umfang von JSP

JSP hat den Attributbereich [^ 3] + JSPs eigenen Bereich, den das Servlet hat, aber Sie können auch darauf verweisen, indem Sie diesen "Bereich" in Thymeleaf angeben.

Implizites Objekt von JSP Beschreibung in Thymeleaf
request #request
session #session
application #servletContext
page (Keiner)
config (Keiner)

Es gibt eine separate Erfassungsmethode für Thymeleaf-Einstellungen, auf die in #execInfo verwiesen wird.

[^ 3]: Der Bereich definiert die Lebensdauer beim Speichern von Variablen. Anforderungsattribute, Sitzungsattribute, Anwendungsattribute (oder Servlet-Kontextattribute) und JSP sind vier weitere Seitenkontextattribute. Spring MVC verfügt über ein separates Flash-Attribut.

Arithmetik- / Verifikationsformel

Fast das gleiche ist für Thymeleaf verfügbar.

JSP / EL Thymeleaf Überblick über die Verarbeitung
+ + Summe
- - Unterschied
* * Produkt
/ div / div Xu
% mod % mod Rest
== eq == eq Äquivalent
!= ne != ne Nicht gleich
< lt < lt Linke Seite<rechte Seite
> gt > gt Linke Seite>rechte Seite
<= le <= le Linke Seite<=rechte Seite
>= ge >= ge Linke Seite>=rechte Seite
& and & Logisches UND(AND)
pipe or | Logische Summe(OR)
! not ! not Verweigerung(NOT)
empty (Keiner) Himmel

Ausnahmebehandlung

Wenn in JSP während der Vorlagenausgabe ein Laufzeitfehler auftritt, können Sie die Einstellung für den Übergang zur Nur-Fehler-Seite in der JSP-Direktive deklarieren oder ~ catch im Scriptlet (obwohl dies nicht empfohlen wird) versuchen, eine Ausnahme zu machen. Ich konnte die Ausnahmebehandlung abfangen und implementieren.

Die Ausnahmebehandlung kann in Thymeleaf nicht implementiert werden. Da nur die Antwort auf den Fehler ausgegeben wird, wird die Ausnahmebehandlung in der Klasse implementiert, die die Thymeleaf-Vorlage aufruft.

abschließend

Wie oben erwähnt, war es ein bisschen eilig, aber ich hoffe, es hilft, die Implementierung von JSP + JSTL durch Thymeleaf zu ersetzen.

Recommended Posts

Wechseln Sie von JSP + JSTL zu Thymeleaf
Wechseln Sie von slim3-gen zu slim3-gen-jsr269
Wechseln Sie von Eclipse zu VS Code
Wiedereinführung in JSTL
[Java] So wechseln Sie von Open JDK zu Oracle JDK
Übergeben Sie die Formularklasse mit Spring-Boot vom Controller an Symleaf
Änderungen von Java 8 zu Java 11
Summe von Java_1 bis 100
Migrieren Sie von JUnit 4 zu JUnit 5
Einführung in Ratpack (9) - Thymeleaf
Wischen Sie, um die Bildschirme zu wechseln
Von Java zu Ruby !!
Von iBATIS zu MyBatis3 verschoben
Migration von Cobol nach JAVA
Wechsel von AWS zu PaizaCloud
Neue Funktionen von Java7 bis Java8
Stellen Sie eine Verbindung von Java zu PostgreSQL her
Konvertieren Sie von ○ Monaten in ○ Jahre ○ Monate
JSP-Fehleranzeige vom Servlet
Umschreiben von Applet zu Anwendung
Wechseln Sie von SQLite3 zu PostgreSQL
Von ineffektivem Java zu effektivem Java