(jstl) ForEach 문

[JSTL] forEach문 인덱스, 카운트

자바에서는 for, while, do-while을 사용하지요. Jstl에서 이와 같은 기능을 사용하려면 foreach문을 사용하면 됩니다.

Jstl forEach

간단한 예시를 보고 설명을 확인해 봅시다.

숫자를 사용하는 forEach

1
2
3
<c:forEach var = "i" begin = "1" end = "5">
Item <c:out value = "${i}"/><p>
</c:forEach>

위의 첫번째 줄을 자세하게 설명하자면

forEach 문의 변수 var = "i"를 선언한 후 그 변수i에 숫자 1부터 5까지 1씩 증가한다.

위의 실행결과는 아래와 같습니다.

1
2
3
4
5
Item 1
Item 2
Item 3
Item 4
Item 5

forEach 숫자가 증가하는 범위를 설정

만약 위의 상황에서 2씩 증가해서 숫자를 출력하고 싶으면 아래와 같이 할 수 있습니다.

1
2
3
<c:forEach var = "i" begin = "1" end = "5" step="2">
Item <c:out value = "${i}"/><p>
</c:forEach>

forEach 문의 변수 var = "i"를 선언한 후 그 변수i에 숫자 1부터 5까지 2씩 증가한다.

위의 실행결과는 아래와 같습니다.

1
2
3
Item 1
Item 3
Item 5

숫자를 역으로 출력하기

1
2
3
<c:forEach var="i" begin="10" end="0" step="-1">
//잘못된 예시 입니다.
</c:forEach>

만약 역순으로 만들고자 할때 step="-1"와 같이 사용한다면 원하지 않은 값이 출력될 것입니다.

forEach문에서의 step에는 양수만 사용되기 때문입니다. 그래서 역순으로 숫자를 출력하고자 할때는 아래와 같이 사용해야 합니다.

1
2
3
4
<c:forEach var="i" begin="0" end="10" step="1">
<c:var var="decr" value="${10-i}"/>
<p><c:out value="${decr}" /></p>
</c:forEach>

Map을 사용하여 forEach

변수 i에 숫자가 아닌 Map을 사용할때는 아래와 같이 사용할 수 있습니다.

1
2
3
<c:forEach var="movieMap" items="${movieList}">
<p><c:out value="${movieMap.title}" /></p>
</c:forEach>

<c:forEach>에서 사용되는 속성들 파헤치기

foreach문의 자세한 속성 살피기
속성 설명 필요 기본설정
items loop를 돌릴 item을 정의합니다. No None
begin 시작하는 item 숫자를 정의합니다.
(0 = first item, 1 = second item, …)
No 0
end 끝나는 item 숫자를 정의합니다.
(0 = first item, 1 = second item, …)
No Last element
step loop의 단계를 지정할 수 있습니다. 음수는 사용할 수 없습니다. No 1
var variable의 약자로 ‘forEach 안에서 사용될 변수를
선언한다’라고 이해하시면 됩니다.
No None
varStatus loop의 상태를 확인하는 변수 입니다. No None

loop를 활용한 예시는 아래와 같습니다. 테이블을 그리는데 첫번째와 마지막 부분과 중간 부분의 생김세가 다를 경우에 아래와 같이 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>

<html>
<table border="1">
<thead>
<tr>
<th colspan="3">forEach Table</th>
</tr>
</thead>
<tbody>
<c:forEach var = "i" begin = "1" end = "5" varStatus="loop">
<c:if test="${loop.first }">
<tr>
<td>FIRST Loop</td>
<td>Item<c:out value = "${i}"/><p></td>
<td>시작</td>
</tr>
</c:if>
<c:if test="${!loop.first}">
<c:if test="${!loop.last}">
<tr>
<td colspan="3">Item<c:out value = "${i}"/><p></td>
</tr>
</c:if>
<c:if test="${loop.last}">
<tr>
<td>LAST Loop</td>
<td>Item<c:out value = "${i}"/><p></td>
<td>끝</td>
</tr>
</c:if>
</c:if>
</c:forEach>
</tbody>
</table>
<html>

결과는 아래와 같습니다.

지금 상황에서는 인덱스(1, 2, 3, 4, 5)를 출력할때 var의 값으로도 출력할 수 있지만, varStatus를 활용해서 인덱스를 생성할 수 있습니다.

1
2
3
4
5
6
7
8
9
<c:forEach var = "i" begin = "1" end = "5" varStatus="loop">
<c:out value = "${loop.count}"/><p>
</c:forEach>
//위의 결과는 12345로 출력됩니다.

<c:forEach var = "i" begin = "1" end = "5" varStatus="loop">
<c:out value = "${loop.index}"/><p>
</c:forEach>
//index의 결과는 01234로 출력됩니다.

위에 결과를 보듯이 인덱스는 제로 베이스고, 카운트는 1부터 시작되는 것을 확인할 수 있습니다.

정리하자면 아래와 같습니다.

- status.index : 0부터 시작하는 루프의 인덱스 입니다. (0에서 시작한다해서 제로 베이스라고 합니다.)

- status.count : 현재 몇번째 루프인지 값입니다. 1부터 시작합니다.

그외에도 사용되는 status는 아래와 같습니다.

- status.first : 현재가 첫번째 루프이면 참입니다.

- status.last : 현재가 마지막 루프이면 참입니다.

- status.begin : forEach문 시작시에 사용된 begin 값이 나옵니다.

- status.end : forEach문 시작시에 사용된 end 값이 나옵니다.

- status.step : forEach문 시작시에 사용된 step 값이 나옵니다.


Reference

Share