자바(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에서 발생하는 예외를 처리할 때 주로 사용됨
반응형