<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="cr" uri="http://java.sun.com/jsp/jstl/core"%>
<%
//String data[] = new String[] {"hong","kim","park"};
//request.setAttribute("data", data);
ArrayList <String> data = new ArrayList();
data.add("a");
data.add("b");
data.add("c");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL 기초 문법3 (반복문 - foreach)</title>
</head>
<body>
<table border="1">
<tr>
<!--
forEach : JSTL 유일하게 배열 및 반복문으로 사용하는 속성
var : 변수
begin : 시작값
end : 종료값
-->
<%--
forEach 기본 형태
<cr:forEach var="z" begin="1" end="5">
<td>${z}</td>
</cr:forEach>
--%>
<%--
items : 배열값을 받는 속성
${data} setAttribute의 값
<%=data%> : jsp 변수명
배열값을 사용하여 출력하는 역할
begin = "0" 으로 시작!
end 범위 더 크게 잡아도 에러 안남! 오 놀라워라
--%>
<cr:forEach var="z" items="<%=data%>" begin="0" end="5">
<cr:if test="${z !='b' }">
<td>${z}</td>
</cr:if>
</cr:forEach>
<%--
setAttribute로 가져온 경우
<cr:forEach var="z" items="${data}">
<td>${z}</td>
</cr:forEach>
--%>
</tr>
</table>
</body>
</html>
[기본적인 forEach 사용법]
<cr:forEach var="z" begin="1" end="5">
<td>${z}</td>
</cr:forEach>
- var : 반복 변수
- begin : 시작 값
- end : 종료 값
위 코드는 1부터 5까지 반복하며 <td> 태그 안에 숫자를 출력함
1. 배열 사용하기
JSTL의 forEach는 배열을 직접 반복할 수 있음
<%-- 배열을 request.setAttribute로 전달한 경우 --%>
<cr:forEach var="z" items="${data}">
<td>${z}</td>
</cr:forEach>
2. JSP 변수(ArrayList) 사용하기
JSTL에서 JSP의 ArrayList를 직접 사용할 수도 있음
<%@page import="java.util.ArrayList"%>
<%
ArrayList<String> data = new ArrayList<>();
data.add("a");
data.add("b");
data.add("c");
%>
<cr:forEach var="z" items="<%=data%>">
<td>${z}</td>
</cr:forEach>
- items 속성에 <%=data%> 를 넣으면 JSP의 ArrayList 데이터를 반복 처리할 수 있음
3. 특정 값 제외하기
반복문을 돌면서 특정 값을 제외하려면 cr:if와 함께 사용하면 됨
<cr:forEach var="z" items="<%=data%>">
<cr:if test="${z ne 'b'}">
<td>${z}</td>
</cr:if>
</cr:forEach>
위 코드는 리스트의 값 중 "b"를 제외하고 출력함
정리
- JSTL의 forEach는 반복문을 처리하는 유일한 태그임
- 기본적으로 begin, end 속성을 사용해 숫자 반복 가능함
- 배열이나 ArrayList와 같은 컬렉션을 직접 사용할 수 있음
- cr:if와 함께 사용하여 특정 값을 제외할 수도 있음
[2차 배열]
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="cr" uri="http://java.sun.com/jsp/jstl/core"%>
<%-- JSTL은 배열을 만드는 애가 없음 => JSP 이용 --%>
<%
String member[][] ={
{"홍길동","강감찬","유관순"},
{"A형","B형","O형"},
{"24","43","15"}
};
ArrayList<ArrayList<String>> all = new ArrayList();
ArrayList<String> data = new ArrayList();
data.add("에어프라이어");
data.add("냉장고");
data.add("에어컨");
all.add(data);
ArrayList<String> data2 = new ArrayList();
data2.add("250000");
data2.add("350000");
data2.add("450000");
all.add(data2);
//out.print(all);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL 기초 문법4 - (2차 반복문)</title>
</head>
<body>
<%-- v
arStatus : 배열번호 0~ => 이름.index
--%>
<cr:set var="bb" value="<%=member[2]%>"></cr:set>
<cr:set var="aa" value="<%=member[1]%>"></cr:set> <%-- 각 배열의 그룹번호 --%>
<cr:forEach var="cc" items="<%=member[0]%>" varStatus="no">
고객명 : ${cc}, 혈액형 : ${aa[no.index]}, 나이 : ${bb[no.index]}<br>
</cr:forEach>
<br><br><br>
<!-- Class 배열에 JSTL 출력 -->
<!-- 가격 데이터 전체 -->
<cr:set var="dd" value="<%=all.get(1)%>"/>
<cr:forEach var="ee" items="<%=all.get(0)%>" varStatus="no">
번호 : ${no.index + 1} , 제품명 : ${ee}, 가격 : ${dd.get(no.index)} 원 <br>
</cr:forEach>
</body>
</html>
1. JSP에서 2차원 배열 생성
JSTL은 배열을 생성하는 기능이 없기 때문에 JSP 코드에서 배열을 선언하여 활용해야 함
String member[][] ={
{"홍길동","강감찬","유관순"},
{"A형","B형","O형"},
{"24","43","15"}
};
- member[0] : 고객명 목록
- member[1] : 혈액형 목록
- member[2] : 나이 목록
2. cr:set을 이용한 배열 저장
<cr:set var="bb" value="<%=member[2]%>"></cr:set>
<cr:set var="aa" value="<%=member[1]%>"></cr:set>
JSTL에서 배열을 직접 다루는 것이 어려우므로 JSP 배열을 cr:set을 통해 JSTL 변수에 저장한 후 사용함
3. cr:forEach를 이용한 반복문 처리
<cr:forEach var="cc" items="<%=member[0]%>" varStatus="no">
고객명 : ${cc}, 혈액형 : ${aa[no.index]}, 나이 : ${bb[no.index]}<br>
</cr:forEach>
- items 속성에 member[0](고객명 리스트)를 전달하여 반복 실행
- varStatus="no"를 사용하여 반복문의 현재 인덱스를 추적 가능
- aa[no.index]와 bb[no.index]를 활용하여 해당 고객의 혈액형과 나이를 출력
3. 2차 클래스 배열 반복문 처리
<cr:set var="dd" value="<%=all.get(1)%>"/>
<cr:forEach var="ee" items="<%=all.get(0)%>" varStatus="no">
번호 : ${no.index + 1} , 제품명 : ${ee}, 가격 : ${dd.get(no.index)} 원 <br>
</cr:forEach>
- <cr:set var="dd" value="<%=all.get(1)%>"/>
- all.get(1) (가격 리스트) 를 dd 변수에 저장
- <cr:forEach>를 이용하여 제품명 리스트를 반복 처리
- items="<%=all.get(0)%>" : 제품명 리스트(all.get(0))를 반복문 대상으로 설정
- var="ee" : 제품명 개별 데이터를 ee 변수로 저장
- varStatus="no" : 반복문의 현재 index 값을 no.index로 활용 가능
- ${dd.get(no.index)} : 현재 반복문의 index에 해당하는 가격 데이터를 가져옴
정리
- JSTL은 배열을 직접 생성할 수 없기 때문에 JSP에서 배열을 생성 후 cr:forEach를 활용해야 함
- varStatus="no"를 활용하면 반복문의 현재 인덱스를 가져와 2차원 배열의 값을 참조할 수 있음
- 각 배열 값을 cr:set을 이용해 JSTL 변수에 저장한 후 사용하는 것이 편리함