Thymeleaf Template non restituisce il valore del parametro all'interno della condizione if

Aug 25 2020

Sto usando il modello thymeleaf per la mia applicazione di avvio primaverile. Di seguito la pagina principale,

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

e all'interno del frammento di contenuto,

<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

Voglio visualizzare: SOME-TEXT in html se param.val == 'abc'. Il valore 'abc' sta entrando in th: text. Ma all'interno di th: se fallisce.

Sembra che alcune stringhe extra nascoste siano state aggiunte a param.val? Qualche suggerimento?

Risposte

1 andrewjames Aug 25 2020 at 00:41

La funzione Thymeleaf ${param.val}restituirà un parametro di richiesta chiamato val. Ma questo potrebbe essere un oggetto multivalore (ad esempio un array), ad esempio considera questo (che è una costruzione valida):

?val=abc&val=def

Quindi, per lavorare con una stringa a valore singolo, puoi farlo:

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

Viene stampato SOME-TEXT-2nella pagina web.

Oppure puoi usare questo:

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

Che stampa SOME-TEXT-1.

Solo per interesse, se hai usato quel primo esempio val=abc&val=def, puoi vedere cosa succede con questo:

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

Stampa un array:

[abc, def]

Potresti vedere qualcosa di simile durante l'elaborazione di una serie di caselle di controllo correlate (proprio come un esempio).

Aggiornare:

Per un controllo nullo, usando Thymeleaf, puoi farlo:

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

In questo caso specifico, non è realmente necessario, poiché non stai facendo nulla con il valore null che potrebbe causare un problema.

È più rilevante se concatenate valori negli oggetti foo.bar.baze dovete controllare se fooo barsono nulli per evitare un'eccezione del puntatore nullo.

Tieni presente che il linguaggio di espressione di Spring ha l' operatore di navigazione sicura , che può essere molto utile in questi casi foo.?bar.?baz:, che ti consente di scrivere una gestione dei null più concisa rispetto al solo Thymeleaf. Ma ancora una volta, non pertinente al tuo esempio specifico dalla domanda.