Пользовательские теги JSP: возможно ли иметь больше, чем старт / закрыть теги?
После использования языка шаблонов Django я действительно скучаю по возможности делать такие вещи:
{% if condition %}
<!-- snip -->
{% else %}
<!-- snip -->
{% endif %}
Когда я использую JSP, я застреваю, делая что-то вроде этого:
<logic:equal name="something" value="example">
<!-- snip -->
</logic:equal>
<logic:notEqual name="something" value="example">
<!-- snip -->
</logic:notEqual>
или же:
<% if (condition) { %>
<!-- snip -->
<% } else { %>
<!-- snip -->
<% } %>
Можно ли написать собственный тег, который поддерживает else
а также else if
вместо того, чтобы просто иметь пару тегов для каждой проверки?
Если это невозможно, какой стиль предпочтителен? Scriptlets или несколько пар тегов? В моей организации большинство людей, похоже, не одобряют скриплетов, но я действительно не услышал вескую причину, почему простые условные утверждения, подобные тем, которые я перечислил, настолько плохи.
5 ответов
Теги в XML идут парами, один для открытия, другой для закрытия. Три элемента конца if if else не дают хорошего формата открытия и закрытия. Единственный другой способ - использовать тег выбора следующим образом:
<c:choose>
<c:when test="${bean.value == 2}">
<p>True</p>
</c:when>
<c:otherwise>
<p>False</p>
</c:otherwise>
</c:choose>
Это обычный способ кодирования структур if и else в jstl.
JSTL-теги поставляются с тегом выбора, который работает как множественный выбор.
<c:choose>
<c:when test="${first condition}">
whatever
</c:when>
<c:when test="${second condition}">
whatever
</c:when>
<c:when test="${third condition}">
whatever
</c:when>
<c:otherwise>
whatever else
</c:otherwise>
</c:choose>
Вышеуказанные решения будут работать (<c:choose
> и <c:if
>).
Если вы заинтересованы в написании пользовательских тегов, чтобы сделать больше или быть более "специфичными для домена", они на самом деле довольно просты.
Я сделал презентацию на JavaOne несколько лет назад - слайды находятся по адресу http://javadude.com/articles/javaone/index.html (в первом разделе). Есть подробности о том, как писать циклические и условные теги. (Я сделал презентацию до того, как вышел стандартный тег libs, кстати)
На http://www.orionserver.com/docs/tutorials/taglibs/index.html есть действительно хороший учебник по пользовательским тегам. У него есть несколько особенностей для сервера orion, но большинство из них очень общие.
Я не вижу причин, по которым вы не могли написать собственный тег JSP, который знал бы, что нужно искать тег в его содержании. Это не будет "лучшей практикой", но это будет довольно чистый и интуитивно понятный способ делать вещи.
В стандартных библиотеках тегов есть условные теги:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:if ... >
</c:if>
ищите любую ссылку на JSTL.
Вы также можете сделать это прямо в jsp, хотя это немного осуждается:
<% if (something) { %>
... this will only display if something is true ...
<% } >