[국비학원 기록/JSP] 커스텀 태그 JSTL 조건문, 반복문 - <c:set>, <c:if>, <c:forEach>
my code archive
반응형
커스텀 태그(Custom Tag)

jsp의 목적은 자바 코드를 최소한으로 줄이기 위함!

but, 액션 태그, 표현 언어 <%= =%>를 사용해도 조건식, 반복문 등은 커버할 수 없기 때문에

조건문, 반복문 등의 자바 코드를 제거하기 위해 사용

 

1. 커스텀 태그 종류

1)개발자가 만든 커스텀 태그

-스프링 프레임워크에서 미리 만들어서 제공

 

2)JSTL(JSP Standard Tag Library)

-라이브러리 설치 필요

- 다운로드 링크 : https://tomcat.apache.org/download-taglibs.cgi

taglibs-standard-compat-1.2.5.jar
0.05MB
taglibs-standard-jstlel-1.2.5.jar
0.16MB
taglibs-standard-impl-1.2.5.jar
0.20MB
taglibs-standard-spec-1.2.5.jar
0.04MB

 

2. 표준 태그 라이브러리

-가장 많이 사용되는 태그를 표준화하여 라이브러리로 제공

 

-Core 태그 : 변수 선언, 조건문/반복문, URL 처리

-Formatting 태그 : 숫자,날짜,시간 포맷 지정
-XML 태그 : XML 파싱
-Function 태그 : Collection 처리,문자열 처리
-SQL 태그 : DB 연결 및 쿼리 실행

 

3. Core 태그 라이브러리

 

1)사용 전 반드시 jsp 파일 상단에 tablib 디렉티브 태그 선언 필요!!

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

 

2) 프로젝트 -- WEB-INF -- lib 안에 다운받은 jar 파일 넣어서 사용

3) 종류 : <c:set>, <c:remove>, <c:if>, <c:choose>, <c:forEach>, <c:forTokens>, <c:import>, <c:redirect>, <c:url>, <c:out>, <c:catch>

 

-<c:set> 형식

 -<c:set var="변수 이름" value="변수값" scope=""/>
 -<c:set> 태그로 빈 속성 이름 줄여서 사용할 수 있음.
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
40
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- core 태그 라이브러리를 사용하기 위해서 반드시 선언해야 한다. -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
    request.setCharacterEncoding("utf-8");
%>
 
<c:set var="id" value="ezen600" scope="page"/>
<c:set var="pwd" value="0311" scope="page"/>
<c:set var="name" value="${'이순신' }" scope="page"/>
<c:set var="age" value="${30 }" scope="page"/>
<c:set var="height" value="${180 }" scope="page"/>
 
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>회원 정보 출력<title>
</head>
<body>
    <table border="1" align="center">
        <tr align="center" bgcolor="#99ccff">
            <td width="7%"><b>아이디</b></td>                <!-- EL로 변수에 바로 접근하여 값 출력 -->
            <td width="7%"><b>비밀번호</b></td>
            <td width="7%"><b>이름</b></td>
            <td width="7%"><b>나이</b></td>
            <td width="7%"><b></b></td>
        </tr>
        <tr align="center">
            <td>${id }</td>
            <td>${pwd }</td>
            <td>${name }</td>
            <td>${age }</td>
            <td>${height }</td>
        </tr>
    </table>
</body>
</html>
cs

 

-<c:if> 형식

-<c:if test="${조건식}" var="변수 이름(조건식의 결과값을 저장)" scope=""/>
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
40
41
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Insert title here</title>
</head>
<body>
    <c:set var="number" value="100"/>
    <c:set var="string" value="JSP"/>
    
    <c:if test="${number mod 2 eq 0 }">
        ${number } 짝수입니다.
    </c:if>
    <c:if test="${string eq 'JAVA' }" var="result">
        문자열은 JAVA입니다.<br>
    </c:if>
    <c:if test="${not result }">
        'JAVA'가 아닙니다.<br>
    </c:if>
    
    <h4>조건식 주의사항</h4>
    <c:if test="100" var="result2">
        EL이 아닌 정수를 지정하면 false
    </c:if>
    result2 : ${result2 }<br>
    
    <c:if test="tRuE" var="result3">
        대소문자 구분없이 "tRuE"인 경우 true<br>
    </c:if>
    result3 : ${result3 }<br>
    
    <c:if test="${ true  }" var="result4">
        EL 양쪽에 빈 공백이 있는 경우 true<br>
    </c:if>
    result4 : ${result4 }<br>
</body>
</html>
cs
<c:if test="${string eq 'JAVA' }" var="result">
문자열은 JAVA입니다.<br>
</c:if>

--> <c:set>에서 string을 JSP로 선언했기 때문에 JSP == JAVA 는 false이기 때문에 출력되지 않음!
      대소문자는 상관없다.

 

-<c:choose> 형식 (switch문 기능)

-<c:choose>
    <c:when test="조건식1">본문 내용1</c:when>
    <c:when test="조건식2">본문 내용2</c:when>
    <c:otherwise>본문 내용n</c:otherwise>
</c:choose>
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=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>choose / when / otherwise</title>
</head>
<body>
    <h4>국,영,수 점수를 입력하면 평균 구해 학점을 출력하시오.</h4>
    <form action="#">
        국어 : <input type="text" name="kor"><br>
        수학 : <input type="text" name="math"><br>
        영어 : <input type="text" name="eng"><br>
        <input type="submit" value="학점 구하기">
    </form>
    <!-- 모든 과목 점수가 입력되었는지 체크 -->
    <c:if test="${ not (empty param.kor or empty param.eng or empty param.math)}">
        <!-- 평균 계산 -->
        <c:set var="avg" value="${(param.kor + param.eng + param.math) / 3 }"/>
        평균 점수는 ${avg }이고,
        <!-- 학점 출력 -->
        <c:choose>
            <c:when test="${avg >=90 }">A학점</c:when>
            <c:when test="${avg >=80 }">B학점</c:when>
            <c:when test="${avg >=70 }">C학점</c:when>
            <c:when test="${avg >=60 }">D학점</c:when>
            <c:otherwise>F학점</c:otherwise>
        </c:choose>
        입니다.
    </c:if>
</body>
</html>
cs

-<c:forEach> 형식

<c:forEach var="반복할 변수 이름"
               items="반복할 객체 이름"
               begin="반복 시작값"
              end="반복 마지막값"
              step="한번 반복할 때마다 반복 변수를 증가(시킬)값"
              varStatus="반복 상태 변수 이름(속성)">
 </c:forEach>
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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JSTL - forEach</title>
</head>
<body>
    <h4>일반 for문 형태의 forEach 태그</h4>
    <c:forEach begin="1" end="3" step="1" var="i">
        <p>반복 ${i }입니다.</p>
    </c:forEach>
    
    <h4>varStatus 속성 확인하기</h4>
    <table border="1">
        <c:forEach begin="3" end="5" var="i" varStatus="loop">
            <tr>
                <td>count : ${loop.count }</td>
                <td>index : ${loop.index }</td>
                <td>current : ${loop.current }</td>
                <td>first : ${loop.first }</td>
                <td>last : ${loop.last }</td>
            </tr>
        </c:forEach>
    </table>
    
    <h4>1에서 100까지 정수 중 홀수의 합</h4>
    <c:forEach begin="1" end="100" var="i">
        <c:if test="${i mod 2 eq 1 }">
            <c:set var="sum" value="${sum + i}"/>
        </c:if>
    </c:forEach>
        1~100사이의 정수 중 홀수의 합은? ${sum }
</body>
</html>
cs

varStatus 속성
-index : items에서 정의한 항목을 가리키는 index 번호임 (0부터 시작)
-count : 몇 번째 반복인지 나타냄(1부터 시작)
-first : 첫 번째 반복 나타냄
-last : 마지막 반복 나타냄
-current : var에 지정된 현재 변수값 (예 : 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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JSTL - forEach</title>
</head>
<body>
    <h4>향상된 for문 형태의 forEach 태그</h4>
    <%
        String[] rgba = {"Red", "Green", "Blue", "Black"};
    %>
    <c:forEach items="<%=rgba %>" var="c">
        <span style="color: ${c};">${c }</span>
    </c:forEach>
    
    <h4>varStatus 속성 확인</h4>
    <table border="1">
        <c:forEach items="<%=rgba %>" var="c" varStatus="loop">
        <tr>
            <td>count : ${loop.count }</td>
            <td>index : ${loop.index }</td>
            <td>current : ${loop.current }</td>
            <td>first : ${loop.first }</td>
            <td>last : ${loop.last }</td>
        </tr>
        </c:forEach>
 
    </table>
</body>
</html>
cs

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형