#spring-boot #thymeleaf
#весенняя загрузка #thymeleaf
Вопрос:
Я использую шаблон thymeleaf для моего приложения spring boot. Здесь, под главной страницей,
<div th:replace="content :: content"></div>
и внутри фрагмента содержимого,
<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
Я хочу отобразить: НЕКОТОРЫЙ ТЕКСТ в html, если параметр.val == ‘abc’.
Значение ‘abc’ находится внутри th:text. Но внутри th: если сбой.
Кажется, в param.val добавлены какие-то скрытые дополнительные строки? Есть предложения?
Комментарии:
1. th: if отвечает только за принятие решения о том, включать это <h4 /> или нет. Если вы все еще хотите, чтобы «SOME-TEXT» был заменен на «abc», вам также необходимо использовать th:text:
<h4 th:if="${param.val== 'abc'}" th:text="${param.val}">
2. ДА. Но несколько th; если проверка с параметром.val не работает. <h4 th: if=»${param.val== ‘abc’}» th:text=»${param.val}»> —> не работает. но <h4 th:text=»${param.val}»> —> работает
3. Кроме того, <h4 th: если=»${param.val== ‘abc’}» th:text=»${param.val}»></h4> —> работает. Кажется, в param.val добавлены какие-то дополнительные символы?
Ответ №1:
Функция Thymeleaf ${param.val}
вернет вызванный параметр запроса val
. Но это может быть многозначный объект (например, массив) — например, рассмотрим это (что является допустимой конструкцией):
?val=abcamp;val=def
Итак, для работы с однозначной строкой вы можете сделать это:
<h4 th:if="${#strings.toString(param.val)} == 'abc'" th:text="'SOME-TEXT-2'">SOME-TEXT-1</h4>
Это печатается SOME-TEXT-2
на веб-странице.
Или вы можете использовать это:
<h4 th:if="${#strings.toString(param.val)} == 'abc'">SOME-TEXT-1</h4>
Которое печатает SOME-TEXT-1
.
Просто из интереса, если вы использовали тот первый пример val=abcamp;val=def
, то вы можете посмотреть, что произойдет с этим:
<h4 th:text="${param.val}"></h4>
Он печатает массив:
[abc, def]
Вы можете увидеть нечто подобное при обработке ряда связанных флажков (просто в качестве одного примера).
Обновить:
Для проверки на нуль, используя Thymeleaf, вы можете сделать это:
<h4 th:if="${param.val} != null and
${#strings.toString(param.val)} == 'abc'">SOME-TEXT-2</h4>
В данном конкретном случае это на самом деле не требуется, поскольку вы ничего не делаете с нулевым значением, что могло бы вызвать проблему.
Это более актуально, если вы объединяете значения в объекты в цепочку foo.bar.baz
— и вам нужно проверить, являются ли foo
или bar
нулевыми, чтобы избежать исключения нулевого указателя.
Имейте в виду, что язык выражений Spring имеет оператор безопасной навигации, который может быть очень полезен в таких случаях: foo.?bar.?baz
, позволяя вам написать более краткую обработку null, чем только с помощью Thymeleaf. Но опять же, не имеет отношения к вашему конкретному примеру из вопроса.
Комментарии:
1. ${#строки. toString(param.val)} == ‘abc’ —> Работает. Спасибо, спас мой день. Не могли бы вы, пожалуйста, включить в свой ответ, как проверить $ {# strings. toString(param.val)} == ‘abc’ amp;amp; not == также null? Так что для меня это будет полный супер ответ. 🙂