티스토리 뷰

Web/JSP

[JSTL] <c:forEach> 태그

쩨리쩨리 2018. 5. 4. 19:49
반응형

* <c:forEach> 태그

 

- forEach 태그는 배열, Collection 또는 Map에 저장되어 있는 값들을 순차적으로 처리할 때 사용한다.

- java의 do-while 등을 대신해서 사용할 수 있다.

- DB에서 리스트등을 가져와 순차적으로 출력하는 등 기존의 forEach문과 동일한 역할을 수행한다.

 

 

 

* forEach 태그의 기본 형태

1
2
3
4
5
6
<c:forEach var="item" items="${list}" begin=0 end=5 step=1 varStatus="status">
    번호 : ${status.count}
    이름 : ${item.name}
    나이 : ${item.age}
    주소 : ${item.addr}
</c:forEach>
cs

 

 

 

 

 

* forEach 태그 항목 속성 설명

 

항목 속성

 설명

비고 

 var

사용할 변수명 

필수 항목 

 items

 Collection 객체 (List, ArrayList, Map 등)

 

 begin

 시작 index, 정의되지 않을 경우 디폴트 0

 

 end

 종료 index, 정의되지 않을 경우 디폴트 items 크기 -1

 

 step

 반복할 때 이동할 index 갯수

 

 varStatus

 반복상태를 알 수 있는 변수

 

 

 

 


 

 

* varStatus

- varStatus 속성은 루프 정보를 담는 객체를 저장할 변수명을 값으로 갖는다.

- <c:forEach> 태그 몸체에서는 varStatus 속성에 명시한 변수를 이용해서 현재 처리 중인 인덱스, begin 속성값, end 속성값 등을 구할 수 있다.

- varStatus 속성에 명시한 변수가 제공하는 프로퍼티는 다음과 같다.

 

리턴

설명

index

int

루프 실행에서 현재 인덱스, 즉 items에 정의한 항목을 가리키는 인덱스 번호, 0부터 시작

count

int

루프 실행 횟수, 반복을 몇번 할 것인지 나타냄, 1부터 시작

first

boolean

현재 실행이 첫번째 실행인 경우 true를 반환

last

boolean

현재 실행이 루프의 마지막 실행인 경우 true를 반환

current

object

컬렉션 중 현재 루프에서 사용할 객체

 

 

 


 

 

* 아래 코드를 보고 forEach를 이해해보자

- post.jsp 에서는 list에 있는 값들을 Eltest라는 java 문서에서 값을 가져온다.

- Eltest.java에는 배열에 있는 값들과 num1, num2의 값들을 가지고 있다.

- 이 배열과 num들은 get 함수를 이용해서도 호출가능하다.

 

 

문제 1. postjsp에서 리스트를 만들고 리스트 값들을 Eltest.java에서 불러와 호출해보자. (단, El문을 사용하자) 그 후, sel.jsp에 post 방식을 써서 값들을 전달해보자.

문제 2. sel.jsp에서 Eltest.java에 있는 num1, num2의 값을 가져오고, num1과 num2를 더한 값을 출력해보자.

 

 

- el 문을 쓰기 위해선 반드시 el 임포트를 해줘야한다. el 문을 쓰는 jsp 페이지에 아래의 코드를 추가한 뒤 문제를 풀어보자.

1
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
cs

 

 

 

 

 

- Eltest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package el.test;
 
public class Eltest {
    //데이터를 관리하는 class
 
    private String[] productList = {"test1","test2","test3","test4","test5"};
    private int num1 =30;
    private int num2=50;
    
    public String[] getProductList() {
        return productList;
    }
    
    public int getNum1() {
        return num1;
    }
    
    public int getNum2() {
        return num2;
    }
    
}
cs

 

 

 

 

- post.jsp

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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" co0ntent="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 
<form name="form1" method="POST" action="sel.jsp">
        <jsp:useBean id="eltest" class="el.test.Eltest" scope="session" />
        //useBean을 쓰는 이유: useBean은 jsp문서에서 자바빈 프로퍼티에 접근하려 사용
        //자바빈이란 데이터를 관리하는 클래스를 말함 
        //자바빈 클래스 경로를 적고, 그 경로로 이동할 수 있는 useBean 객체를 설정
        //자바빈 데이터를 공유할 수 있는 스코프 영역을 설정
        //스코프 영역이 session이니 session이 끊어지지 않는한 데이터 공유가능
        //즉 eltest 객체는 session이 끊어질때까지 jsp 문서에서 다 
        <select name="sel">
            <c:forEach var="item" items="${eltest.getProductList()}" begin="0" end="5" step="1">
                <option>${item}</option>
            </c:forEach>
        </select>
        <input type="submit" value="선택" />
    </form>
    
<%-- <% forEach와 같은 결과를 나타내는 for문
for(String item:eltest.getProductList()){
    out.println("<option>"+item+"</option>");
}
%> --%>
 
</body>
</html>
cs

 

 

 

- sel.jsp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<!-- el문으로 값을 받아오려면 param을 써서 받아와야함-->
        선택한 값 : ${param.sel }
<!-- eltest는 session 영역이므로 <jsp:usebean id=eltest> 코드 직접 작성 안해줘도 사용가능 -->
    <br> num1 : ${eltest.num1 } &nbsp ${eltest.getNum1()}
    <br> num2 : ${eltest.num2 } &nbsp ${eltest.getNum2()}
    <br> num1 + num2 : ${eltest.num1+eltest.num2 }
 
</body>
</html>
cs

 

 

 

 

 

- 실행 결과

 

1. 리스트에서 옵션을 선택한뒤 선택을 누른다.

  

 

2. 선택을 누르면 출력되는 화면

 

 

 


 

* 풀이

1. forEach의 변수 item을 만든후,  그 forEach가 어디에 있는 값들을 가져와 일을 수행할 것인지 정해준다.

2. forEach는 Eltest.java에 있는 배열 값들을 하나씩 가져와 출력 해야하므로 el.test.Eltest 클래스에 접근할 수 있는 eltest 라는 uesBean 객체를 이용하여 접근한다.

3. 받아온 배열 값들은 하나씩 select의 option에 넣는다.

4. post 방식으로 sel.jsp 에 보내면 내가 선택한 list 값과 Eltest.java에서 가져온 num1, num2 의 값을 받아올수 있다.

 

 

반응형
댓글
공지사항