Пользовательские теги 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 ...
<% } >
Другие вопросы по тегам