티스토리 뷰
JSTL에서 forEach와 forTokens을 실제 사용하다 보면 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값을 넣으시면 되겠죠.
forEach와 forTokens에 사용할 수 있는 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>
생각해 보면 이 밖에 응용할 수 있는 경우가 많이 있을 겁니다.
도움이 되셨기를... 그럼 즐프되세요. ^^