본문 바로가기

Programming/Java/JSP

JSTL에서 forEach, forTokens 실전 사용(varStatus )


JSTL에서 forEachforTokens을 실제 사용하다 보면 JSTL만으론 해결이 안 될 거 같은 상황이 있는데요. JSTL 책을 읽다 보니 몇몇 상황에서는 JSTL만으로 쓸 수 있도록 한 게 있어 간단히 정리해 올려 봅니다.

목록(Collection) 중에 일부에 대해서만 어떤 처리를 하고 싶을 때가 있습니다. 예를 들면, 앞에 5개까지만 출력한다 라든지 짝수번째만 출력한다든지요. 이럴 경우는 다음 Attribute를 이용하면 됩니다.

    * begin: 반복에 사용될 것 중 첫번째 항목의 Index. 0부터 시작한다. 정의되지 않으면 0.
    * end: 반복에 사용될 것 중 마지막 항목의 Index. 정의되지 않으면 목록의 갯수에서 1개 뺀 값이겠죠.
    * step: 반복할 때마다 건너 뛸 index 갯수. for 문의 i 값에 더해지는 것과 같은 개념입니다. 기본은 1 입니다.

예를 들어 목록 앞에 5개만 출력한다면 다음과 같이 하시면 됩니다.

<ul>
<c:forEach var="studentName" items="list" end="4">
    <li>${studentName }</li>
</c:forEach>
</ul>

같은 식으로 5번째부터 끝까지 출력하시려면 begin에 4값을 넣으시면 되겠죠.


forEachforTokens에 사용할 수 있는 Attribute 중에 varStatus 라는 게 있습니다. 이게 현재 루핑 상황 정보를 얻을 수 있는 건데요. 여기에 미리 정의된 변수로 다음 4가지 값을 접근할 수 있습니다.

    * index: 숫자값으로 items 에 정의한 목록(Collection)의 항목을 가리키는 Index입니다. 0부터 시작하겠죠.
    * count: 숫자값입니다. 루핑을 돌 때 현재 몇 번째 반복인지를 나타냅니다. 1부터 시작합니다.
    * first:  boolean 값입니다. 현재 반복이 첫번째인지 여부를 나타냅니다.
    * last: boolean 값입니다. 현재 반복이 마지막인지 여부를 나타냅니다.

여기서 index와 count의 차이가 시작값이 0이냐, 1이냐 밖에 없다고 생각하기 쉬운데, 그렇지 않습니다. 앞 쪽 예처럼 begin을 4로 하게 되면 index는 4, 5, 6, 7, ... 로 나가지만 count는 여전히 1, 2, 3, 4가 됩니다. 혹는 step 값을 2로 주면 index 값이 0, 2, 4, 6, ... 이 되지만 여전히 count는 1, 2, 3, 4가 됩니다.

위 변수를 가지고 사용할 수 있는 가장 흔한 경우가 각 항목 사이에 무언가를 넣어야 할 때 입니다. 예를 들어, 목록 사이에 컴마(,)를 넣는 경우말이죠. list 에 성명 목록이 들어 있고 그 사이에 컴마를 넣고 싶다면, 다음과 같이 하면 됩니다.

<c:forEach var="studentName" items="list" varStatus="status">
    ${studentName }<c:if test="${not status.last }">, </c:if>
</c:forEach>

혹은, 목록 중 첫번째만 강조를 하고자 한다면 다음과 같이 하면 되겠죠.

<ul>
<c:forEach var="studentName" items="list" varStatus="status">
    <c:if test="${status.first }"><li><strong>${studentName }</strong></li></c:if>
    <c:if test="${not status.first }"><li>${studentName }</li></c:if>
</c:forEach>
</ul>

지금 생각해 보니 앞뒤로 감싸는 태그를 목록이 없으면 아예 안 나오도록 하려면 다음처럼 해도 되겠네요.

<c:forEach var="studentName" items="list" varStatus="status">
    <c:if test="${status.first }"><ul></c:if>
    <li>${studentName }</li>
    <c:if test="${status.last }"></ul></c:if>
</c:forEach>

생각해 보면 이 밖에 응용할 수 있는 경우가 많이 있을 겁니다.

도움이 되셨기를... 그럼 즐프되세요. ^^