본문으로 바로가기

[JSP/JSTL] JSTL(core) 활용 하기 : for문/확장 for문

category Servlet&JSP 2020. 1. 22. 00:08

for문


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- JSTL core 라이브러리를 c 라는 접두어로 사용할 준비하기 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/jstl/test01.jsp</title>
</head>
<body>
<h3>JSTL (Java Standard Tag Library) 사용하기 </h3>
<c:forEach var="i" begin="1" end="5">
    <p>${i }</p>
</c:forEach>
</body>
</html>
cs

4행 : taglib 지시자로 core 라이브러리를 사용할 것이라고 선언한다.

13-15행 : java의 반복문과 동일한 역할을 한다.

for(var i=1; i<=5; i++){ }  begin속성에는 시작할 data, end에는 마지막으로 출력할  data를 작성한다.

출력 결과

 

 

확장 for문


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
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
    // Model (data)
    List<String> names=new ArrayList<>();
    names.add("김구라");
    names.add("해골");
    names.add("원숭이");
    //request 영역에 담기
    request.setAttribute("names", names);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/jstl/test02.jsp</title>
</head>
<body>
<h3>forEach  활용</h3>
<h4>친구 목록 입니다.</h4>
<ul>
    <c:forEach var="tmp" items="${requestScope.names }">
        <li>${tmp }</li>
    </c:forEach>
</ul>
</body>
</html>
cs

4-10행 : Servlet 에 있는 내용이라고 가정하자. list 객체를 생성해 names 변수에 담고, "김구라, 해골, 원숭이"를 가변배열에 담았다. request 객체를 이용해 "names"라는 key값으로 names 가변배열 객체의 참조값을 value에 저장했다. 이에 대한 응답은 JSP페이지에서 한다.

 

22-24 행 : names 가변배열에 담겨있는 "김구라, 해골, 원숭이"를 JSP 페이지에서 반복문을 돌면서 출력한다.

for(String tmp:names){ }의 확장 for문과 동일하게 동작한다. items 속성 값으로는 request객체에 담겨 있는 key값을 이용해 value값을 불러온다.

 

 

 

 

[예시]

List<CafeDto> list=CafeDao.getInstance().getList(dto);

에서 배열의 방에 저장되어있는 dto 객체들을 불러와서 필드에 담겨있는 내용을 반복문 돌면서 출력하고자 한다.

기존에는 jsp 페이지에서는 아래와 같이 코드를 작성해주어야했다.

이것을 EL과 JSTL 라이브러리를 사용해서 간단한 코드로 바꿔보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        <tbody>
        <%for(CafeDto tmp:list){ %>
            <tr>
                <td><%=tmp.getNum() %></td>
                <td><%=tmp.getWriter() %></td>
                <td>
                    <a href="detail.jsp?num=<%=tmp.getNum() %>">
                        <%=tmp.getTitle() %>
                    </a>
                </td>
                <td><%=tmp.getViewCount() %></td>
                <td><%=tmp.getRegdate() %></td>
            </tr>
        <%} %>
        </tbody>
cs

[ EL과 JSTL 라이브러리 사용해서 변경한 코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        <tbody>
            <c:forEach var="tmp" items="${requestScope.list }">
                <tr>
                    <td>${tmp.num }</td>
                    <td>${tmp.writer }</td>
                    <td>
                        <a href="detail.jsp?num=${tmp.num }">
                            ${tmp.title }
                        </a>                
                    </td>
                    <td>${tmp.viewCount }</td>
                    <td>${tmp.regdate }</td>
                </tr>
            </c:forEach>
        </tbody>
cs

dto 객체의 필드 값을 참조하고 싶다면 ${변수명.필드명 }을 작성해주면 된다.

 

 

 

 

 

 

for문 varStatus 속성


varStatus="status" 속성과 값을 사용 하면 index, 배열안의 data 개수 및 순서, boolean 등 다양한 값을 받아 볼 수 있다.

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
37
38
39
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
    // Model (data)
    List<String> names=new ArrayList<>();
    names.add("김구라");
    names.add("해골");
    names.add("원숭이");
    //request 영역에 담기
    request.setAttribute("names", names);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/jstl/test02.jsp</title>
</head>
<body>
<h3>forEach  활용</h3>
<h4>친구 목록 입니다.</h4>
<ul>
    <c:forEach var="tmp" items="${requestScope.names }" 
        varStatus="status">
        <li>
            <%-- index 값을 알 수 있다. --%>
            status.index : <strong>${status.index }</strong>
            <%-- 순서 혹은 갯수를 알고 싶은 경우 --%>
            status.count : <strong>${status.count}</strong>
            <%-- 배열의 가장 첫번째 값을 알고 싶은 경우 --%>
            status.first : <strong>${status.first }</strong>
            <%-- 배열의 가장 마지막번째 값을 알고 싶은 경우 --%>
            status.last : <strong>${status.last }</strong>
            ${tmp }
        </li>
    </c:forEach>
</ul>
</body>
</html>
cs

[예시]

배열에 kim, lee, park, jung을 넣고, kim | lee | park | jung 모양으로 출력해보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<h3>kim | lee | park | jung 으로 출력하기</h3>
<ul class="one">
    <c:forEach var="tmp" items="${requestScope.lastNames }" varStatus="status">
        <c:choose>
            <c:when test="${status.last }">
                <li>
                    ${tmp }
                </li>
            </c:when>
            <c:otherwise>
                <li>
                  ${tmp } |
                </li>
            </c:otherwise>
        </c:choose>
    </c:forEach>
</ul>
cs

kim, lee, park 을 출력할때는 | 를 함께 출력하고 배열안의 마지막 data인 jung을 출력할때는 | 를 출력하지 않으면 된다.

if~else 문과 EL을 사용해서 ${status.last }가 true가 되면 ${tmp }를 출력하고 ${tmp } | 를 출력하면 된다.