자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 33. JSP 표준 태그 라이브러리(JSTL) - JSTL이란, JSTL 사용 설정, 코어(Core) 태그

개발학생 2025. 4. 22. 15:15
반응형

1. JSTL(JSP Standard Tag Library)이란

  • JSP에서 자주 사용하는 조건문/반복문 등을 처리해주는 태그를 모아 표준으로 만들어 놓은 라이브러리
  • 스크립틀릿 없이 태그만으로 작성 가능하므로, 코드가 간결해지고 읽기 편해짐
  • JSP로 구현하면 HTML 태그 사이에 스크립틀릿과 표현식이 삽입되어 코드가 복잡해지고 가독성이 떨어지는 반면,
  • JSTL로 구현하면 HTML 태그와 비슷한 태그를 사용하므로 코드가 일관되고 가독성도 좋음(+EL과 함께 사용 가능)
// JSP로 표현한 구구단
<table border="1">
  <% for (int dan = 2; dan <= 9; dan++) {%>
  <tr>
    <% for (int su = 1; su <= 9; su++) {%>
    <td>
      <%=dan%> & <%=su%> = <%=dan * su%>
    </td>
    <%}%>
  </tr>
  <%}%>
</table>
// JSTL로 표현한 구구단
<table border="1">
  <c:forEach begin="2" end="9" var="dan">
  <tr>
    <c:forEach begin="1" end="9" var="su">
    <td>
      ${dan} * ${su} = ${dan * su}
    </td>
    </c:forEach>
  </tr>
  </c:forEach>
</table>
  • 총 5종류의 태그 제공
    • Core, Formatting, XML 태그만 자주 사용
    • JSTL을 사용하려는 JSP 파일에서는 taglib 지시어를 추가해야 하는데, 이때 접두어와 URI가 사용됨
종류 기능 접두어 URI
Core 태그 변수 선언, 조건문/반복문, URL 처리 c http://java.sun.com/jsp/jstl/core
Formatting 태그 숫자, 날짜, 시간 포맷 지정 fmt http://java.sun.com/jsp/jstl/fmt
XML 태그 XML 파싱 x http://java.sun.com/jsp/jstl/xml
Function 태그 컬렉션, 문자열 처리 fn http://java.sun.com/jsp/jstl/functions
SQL 태그 데이터베이스 연결 및 쿼리 실행 sql http://java.sun.com/jsp/jstl/sql

2. JSTL 사용 설정

  • JSP의 기본 태그가 아닌 확장 태그이므로, 사용하기 위해서는 별도의 라이브러리 필요
  • → 라이브러리 다운 후, JSTL을 사용할 수 있는 환경을 갖춰야 함

1) 다음 URL에 접속하기

https://mvnrepository.com/artifact/javax.servlet/jstl/1.2

2) [jar] 링크를 클릭하여 jstl-1.2.jar 파일 다운로드

3) 받은 jar 파일을 HelloJSP/WebContent/WEB-INF/lib 폴더로 옮김

3. 코어(Core) 태그

  • 프로그래밍 언어에서 가장 기본이 되는 변수 선언, 조건문, 반복문 등을 대체하는 태그 제공

 

태그명  기능
set EL에서 사용할 변수 설정[setAttrubute( ) 메소드와 동일한 기능]
remove 설정한 변수 제거 [removeAttribute( ) 메소드와 동일한 기능]
if 단일 조건문을 주로 처리: else문이 없다는 단점이 있음
choose 다중 조건 처리 시 사용: 하위에 when~otherwise 태그가 있음
forEach 반복문 처리 시 사용: 일반 for문과 향상된 for문 두 가지 형태로 사용 가능
forTokens 구분자로 분리된 각각의 토큰 처리 시 사용 [StringTokenizer 클래스와 동일한 기능]
import 외부 페이지 삽입 시 사용
redirect 지정한 경로로 이동 [sendRedirect( ) 메소드와 동일한 기능]
url 경로 설정 시 사용
out 내용 출력 시 사용
catch 예외 처리에 사용

1) <c:set> 태그

  • EL에서 사용할 변수나 자바빈즈를 생성할 때 사용
  • JSP에서 영역에 속성을 저장할 때 사용하는 setAttribute( ) 메소드와 같은 역할
  • 일반적인 변수를 생성하는 방식
<c:set var="변수명" value="값" scope="영역" />
<c:set var="변수명" scope="영역">
  value 속성에 들어갈 값
</c:set>
  • 사용하는 속성
속성명  기능
var 변수명을 설정
value 변수에 할당할 값 설정
scope 변수를 생성할 영역 지정
(기본값: page)  
target 자바빈즈를 설정
property 자바빈즈의 속성(=멤버 변수)의 값 지정
  • 자바빈즈나 컬렉션 생성 시, target과 property 속성 사용
<c:set var="변수명" value="저장할 객체 혹은 컬렉션" scope="영역" />
<c:set target="var로 설정한 변수명" property="객체의 속성명" value="속성값" />

(1) 태그로 변수와 자바빈즈 사용하기

  • WebContent/JSTL/core에 Set1.jsp 파일 생성
<%@ page import="java.util.Date"%>
<%@ page import="Common.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    // 1. core 태그를 사용하기 위해 taglib 지시어 선언
<html>
<head><title>JSTL - set1</title></head>
<body>
  <!-- 2. 사용할 변수 선언 -->
  <c:set var="directVar" value="100" />    <!-- 3. 변수에 값을 직접 대입 -->
  <c:set var="elVar" value="${ directVar mod 5}" />    <!-- 4. 변수에 EL 사용 -->
  <c:set var="expVar" value="<%= new Date() %>" />    <!-- 5. 변수에 표현식 사용 -->
  <c:set var="betweenVar">변수값 요렇게 설정</c:set>    <!-- 6. 태그 사이에 변수값 지정 -->
	
  <h4>EL을 이용해 변수 출력</h4>    <!-- 7. 위에서 선언했던 변수들을 출력 -->
  <ul>
    <li>directVar : ${ pageScope.directVar }</li>
    <li>elVar : ${ elVar }</li>
    <li>expVar : ${ expVar }</li>
    <li>betweenVar : ${ betweenVar }</li>
  </ul>

  <h4>자바빈즈 생성 1 - 생성자 사용</h4>
  <c:set var="personVar1" value='<%= new Person("박문수", 50) %>'
	     scope="request" />    <!-- 8. 자바빈즈 생성 - 생성자를 통해 초깃값을 설정하고, request 영역에 변수 저장 -->
  <ul>
    <li>이름: ${ requestScope.personVar1.name }</li>    <!-- 9. request 영역에 저장된 자바빈즈를 출력 -->
    <li>나이: ${ personVar1.age }</li>
  </ul>

  <h4>자바빈즈 생성 2 - target, property 사용</h4>
  <c:set var="personVar2" value="<%= new Person() %>" scope="request" />    <!-- 10. 자바빈즈 생성 -->
  <!-- 11. 생성한 자바빈즈의 값을 나중에 설정하기 위해, target과 property 속성 사용 -->
  <!-- target에는 변수, property에는 멤버 변수명 지정(아래 코드 2줄) -->
  <c:set target="${personVar2 }" property="name" value="정약용" />
  <c:set target="${personVar2 }" property="age" value="60" />

  <ul>
    <li>이름 : ${ personVar2.name }</li>
    <li>나이 : ${requestScope.personVar2.age }</li>
  </ul>
</body>
</html>
  • Set1.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과

(2) 태그로 컬렉션 사용하기

  • WebContent/JSTL/core에 Set2.jsp 파일 생성
<%@ page import="common.Person"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="java.util.HashMap"%>
<%@ page import="java.util.Map"%>
<%@ page import="java.util.Vector"%>
<%@ page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
		pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>JSTL - set 2</title></head>
<body>
  <h4>List 컬렉션 이용하기</h4>
  <%
  ArrayList<Person> pList = new ArrayList<Person>();    <!-- 1. List 컬렉션 생성 -->
  <!-- 2. Person 객체 추가 (아래 코드 2줄) -->
  pList.add(new Person("성삼문", 55));
  pList.add(new Person("박팽년", 60));
  %>
  <c:set var="personList" value="<%= pList %>" scope="request" />    <!-- 3. 이 컬렉션을 request 영역에 "personList"라는 변수명으로 저장-->
  <ul>
    <li>이름 : ${ requestScope.personList[0].name }</li>    <!-- 4. 3.의 컬렉션을 불러와서 출력 -->
    <li>나이 : ${ personList[0].age }</li>    <!-- 5. 다른 영역에 똑같은 이름으로 저장한 속성이 없으므로, requestScope는 생략 가능 -->
  </ul>

  <h4>Map 컬렉션 이용하기</h4>
  <%
  Map<String, Person> pMap = new HashMap<String, Person>();    <!-- 6. Map 컬렉션을 생성하고 Person 객체를 저장 -->
  pMap.put("personArgs1", new Person("하위지", 65));
  pMap.put("personArgs2", new Person("이개", 67));
  %>
  <c:set var="personMap" value="<%=pMap %>" scope="request" />    <!-- 7. 6.을 request 영역에 변수명 "personMap"으로 저장 -->
  <ul>
    <!-- 8. 키를 통해 7에 접근하여 출력 - 5와 같은 이유로, requestScope는 생략 가능(아래 코드 2줄) -->
    <li>아이디 : ${ requestScope.personMap.personArgs2.name }</li>
    <li>비번 : ${ personMap.personArgs2.age }</li>
  </ul>
</body>
</html>
  • Set2.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과

2) <c:remove> 태그

  • <c:set> 태그로 설정한 변수를 제거할 때 사용
  • 형식
<c:remove var="변수명" scope="영역" />
  • 사용하는 속성
속성명 기능
var 삭제할 변수명을 설정
scope 삭제할 변수의 영역 지정
→ 지정하지 않으면, 모든 영역의 변수가 삭제됨
(이름이 같은 변수를 사용해야 한다면, 영역을 지정한 후 삭제해야 함)

 

*<c:remove> 태그 사용 예시

  • WebContent/JSTL/core에 Remove.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
		pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 1. 변수 선언 - 4가지 영역 모두에 똑같은 이름의 변수 값을 저장(아래 코드 4줄) -->
<c:set var="scopeVar" value="Page Value" />    <!-- 2. 영역을 지정하지 않았으므로 가장 좁은 page영역이 지정됨 -->
<c:set var="scopeVar" value="Request Value" scope="request" />
<c:set var="scopeVar" value="Session Value" scope="session" />
<c:set var="scopeVar" value="Application Value" scope="application" />
<html>
<head><title>JSTL - remove</title></head>
<body>
  <h4>출력하기</h4>
  <ul>
    <!-- 3. 1에서 저장한 변수들을 그대로 출력(아래 코드 4줄) -->
    <li>scopeVar : ${ scopeVar }</li>    <!-- 4. 영역을 지정하지 않았으므로 가장 좁은 page영역이 지정됨 -->
    <li>requestScope : ${ requestScope.scopeVar }</li>
    <li>sessionScope : ${ sessionScope.scopeVar }</li>
    <li>applicationScope : ${ applicationScope.scopeVar }</li>
  </ul>
	
  <h4>session 영역에서 삭제하기</h4>
  <c:remove var="scopeVar" scope="session" />    <!-- 5. scope 영역을 session으로 지정하여 session 영역에 저장된 변수만 삭제 -->
  <ul>
    <li>sessionScope.scopeVar : ${ sessionScope.scopeVar }</li>    <!-- 6. 5에서 삭제한 변수를 출력(아무 값도 출력되지 않음) -->
  </ul>

  <h4>scope 지정 없이 삭제하기</h4>
  <c:remove var="scopeVar" />    <!-- 7. scope 영역을 지정하지 않고 삭제 -->
  <ul>
    <!-- 8. 7에서 4가지 영역 전제에서 scopeVar를 삭제했으므로 아무 값도 출력되지 않음(아래 코드 3줄) -->
    <li>scopeVar : ${ scopeVar }</li>
    <li>requestScope.scopeVar : ${ requestScope.scopeVar }</li>  
    <li>applicationScope.scopeVar : ${ applicationScope.scopeVar }</li>
  </ul>
</body>
</html>
  • Remove.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과

3) <c:if> 태그

  • 자바의 if와 동일하게 제어 구문을 작성 시에 사용
    → else가 별도로 없기 때문에 일련의 여러 조건을 나열하는 형태로 작성하기엔 어려움이 있음
  • 형태
<c:if test="조건" var="변수명" scope="영역">
  조건이 true일 때 출력할 문장
</c:if>
  • 사용하는 속성
속성명 기능
test if문에서 사용할 조건 지정
var 조건의 결과를 저장할 변수명을 지정
scope 변수가 저장될 영역 지정

 

*<c:if> 태그 사용 예시

  • WebContent/JSTL/core에 If.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>JSTL - if</title></head>
<body>
  <!-- 1. 변수 선언 - 정수 100과 문자열 "JSP"를 담음 (아래 코드 2줄) -->
  <c:set var="number" value="100" />
  <c:set var="string" value="JSP" />

  <h4>JSTL의 if 태그로 짝수/홀수 판단하기</h4>
  <c:if test="${ number mod 2 eq 0 }" var="result">    <!-- 2. member 변수를 2로 나눈 나머지가 0인지 판단하여, 결과를 result에 저장-->
    ${ numVar }는 짝수입니다. <br />
  </c:if>
  result : ${ result } <br />    <!-- 3. 2에서 number의 값이 100으로 짝수이므로, result에서 true가 출력됨 -->

  <h4>문자열 비교와 else 구문 흉내내기</h4>
  <c:if test="${ string eq 'Java' }" var="result2">    <!-- 4. string 변수에 저장된 문자열과 'Java'를 비교해, 결과를 result2에 저장 -->
    문자열은 Java입니다. <br />
  </c:if>
  <c:if test="${ not result2 }">    <!-- 5. 4의 result2의 값을 이용해 else 구문을 흉내 낸 모습: 2개의 <c:if> 태그로 if/else 로직 구현 -->
    'Java'가 아닙니다. <br />
  </c:if>

  <h4>조건식 주의사항</h4>
  <c:if test="100" var="result3">    <!-- 6. EL이 아닌 일반 값이 오면 무조건 false 반환(일반 값으로 true가 사용되는 건 예외) -->
    EL이 아닌 정수를 지정하면 false
  </c:if>
  result3 : ${ result3 } <br />
  <c:if test="tRuE" var="result4">    <!-- 7. 문자열 'tRuE'는 대소문자에 상관없이 항상 true를 반환 -->
    대소문자 구분 없이 "tRuE"인 경우 true <br />
  </c:if>
  result4 : ${ result4 } <br />
  <c:if text="${ true }" var="result5">    <!-- 8. test 속성에 EL을 통해 조건식을 쓸 때 공백이 삽입되면, 무조건 false를 반환 -->
    EL 양쪽에 빈 공백이 있는 경우 false <br />
  </c:if>
  result5 : ${ result5 } <br />
</body>
</html>
  • If.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과

4) <c:choose>, <c:when>, <c:otherwise> 태그

  • <c:choose>: 다중 조건을 통해 판단해야 할 때 사용
    • 하위 태그로 사용: <c:when>, <c:otherwise>
  • 형식
<c:choose>
  <c:when test="조건1">조건1을 만족하는 경우</c:when>
  <c:when test="조건2">조건2를 만족하는 경우</c:when>
  <c:otherwise>아무 조건도 만족하지 않는 경우</c:otherwise>
</c:choose>

//대응하는 자바 코드
if (조건1) { ...
} else if (조건2) { ...
} else { ... }

 

*<c:choose>, <c:when>, <c:otherwise> 태그 사용 예시

  • WebContent/JSTL/core에 Choose.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<body>
  <!-- 1. 변수 선언 -->
  <c:set var="number" value="100" />
	
  <h4>choose 태그로 홀짝 판단하기</h4>
  <c:choose>    <!-- 2. -->
    <c:when test="${ number mod 2 eq 0 }">
      ${ number }는 짝수입니다.
    </c:when>
    <c:otherwise>
      ${ number }는 홀수입니다.
    </c:otherwise>
  </c:choose>

  <h4>국, 영, 수 점수를 입력하면 평균을 내어 학점 출력</h4>
  <form>    <!-- 3. 점수 입력 폼 -->
    국어 : <input type="text" name="kor" /> <br />
    영어 : <input type="text" name="eng" /> <br />
    수학 : <input type="text" name="math" /> <br />
    <input type="submit" value="학점 구하기" />
  </form>
  <!-- 4. 모든 과목의 점수가 입력되었는지 확인 -->
  <c:if test="${ not (empty param.kor or or empty param.eng or empty param.math) }">
    <!-- 5. 평균 계산 -->
    <c:set var="avg" value="${ (param.kor + param.eng + param.math) / 3}" />
    평균 점수는 ${avg }으로    <!-- 6. -->
    <!-- 7. 학점 출력 -->
    <c:choose>
      <c:when test="${ avg >= 90 }">A 학점</c:when>
      <c:when test="${ avg >= 80 }">B 학점</c:when>
      <c:when test="${ avg ge 70 }">C 학점</c:when>
      <c:when test="${ avg ge 60 }">D 학점</c:when>
      <c:otherwise>F 학점</c:otherwise>
    </c:choose>
    입니다.
  </c:if>
</body>
</html>
  • choose.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과
    • 첫 실행 시 → 국어 72, 영어 88, 수학 92 입력 후 [학점 구하기 버튼] 클릭 시

5) <c:forEach> 태그

(1) 반복을 위해 사용 - 자바와 똑같이 2가지 형태로 사용 가능

  • 시작과 종료를 지정하는 일반 for문
<c:forEach var="변수명" begin="시작값" end="마지막값" step="증가값" />

//자바 코드 예시
for (int i = 0; i < 100; i += 2) { ... }
  • 배열이나 컬렉션을 순회할 때 사용하는 향상된 for문(Enhanced for loop)
<c:forEach var="변수명" items="컬렉션 혹은 배열" />

//자바 코드 예시
for (int number : numbers) { ... }

(2) <c:forEach> 태그에서 사용하는 속성

속성명 기능
var 변수명 지정
items 반복을 위한 객체(배열, 컬렉션 등)를 지정
begin 시작값 지정
end 종료값 지정
step 증가할 값 지정
varStatus 루프의 현재 상태를 알려주는 변수의 이름 지정

 

*varStatus 속성을 통해 얻을 수 있는 정보

속성명 일반 for문 향상된 for문
current var에 지정한 현재 루프의 변숫값 반환 현재 루프의 실제 요소를 반환
index var에 지정한 현재 루프의 변숫값 반환 현재 루프의 인덱스를 표시(0~마지막)
count 실제 반복 횟수(1~마지막) 일반 for문과 동일함
first 루프의 처음일 때 true 반환 일반 for문과 동일함
last 루프의 마지막일 때 true 반환 일반 for문과 동일함

(3) 사용 예시

  • 일반 for문 형태로 사용하기
// WebContent/JSTL/core/ForEachNormal.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>JSTL - forEach 1</title></head>
<body>
  <h4>일반 for문 형태의 forEach 태그</h4>
  <c:forEach begin="1" end="3" step="1" var="i">    <!-- 1. 일반 for문 형태로 1부터 3까지 반복하며 1씩 증가(증가하는 값은 변수 i에 저장됨 -->
    <p>반복 ${ i }입니다</p>    <!-- 2. 변수 i의값을 출력 -->
  </c:forEach>

  <h4>varStatus 속성 살펴보기</h4>
  <table border="1">
  <c:forEach begin="3" end="5" var="i" varStatus="loop">    <!-- 3. varStatus 속성: 속성값(상태를 알려줄 변수명)을 loop으로 지정 -> 루프를 3~5까지 반복 -->
    <tr>
      <!-- 4. loop 변수를 통해 varStatus가 제공하는 모든 하위 속성값을 출력(아래 코드 5줄) -->
      <td>count : ${ loop.count }</td>    
      <td>index : ${ loop.index }</td>    <!-- 5. 일반 for문에서는 index와 current의 값이 동일함 -->
      <td>current : ${ loop.current }</td>    <!-- 5. //(위 5번과 같음) -->
      <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="j">    <!-- 6. 1에서 100까지 반복하며 홀수의 값 구하기 -->
    <c:if test="${ j mod 2 ne 0}">    <!-- 7. <c:if> 태그로 홀수인지 판단 -->
      <c:set var="sum" value="${ sum + j }" />    <!-- 8. 홀수인 경우, 변수 sum에 더함 -->
    </c:if>
  </c:forEach>
  1~100 사이의 정수 중 홀수의 합은? ${ sum }
</body>
</html>

  • 향상된 for문 형태로 사용하기
// 향상된 for문 형태의 forEach 태그
// WebContent/JSTL/core/ForEachExtend1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.cun.com/jsp/jstl/core" %>
<html>
<head><title>JSTL - forEach2</title></head>
<body>
  <h4>향상된 for문 형태의 forEach 태그</h4>
  <%
  String[] rgba = {"Red", "Green", "Blue", "Black"};    <!-- 1. 루프에서 순회할 String 배열 선언(색상 이름들의 배열) -->
  %>
  <!-- 2. <c:forEach> 태그에서 items 속성에 배열을 지정하고 변수 이름을 "c"로 지정 (루프가 배열의 크기만큼 자동으로 반복되며, c에 할당된 색상 이름을 <span> 태그와 함께 출력) -->
  <c:forEach items="<%= rgba %>" var="c">    
    <span style="color:${ c };">${ c }</span>
  </c:forEach>

  <h4>varStatue 속성 살펴보기</h4>
  <table border="1">
  <c:forEach items="<%= rgba %>" var="c" varStatus="loop">    <!-- 3. <c:forEach> 태그에 varStatus 속성을 지정 -->
    <tr>
      <!-- 4. 모든 하위 속성들 출력 (아래 코드 5줄) -> 일반 for문과 비슷하지만, current와 index의 속성값이 다름 -->
      <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>

// 향상된 for문 형태의 forEach 태그(List 컬렉션 반복하기)
// WebContent/JSTL/core/ForEachExtend2.jsp
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="common.Person" %>
<%@ page import="java.util.LinkedList" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.cun.com/jsp/jstl/core" %>
<html>
<head><title>JSTL - forEach2</title></head>
<body>
  <h4>List 컬렉션 사용하기</h4>
  <%
  LinkedList<Person> lists = new LinkedList<Person>();    <!-- 1. Person 객체를 담은 리스트 컬렉션 준비 -->
  lists.add(new Person("맹사성", 34));
  lists.add(new Person("장영실", 44));
  lists.add(new Person("신숙주", 54));
  %>
  <c:set var="lists" value="<%= lists %>" />    <!-- 2. JSTL에서 리스트 컬렉션을 사용하기 위해, <c:set> 태그를 이용해 리스트 컬렉션을 변수로 지정 -->
  <c:forEach items="${ lists }" var="list">    <!-- 3. 리스트 컬렉션을 출력하기 위해, <c:forEach> 태그의 items 속성에 설정 -->
  <li>
    이름 : ${ list.name }, 나이 : ${ list.age }    <!-- 4. 루프 내에서 각 객체의 이름과 나이 출력(Person 객체는 자바빈즈이므로 멤버 변수명을 적으면 게터를 호출해 값을 읽어옴 -->
  </li>
  </c:forEach>

  <h4>Map 컬렉션 사용하기</h4>
  <%
  Map<String,Person> maps = new HashMap<String,Person>();    <!-- 5. 맵 컬렉션을 생성한 후 키와 함께 객체 세 개 저장 -->
  maps.put("1st", new Person("맹사성", 34));
  maps.put("2nd", new Person("장영실", 44));
  maps.put("3rd", new Person("신숙주", 54));
  %>
  <c:set var="maps" value="<%= maps %>" />    <!-- 6. 5의 객체 세 개를 변수로 설정 -->
  <c:forEach items="${ maps }" var="map">    <!-- 7. 리스트 때와 마찬가지로, 컬렉션을 순회하며 8,9를 출력 -->
    <li>Key => ${ map.key } <br />    <!-- 8. 키 -->
        Value => 이름 : ${ map.value.name }, 나이 : ${ map.value.age }</li>    <!-- 9. 값 -->
  </c:forEach>
</body>
</html>

6) <c:forTokens> 태그

  • 자바의 StringTokenizer 클래스처럼 구분자를 기준으로 문자열을 나눠, 토큰의 개수만큼 반복해 줌
<c:forTokens items="문자열" delims="문자열 구분자" var="변수명" />

 

*토큰이란?

  • 문법적으로 의미있는 최소 단위
  • JSP에서는 문자열을 구분할 구분자(delimiter)로 분리되는 문자열의 구성 요소를 의미

*<c:forTokens> 사용하기

// WebContent/JSTL/core/ForTokens.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.cun.com/jsp/jstl/core" %>
<html>
<meta charset="UTF-8">
<head><title>JSTL - forTokens</title></head>
<body>
  <%
  String rgba = "Red,Green,Blue,Black";    <!-- 1. 콤마로 구분된 문자열 준비(구분자는 다른 특수기호를 사용해도 됨) -->
  %>
  <h4>JSTL의 forTokens 태그 사용</h4>
  <!-- 2. <c:forTokens> 태그의 items 속성에는 문자열만 사용 가능(배열이나 컬렉션 사용 불가), delims 속성에 구분자 입력, 구분자를 기준으로 분리된 토큰은 var 속성에 지정한 color변수에 저장됨 -->
  <c:forTokens items="<%= rgba %>" delims="," var="color">    
    <span style="color:${ color };">${ color }</span> <br />    <!-- 3. 구분된 토큰의 개수만큼 반복 -->
  </c:forTokens>
<body>
<html>

7) <c:import> 태그

  • jsp:include 액션 태그와 같이, 외부 파일을 현재 위치에 삽입할 때 사용
    → <c:import> 태그는 같은 웹 애플리케이션에 속하지 않은 외부의 페이지도 삽입 가능
  • 형식
// 현재 위치에 외부 페이지를 삽입
<c:import url="페이지 경로 혹은 URL" scope="영역" />

// var 속성을 사용하면, 외부 페이지가 지정한 변수에 저장되고, 나중에 이 변수명을 통해 원하는 위치에 삽입 가능 (선언과 삽입 분리 가능)
<c:import url="페이지 경로 혹은 URL" var="변수명" scope="영역" />
${ 변수명 }

// var 속성을 사용하며 매개변수로 전달할 값이 있다면, url에 쿼리스트링으로 직접 추가하거나 <c:param> 태그 사용
<c:import url="페이지 경로 혹은 URL?매개변수1=값1" >
  <c:param name="매개변수2" value="값2" />
</c:import>

(1) 포함시킬 파일 1 - 같은 웹 애플리케이션의 다른 파일

  • 동일한 웹 애플리케이션에 속한 다른 JSP 파일
    → WebContent/JSTL/inc 디렉토리에 OtherPage.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h4>OtherPage.jsp</h4>
<ul>
  // 영역에 저장된 값과 매개변수로 전달된 값을 출력
  <li>저장된 값: ${ requestVar }</li>    
  <li>매개변수 1: ${ param.user_param1 }</li>
  <li>매개변수 2: ${ param.user_param2 }</li>
</ul>

(2) 포함시킬 파일 2 - 외부 파일

  • <c:import> 태그로 외부 페이지인 '골든래빗 출판사'의 웹 사이트 삽입
    → WebContent/JSTL/inc 디렉토리에 GoldPage.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:import url="https://goldenrabbit.co.kr/" />

(3) 포함시킬 파일 2개 임포트 (<c:import> 태그 사용 예시)

  • WebContent/JSTL/core 디렉토리에 Import.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>JSTL - import</title></head>
<body>
  // 포함될 파일인 inc/OtherPage.jsp에 전달할 변수를 request 영역에 저장
  <c:set var="requestVar" value="MustHave" scope="request" />   
  // url 속성에 내부 JSP 파일 경로를 저장하고, var 속성 추가(var 속성을 지정했기에, 페이지의 내용이 즉시 삽입되지 않고 변수 contents에 저장됨)
  <c:import url="/JSTL/inc/OtherPage.jsp" var="contentㄴ">    
    // 포함될 페이지로 전달할 매개변수를 <c:param> 태그로 추가
    <c:param name="user_param1" value="JSP" />
    <c:param name="user_param2" value="기본서" />
  </c:import>

  <h4>다른 문서 삽입하기</h4>
  // OtherPage.jsp 페이지 삽입
  ${ conetents }

  <h4>외부 자원 삽입하기</h4>
  // iframe 내에 골든래빗 웹 사이트를 통째로 삽입
  <iframe src="../inc/GoldPage.jsp" style="width:100%;height:600px;"></iframe>
</body>
</html>

(4) Import.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과

8) <c:redirect> 태그

  • response 내장 객체의 sendRedirect()와 동일하게 페이지 이동을 처리함
  • 형식 - 매개변수를 전달하고 싶다면, <c:import> 태그와 동일하게 <c:param> 태그 사용
<c:redirect url="이동할 경로 및 URL" />

예제

  • WebContent/JSTL/core 디렉토리에 Redirect.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>JSTL - redirect</title></head>
<body>
  // request 영역에 변수 저장 
  <c:set var="requestVar" value="MustHave" scope="request" />
  // OtherPage.jsp로 리다이렉트
  <c:redirect url="/JSTL/inc/OtherPage.jsp">
    // 2개의 매개변수를 <c:param>을 이용해 전달(아래 코드 2줄 모두)
    <c:param name="user_param1" value="출판사" />
    <c:param name="user_param2" value="골든래빗" />
  </c:redirect>
</body>
</html>
  • Redirect.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과
    → 즉시 OtherPage.jsp로 이동하는데, 포워드 때와 다르게 request 영역은 공유되지 않고 <c:param>으로 전달한 매개변수만 출력됨

9) <c:url> 태그

  • 지정한 경로와 매개변수를 이용해서 컨텍스트 루트를 포함한 URL을 생성
    → 생성된 URL은 <a> 태그의 href 속성이나, <form> 태그의 action 속성에 사용 가능
  • 형식
// 기본
<c:url value="설정한 경로" scope="영역" />

// var 속성 이용-미리 선언해둔 URL을 원하는 위치에 출력 가능
<c:url value="설정한 경로" scope="영역" var="변수명" />
... 생략(JSP 코드) ...
${ 변수명 }    <!-- 원하는 위치에 URL 삽입 -->

*예제

  • WebContent/JSTL/core 디렉토리에 Url.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>JSTL - url</title></head>
<body>
  <h4>url 태그로 링크 걸기</h4>
  <c:url value="/JSTL/inc/OtherPage.jsp" var="url">
    <c:param name="user_param1" value="Must" />
    <c:param name="user_param2">Have</c:param>
  </c:url>
  <a href="{url }">OtherPage.jsp 바로가기</a>
</body>
</html>
  • Url.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과
    → 링크를 클릭하면 OtherPage.jsp로 이동

10) <c:out> 태그

  • JSP의 표현식처럼, 변수를 출력할 때 사용
    • 출력할 변수가 null일 때, default 속성에 지정한 기본값이 출력됨
    • escapeXml 속성을 true로 설정하면, HTML 태그 자유롭게 표현 가능
  • 형식
<c:out value="출력할 변수" default="기본값" escapeXml="특수문자 처리 유무" />
  • 속성
속성명 기능
value - 출력할 변수를 지정
escapeXml - 특수 문자를 변환할지 여부를 결정
  • 기본값은 true로, 특수 기호를 그대로 출력함 | | default | - value 속성에 값을 지정하지 않을 경우 출력할 값을 지정함 |

*예제

  • WebContent/JSTL/core 디렉토리에 Out.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   
<html>
<head><title>JSTL - out</title></head>
<body>
  <c:set var="iTag">    <!-- 1.<c:set> 태그로 변수 생성 -->
    i 태그는 <i>기울임</i>을 표현합니다.
  </c:set>

  <h4>기본 사용</h4>
  <c:out value="${ iTag }" />    <!-- 2.변수 출력: <i> 태그는 HTML 태그로 인식되지 않고, 텍스트 상태 그대로 화면에 출력 -->
    
  <h4>escapeXml 속성</h4>
  <c:out value="${ iTag }" escapeXml="false" />    <!-- 3.escapeXml 속성을 false로 지정하면 HTML 태그를 해석하여 마크업이 적용된 상태로 출력 -->  
    
  <h4>default 속성</h4>
  <c:out value="${ param.name }" default="이름 없음" />    <!-- 4.default 속성으로는 변숫값이 null인 경우 출력할 값을 지정할 수 있음: 첫 실행 시 매개변수가 없으므로 "이름 없음"이 출력됨 -->
  <c:out value="" default="빈 문자열도 값입니다." />    <!-- 5.빈 문자열도 하나의 값이므로(null이 아니므로) default에 지정한 값이 출력되지 않음 -->
</body>
</html>
  • Out.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과
    → value 속성이 null일 때만 default 값이 출력됨

11) <c:catch> 태그

  • 발생한 예외를 잡아 처리하는 역할
    → 예외가 발생하면, 지정한 변수에 에러 메시지가 저장되어 전달됨
  • 형식
<c:catch var="변수명">
  실행 코드
</c:catch>

*예제

  • WebContent/JSTL/core 디렉토리에 Catch.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<html>
<head><title>JSTL - catch</title></head>
<body>
  <h4>자바 코드에서의 예외</h4>
  <%
  int num1 = 100;    <!-- 1.자바 코드로 변수 선언 -->
  %>
  <c:catch var="eMessage">    <!-- 2.3에서 발생한 예외를 <c:catch> 태그가 잡아 eMessage에 예외 메시지 저장함 -->
    <%
    int result = num1 / 0;    <!-- 3.<c:catch> 태그 블록 안의 스크립틀릿에서 예외 일으킴(숫자를 0으로 나눌 수 없음) -->
    %>
  </c:catch>
  예외 내용 : ${ eMessage }    <!-- 4.2에서 eMessage에 저장한 예외 메시지 출력 -->
    
  <h4>EL에서의 예외</h4>
  <c:set var="num2" value="200" />    <!-- 5.<c:set>태그를 이용해 각각 변수를 선언 -->

  <c:catch var="eMessage">    <!-- 6.7에서 발생한 예외를 <c:catch> 블록에서 잡아 eMessage에 예외 메시지 저장함 -->
    ${"일" + num2 }    <!-- 7.<c:catch> 태그 블록 안의 스크립틀릿에서 예외 일으킴(EL에선 +연산자를 덧셈에만 사용 가능) -->
  </c:catch>    
  예외 내용 : ${ eMessage }    <!-- 8.5에서 eMessage에 저장한 예외 메시지 출력(NumberFormatException) -->
</body>
</html>
  • Catch.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과
    • EL은 null이나 예외에 관대한 편이므로 <c:catch> 태그는 EL보다는 JSP에서 발생하는 예외를 처리할 때 주로 사용됨

반응형