Атрибут test в теге JSTL <c: if>

Я видел код вроде следующего в JSP

<c:if test = "<%=request.isUserInRole(RoleEnum.USER.getCode())%>">
    <li>user</li>
</c:if>

Меня беспокоит знак "=" в значении атрибута test. Насколько я понимаю, все, что входит в <%= %>, печатается на выходе, но, конечно, значение, назначенное для test, должно быть логическим, так почему это работает?

Для бонусных баллов, есть ли способ изменить значение атрибута выше, чтобы он не использовал код скриптлета? Предположительно, это означает использование вместо этого EL.

Ваше здоровье, Дон

<% = => выводится на вывод, только если он появляется вне тега JSP, как сказано в ответе ниже. Однако при этом нет оценивается как строка, а преобразуется в любой тип, ожидаемый атрибутом. Атрибут <c:if> тега test имеет тип boolean, поэтому любое выражение, возвращаемое скриптлетом, будет преобразовано в boolean.

mxxk 01.01.2015 15:01

Хотя интересно видеть, что если вы смешиваете строку и скриптлет в атрибуте тега JSP, механизм запутается и интерпретирует все значение как строку. То есть <c:if test = "abc<%= true %>"> не будет выполнять скриптлет, а вместо этого преобразует строку abc<%= true %> в логическое значение через Boolean.valueOf(), которое возвращает false. stackoverflow.com/questions/8168821/…

mxxk 01.01.2015 15:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
14
2
128 857
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Атрибуты в библиотеках тегов JSP в целом могут быть статическими или разрешаться во время запроса. Если они разрешены во время запроса, JSP разрешит их значение во время выполнения и передаст вывод в тег. Это означает, что вы можете поместить в атрибут практически любой код JSP, и тег будет вести себя в соответствии с тем, какой результат он производит.

Если вы посмотрите документацию jstl taglib, вы увидите, какие атрибуты являются временем повторного использования, а какие нет. http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html

<% =%> сам по себе будет отправлен на вывод, в контексте JSTL он будет оценен как строка

Выражение между <% =%> оценивается до вычисления тега c: if. Итак, предположим, что | request.isUserInRole | возвращает | true |, ваш пример будет сначала оценен следующим образом:

<c:if test = "true">
    <li>user</li>
</c:if>

а затем будет выполнен тег c: if.

Ответ принят как подходящий

Все, что ищет атрибут test, чтобы определить, истинно ли что-то, - это строка «true» (без учета регистра). Например, следующий код напечатает «Hello world!»

<c:if test = "true">Hello world!</c:if>

Код в <%= %> возвращает логическое значение, поэтому он либо напечатает строку «true», либо «false», что именно то, что ищет тег <c:if>.

Строго говоря, разве код внутри <% =%> не возвращает строку, а не логическое значение?

Dónal 18.09.2008 19:50

@Don, request.isUserInRole () (который находится внутри <% = и%>) действительно возвращает логическое значение. Надеюсь, это то, о чем вы спрашивали.

Shivasubramanian A 05.12.2008 08:35

Фактически, обработчик тега для <c:if> получает значение атрибута test через метод установки, который ожидает логическое значение. Обработчик не ищет строку «истина». Вместо этого причина, по которой ваш пример работает с test = "true", заключается в том, что EL переводит строку true в логическое значение перед установкой атрибута. Принуждение выполняется по этим правилам: stackoverflow.com/questions/8168821/…

mxxk 01.01.2015 14:45

Вы также можете использовать что-то вроде

<c:if test = "${ testObject.testPropert == "testValue" }">...</c:if>

Если вы вкладываете кавычки в JSTL, вам нужно использовать одинарные кавычки для самых внутренних (в данном случае около 'testValue').

hotshot309 17.07.2012 23:22

Другие вопросы по теме