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.
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.
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 |
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.
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.
<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.
<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.
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>
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>
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>
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.
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.
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>
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
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>
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.
Es gibt einen Unterschied in der Beschreibungsmethode zwischen JSTL und Thymeleaf in der Methode der wiederholten Ausgabe von Elementen wie der Tabellenausgabe mit "
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>
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.
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 |
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.
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 |
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.
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