Как сделать "вложенным" в JSTL для Java JSP?

Я хочу сделать что-то вроде следующего:

<c:choose>
    <c:when test="${empty example1}">
    </c:when>
    <c:otherwise>
        <c:when test="${empty example2}">
        </c:when>
        <c:otherwise>
        </c:otherwise>              
    </c:otherwise>
</c:choose>

Возможно ли это? Я получаю исключение, возникшее при попытке выполнить.

Спасибо.

Ответ 1

Вам нужно сделать это больше:

<c:choose>
    <c:when test="${empty example1}"> 
        <!-- do stuff -->
    </c:when> 
    <c:otherwise> 
        <c:choose>
            <c:when test="${empty example2}"> 
                <!-- do different stuff -->
            </c:when> 
            <c:otherwise> 
                <!-- do default stuff -->
            </c:otherwise>
        </c:choose>
    </c:otherwise> 
</c:choose>

Показанная здесь многословие является хорошим примером того, почему XML - плохой язык для реализации многоуровневых условных операторов.

Ответ 2

Вы можете использовать несколько <c:when> в <c:choose>.

<c:choose>
    <c:when test="${empty example1}">
    </c:when>
    <c:when test="${empty example2}">
    </c:when>
    <c:otherwise>
    </c:otherwise>              
</c:choose>

Ответ 3

Я согласен с @BalusC - вы можете упростить утверждение. Помните, что операторы c:when являются взаимоисключающими, например if-else if blocks.

JSTL 1.2 spec утверждает, что c:choose должен быть родителем хотя бы одного оператора c:when, а c:when должен всегда предшествует по крайней мере одному оператору c:otherwise с тем же непосредственным родителем. По сути, это также означает, что каждый c:when должен иметь c:otherwise, следуя за ним внутри c:choose, а a c:choose должен окружать любой c:when + c:otherwise. Из того, что я вижу, спецификация не относится к вложенным элементам c:choose, поэтому я не знаю, работает ли она, но я не думаю, что вы когда-нибудь будете вынуждены вставлять их.