Thymeleaf-Vorlage rendert keinen Parameterwert innerhalb der if-Bedingung

Aug 25 2020

Ich verwende Thymeleaf Template für meine Spring Boot Anwendung. Hier unter der Hauptseite,

<div th:replace="content :: content"></div>

und innerhalb des Inhaltsfragments,

<div th:fragment="content">
   <h4 th:if="${param.val== 'abc'}">SOME-TEXT</h4> // not working <h4 th:if="${param.val== 'abc'}" th:text="${param.val}"></h4> // not working <h4 th:text="${param.val}"></h4> // working and value is abc
   <h4 th:unless="${param.val== 'abc'}" th:text="${param.val}"></h4> // working - value in html text is abc
<h4 th:unless="${param.val== 'abc'}">SOME-TEXT</h4> // Working, value is SOME-TEXT
</div>

URL: domain/?val=abc

Ich möchte Folgendes anzeigen: SOME-TEXT in HTML, wenn param.val == 'abc'. Der Wert 'abc' kommt in th: text. Aber drinnen: wenn es nicht klappt.

Scheint, dass einige versteckte zusätzliche Zeichenfolgen zu param.val hinzugefügt wurden? Irgendein Vorschlag?

Antworten

1 andrewjames Aug 25 2020 at 00:41

Die Thymeleaf-Funktion ${param.val}gibt einen angeforderten Anforderungsparameter zurück val. Dies kann jedoch ein mehrwertiges Objekt sein (z. B. ein Array). Betrachten Sie beispielsweise Folgendes (was eine gültige Konstruktion ist):

?val=abc&val=def

Um mit einer einwertigen Zeichenfolge zu arbeiten, können Sie Folgendes tun:

<h4 th:if="${#strings.toString(param.val)} == 'abc'" th:text="'SOME-TEXT-2'">SOME-TEXT-1</h4>

Dies wird SOME-TEXT-2auf der Webseite gedruckt.

Oder Sie können dies verwenden:

<h4 th:if="${#strings.toString(param.val)} == 'abc'">SOME-TEXT-1</h4>

Welche druckt SOME-TEXT-1.

Nur aus Interesse, wenn Sie dieses erste Beispiel verwendet haben val=abc&val=def, können Sie sehen, was damit passiert:

<h4 th:text="${param.val}"></h4> 

Es wird ein Array gedruckt:

[abc, def]

Möglicherweise sehen Sie so etwas, wenn Sie eine Reihe verwandter Kontrollkästchen verarbeiten (nur als ein Beispiel).

Aktualisieren:

Für eine Nullprüfung mit Thymeleaf können Sie Folgendes tun:

<h4 th:if="${param.val} != null and ${#strings.toString(param.val)} == 'abc'">SOME-TEXT-2</h4>

In diesem speziellen Fall wird es nicht wirklich benötigt, da Sie mit dem Nullwert nichts tun, was ein Problem verursachen könnte.

Es ist relevanter, wenn Sie Werte in Objekten verketten foo.bar.baz- und Sie müssen überprüfen, ob foooder barsind null, um eine Nullzeigerausnahme zu vermeiden.

Beachten Sie, dass die Ausdruckssprache von Spring über den sicheren Navigationsoperator verfügt , der in solchen Fällen sehr hilfreich sein kann: So foo.?bar.?bazkönnen Sie eine präzisere Nullbehandlung als mit Thymeleaf allein schreiben. Aber auch hier nicht relevant für Ihr spezifisches Beispiel aus der Frage.