Пользовательские теги JSP: возможно ли иметь больше, чем теги start/close?

После использования языка шаблонов 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>

or:

<% if (condition) { %>
   <!-- snip -->
<% } else { %>
   <!-- snip -->
<% } %>

Можно ли написать собственный тег, который поддерживает else и else if, а не просто иметь пару тегов для каждой проверки?

Если это невозможно, какой стиль является «предпочтительным»? Скриптлеты или несколько пар тегов? В моей организации большинство людей, похоже, не одобряют скриптлеты, но я действительно не слышал веских причин, по которым простые условные операторы, подобные тем, которые я перечислил, так плохи.


person TM.    schedule 04.06.2009    source источник
comment
Я не знаком с Django, но в чем разница между примером Django и вторым JSP?   -  person Tom Hawtin - tackline    schedule 04.06.2009


Ответы (5)


Теги в XML идут парами, один для открытия, другой для закрытия. Три элемента конца if then else не обеспечивают хороший открытый и закрытый формат. Единственный другой способ — использовать тег select следующим образом:

<c:choose>
  <c:when test="${bean.value == 2}">
    <p>True</p>
  </c:when>
  <c:otherwise>
    <p>False</p>
  </c:otherwise>
</c:choose>

Это обычный способ кодирования структур if then else в jstl.

person Ricardo Marimon    schedule 04.06.2009

Теги 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>
person Vincent Ramdhanie    schedule 04.06.2009

Приведенные выше решения будут работать (<c:choose> и <c:if>).

Если вы заинтересованы в написании пользовательских тегов, чтобы сделать больше или быть более «специфическим для домена», это на самом деле довольно просто.

Я делал презентацию на JavaOne несколько лет назад — слайды находятся по адресу http://javadude.com/articles/javaone/index.html (в первом разделе). Есть подробности о том, как писать циклические и условные теги. (Я сделал презентацию до того, как вышли стандартные библиотеки тегов, кстати)

Кроме того, на http://www.orionserver.com/docs/tutorials/taglibs/index.html. У него есть некоторые особенности для сервера orion, но большинство из них очень общие.

person Scott Stanchfield    schedule 04.06.2009
comment
Я знаю, как написать собственный тег. Я хотел знать, можно ли написать собственный тег, который не был бы просто начальным и конечным тегами. Оказывается, нет. - person TM.; 04.06.2009
comment
Это теги XML. Что еще будет доступно? - person Ian McLaird; 04.06.2009
comment
Вы можете создать тег контейнера, в котором есть много альтернатив (например, упомянутый выбор). Взгляните на пример LayoutManager в моем докладе, например — произвольная вложенность. - person Scott Stanchfield; 05.06.2009
comment
@Ian McLaird: Наверное, я никогда не понимал, почему они должны быть тегами XML. В конце концов, в большинстве JSP есть много вещей, из-за которых он больше не является действительным XML-файлом. Пока rmarimon не ответил на этот вопрос, я не знал, что они могут быть тегами в стиле XML. Честно говоря, я предпочитаю стиль DTL, в котором этого ограничения НЕТ. - person TM.; 11.06.2009

В стандартных библиотеках тегов есть условные теги:

<%@ 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 ...
<% } >
person Steve B.    schedule 04.06.2009
comment
Мне известны теги jstl, работают ли они с тегами inner else или elseif? Или они по-прежнему ограничены парами тегов? У меня сложилось впечатление, что они по-прежнему оставляют вас проверять условие, а затем проверять условие! для блока else. - person TM.; 04.06.2009

Я не вижу причин, по которым вы не могли бы написать собственный тег JSP, который знал бы, что нужно искать тег в его теле. Это не было бы «лучшей практикой», но это был бы довольно чистый и интуитивно понятный способ ведения дел.

person Dean J    schedule 30.11.2009