Test в теге JSTL <c: if>
Я видел в JSP код, похожий на следующий:
<c:if test="<%=request.isUserInRole(RoleEnum.USER.getCode())%>">
<li>user</li>
</c:if>
Моя путаница над значком "=", который появляется в значении атрибута test
. Я понял, что все, что включено в <%= %>
, печатается на выходе, но, конечно же, значение, назначенное тесту, должно быть логическим, поэтому почему это работает?
Для бонусных очков есть ли способ изменить значение атрибута выше, чтобы он не использовал код сценария? Предположительно, это означает, что вместо этого используется EL.
Cheers,
Дон
Ответы
Ответ 1
Все, что атрибут test
ищет, чтобы определить, является ли что-то истинным, является строка "true" (case in-sensitive). Например, следующий код напечатает "Hello world!"
<c:if test="true">Hello world!</c:if>
Код внутри <%= %>
возвращает логическое значение, поэтому он либо напечатает строку "true", либо "false", что и ищет тег <c:if>
.
Ответ 2
Вы также можете использовать что-то вроде
<c:if test="${ testObject.testPropert == "testValue" }">...</c:if>
Ответ 3
Выражение между <% =% > оценивается до вычисления c: if. Итак, предположим, что | request.isUserInRole | возвращает | true |, ваш пример будет оцениваться следующим образом:
<c:if test="true">
<li>user</li>
</c:if>
а затем будет выполнен c: if.
Ответ 4
Атрибуты в библиотеках тегов JSP вообще могут быть либо статическими, либо разрешенными во время запроса. Если они будут разрешены во время запроса, JSP решит их значение во время выполнения и передаст результат на тег. Это означает, что вы можете поместить почти любой JSP-код в атрибут, и тег будет вести себя соответственно к тому, что производит результат.
Если вы посмотрите на документы jstl taglib, вы можете увидеть, какие атрибуты являются временем повторного использования, а какие нет. http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html
Ответ 5
<% =% > будет отправлен на выход, в контексте JSTL он будет оцениваться по строке