Шаблон Thymeleaf не отображает значение параметра внутри условия if

#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? Так что для меня это будет полный супер ответ. 🙂