JSTL: iterate list but treat first element differently

39,860

Solution 1

It can be done even shorter, without <c:if>:

<c:forEach items="${learningEntry.samples}" var="sample" varStatus = "status">
    <table class="sampleEntry" ${status.first ? '' : 'style = "display:none"'}> 
</c:forEach> 

Solution 2

Yes, declare varStatus="stat" in the foreach element, so you can ask it if it's the first or the last. Its a variable of type LoopTagStatus.

This is the doc for LoopTagStatus: http://java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html It has more interesting properties...

<c:forEach items="${learningEntry.samples}" var="sample" varStatus="stat">
    <!-- only the first element in the set is visible: -->
    <c:if test="${stat.first}">
        <table class="sampleEntry">
    </c:if>
    <c:if test="${!stat.first}">
        <table class="sampleEntry" style="display:none">
    </c:if>

Edited: copied from axtavt

It can be done even shorter, without <c:if>:

<c:forEach items="${learningEntry.samples}" var="sample" varStatus = "status">
    <table class="sampleEntry" ${status.first ? '' : 'style = "display:none"'}> 
</c:forEach> 
Share:
39,860
D.C.
Author by

D.C.

Updated on July 15, 2022

Comments

  • D.C.
    D.C. almost 2 years

    I'm trying to process a list using jstl. I want to treat the first element of the list differently than the rest. Namely, I want only the first element to have display set to block, the rest should be hidden.

    What I have seems bloated, and does not work.

    Thanks for any help.

    <c:forEach items="${learningEntry.samples}" var="sample">
        <!-- only the first element in the set is visible: -->
        <c:if test="${learningEntry.samples[0] == sample}">
            <table class="sampleEntry">
        </c:if>
        <c:if test="${learningEntry.samples[0] != sample}">
            <table class="sampleEntry" style="display:hidden">
        </c:if>