Я видел код вроде следующего в JSP
<c:if test = "<%=request.isUserInRole(RoleEnum.USER.getCode())%>">
<li>user</li>
</c:if>
Меня беспокоит знак "=" в значении атрибута test. Насколько я понимаю, все, что входит в <%= %>, печатается на выходе, но, конечно, значение, назначенное для test, должно быть логическим, так почему это работает?
Для бонусных баллов, есть ли способ изменить значение атрибута выше, чтобы он не использовал код скриптлета? Предположительно, это означает использование вместо этого EL.
Ваше здоровье, Дон
Хотя интересно видеть, что если вы смешиваете строку и скриптлет в атрибуте тега JSP, механизм запутается и интерпретирует все значение как строку. То есть <c:if test = "abc<%= true %>"> не будет выполнять скриптлет, а вместо этого преобразует строку abc<%= true %> в логическое значение через Boolean.valueOf(), которое возвращает false. stackoverflow.com/questions/8168821/…




Атрибуты в библиотеках тегов 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>.
Строго говоря, разве код внутри <% =%> не возвращает строку, а не логическое значение?
@Don, request.isUserInRole () (который находится внутри <% = и%>) действительно возвращает логическое значение. Надеюсь, это то, о чем вы спрашивали.
Фактически, обработчик тега для <c:if> получает значение атрибута test через метод установки, который ожидает логическое значение. Обработчик не ищет строку «истина». Вместо этого причина, по которой ваш пример работает с test = "true", заключается в том, что EL переводит строку true в логическое значение перед установкой атрибута. Принуждение выполняется по этим правилам: stackoverflow.com/questions/8168821/…
Вы также можете использовать что-то вроде
<c:if test = "${ testObject.testPropert == "testValue" }">...</c:if>
Если вы вкладываете кавычки в JSTL, вам нужно использовать одинарные кавычки для самых внутренних (в данном случае около 'testValue').
<% = => выводится на вывод, только если он появляется вне тега JSP, как сказано в ответе ниже. Однако при этом нет оценивается как строка, а преобразуется в любой тип, ожидаемый атрибутом. Атрибут
<c:if>тегаtestимеет типboolean, поэтому любое выражение, возвращаемое скриптлетом, будет преобразовано вboolean.