태그 라이브러리 선언
자바에서 import문을 선언하듯 JSP에서도 JSTL 확장 태그를 사용하려면 taglib 지시자로 라이버리를 선언해야 한다.
JSP 지시자 태그 <%@ taglib %>를 사용해서 다음과 같이 선언한다.
<%@ taglib prefix="접두사" uri="URI" %>
uri : 태그 라이브러리의 네임 스페이스 URI 식별자
prefix : JSTL 태그를 사용할때 태그 이름 앞에 붙일 접두사
태그 라이브러리 별 표준 선언문
태그 라이브러리 | 선언문 |
Core | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
XML | <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> |
I18N | <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> |
Database | <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> |
Functions | <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> |
url (자바9까지만 저렇게 쓰고, 10부터는 jakarta)
prefix를 꼭 저렇게 지정해야하는건 아니지만 JSTL에서 제안하는 표준 접두사이므로 똑같이 사용하는게 좋다.
태그 라이브러리 별 태그 정리
태그 라이브러리 | 기능 | 태그 - 부모태그(자식태그) |
Core(기본) | 변수 | remove, set |
흐름 제어 | choose(when, otherwise) forEach forTokens if |
|
URL 관리 | import(param) redirect(param) url(param) |
|
기타 | catch, out | |
XML | 기본 | out, parse, set |
흐름 제어 | choose(when, otherwise) forEach if |
|
변환 | transform(param) | |
I18N(국제화) | 로케일 | setLocale, requestEncoding |
메시지 포맷 | bundle message(param) setBundle |
|
Database | 데이터 소스 설정 | setDataSource |
SQL | query(dateParam, param) transaction update(dateParam, param) |
|
Functions(기타 함수) | 집합의 원소 개수 | length |
문자열 처리 | toUpperCase toLowerCase substring substringAfter substringBefore trim replace indexOf startsWith endsWith contains containsIgnoreCase split join escapeXml |
<c:out> 태그
출력문을 만드는 태그이다.
<c:out value="출력값" default="기본값" />
<c:out value="출력값">기본값</c:out>
value에 EL 표현식을 쓸 수 있다.
value 값이 null이면 기본값이 출력되고 기본값이 없으면 빈 문자열이 출력된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:out value="Hello World" /><br>
<c:out value="${null}">JSTL</c:out><br>
<c:out value="Hello">World</c:out><br>
<c:out value="${null}" />
</body>
</html>
|
실행 결과
Hellp World
JSTL
Hello
<c:set> 태그
변수를 다룰때 사용한다.
이 태그로 생성한 변수는 JSP의 로컬 변수가 아니라 서블릿 보관소(JspContext, ServletRequest, HttpSession, ServletContext)에 저장된다.
<c:set var="변수명" value="값" scope="page(기본값)|request|session|application" />
<c:set var="변수명" scope="page(기본값)|request|session|application">값</c:set>
scope의 기본값은 page이다. 따라서 scope를 생략하면 JspContext에 저장된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
긁지않은개발자
<%--<c:set> 기본 사용 방법 --%> <c:set var="name1" value="긁지않은개발자" />
<c:set var="name2">환영합니다.</c:set>
${name1}<br>
${name2}<br>
${pageScope.name1}<br>
${pageScope.name2}<br>
<p></p>
<%--보관소 지정(ServletRequest)--%>
<c:set var="name3" scope="request">안녕하세요</c:set>
${pageScope.name3}<br>
${requestScope.name3}<br>
<p></p>
<%--덮어쓰기--%>
<% pageContext.setAttribute("name4", "고양이"); %>
수정 전 name4 : ${name4}<br>
<c:set var="name4" value="야옹" />
수정 후 name4 : ${name4}<br>
|
실행 결과
긁지않은개발자
환영합니다.
긁지않은개발자
환영합니다.
안녕하세요
수정 전 name4 : 고양이
수정 후 name4 : 야옹
scope를 생략하면 기본적으로 JspContext(page)에 저장됨을 알 수 있다.
scope="request"와 같이 scope를 명시적으로 지정할수도 있다.
<c:set>으로 이미 존재하는 변수에 값을 할당할 경우 기존 값을 덮어쓴다.
<c:set>을 이용한 객체의 프로퍼티 값 설정
<c:set target="대상 객체" property="설정할 프로퍼티" value="프로퍼티 값" />
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
|
긁지않은개발자
<%! public static class Hcat {
int no;
String name;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
%>
<%
Hcat member = newHcat();
member.setNo(100);
member.setName("고양이");
pageContext.setAttribute("member", member);
%>
${member.name}<br>
<c:set target="${member}" property="name" value="강아지" />
${member.name}<br>
|
실행 결과
고양이
강아지
Innter class Hcat의 인스턴스 member를 생성하고
member의 name을 <c:set> 태그를 사용해서 변경하는 코드이다.
<c:set>으로 객체의 프로퍼티 값을 설정할때는 setter()의 리턴 타입이 반드시 void여야 한다.
그렇지 않으면 다음과 같은 예외가 발생한다. (error 500)
<c:remove> 태그
보관소에 저장된 값을 제거한다.
<c:remove var="변수명" scope="page(기본값) | request | session | application" />
<c:set>과 마찬가지로 scope 속성으로 보관소를 명시할 수 있고 보관소의 기본값은 page이다.
1
2
3
4
|
긁지않은개발자
<% pageContext.setAttribute("name1", "긁지않은개발자"); %> ${name1}<br>
<c:remove var="name1" />
${name1}<br>
|
실행 결과
name1 : 긁지않은개발자
name1 :
<c:remove> 사용 후 JspContext에서 name1의 값을 삭제해서 값이 출력되지 않는다.
<c:if> 태그
<c:if test="조건식" var="변수명" scope="page(기본값) | request | session | application">내용</c:if>
test의 조건식이 true이면 '내용'이 실행된다.
var, scope 속성은 test 결과를 저장할때 사용한다.
1
2
3
4
5
6
7
8
9
|
긁지않은개발자
<c:if test="${10 > 20}" var="result1"> 10은 20보다 크다.<br>
</c:if>
result1 : ${result1}<br>
<c:if test="${10 < 20}" var="result2">
20은 10보다 크다.<br>
</c:if>
result2 : ${result2}
|
실행 결과
result1 : false
20은 10보다 크다.
result2 : true
${10 > 20}은 false이므로 '10은 20보다 크다'는 출력되지 않는다.
${10 < 20}은 true이므로 '20은 10보다 크다'가 출력되었다.
<c:if> - List가 empty(비어있는지) 체크
<c:if test="${empty myList}">
<div>
<!-- myList가 비어있으면 -->
</div>
</c:if>
<c:if test="${not empty myList}">
<div>
<!-- myList가 비어있지 않으면 -->
</div>
</c:if>
List의 empty 여부는 empty operator를 사용하여 test할 수 있다.
<c:choose> 태그
자바의 switch-case와 같은 기능을 수행한다.
여러 조건에 따라 다른 작업을 할 필요가 있을때 사용한다.
<c:choose>
<c:when test="조건식"></c:when>
<c:when test="조건식"></c:when>
...
<c:otherwise></c:when>
</c:choose>
<c:when> 태그는 한 개 이상 존재해야하며 <c:otherwise> 태그는 0개 혹은 1개가 올 수 있다.
<c:when>의 조건에 일치하지 않으면 <c:otherwise>가 실행된다.
1
2
3
4
5
6
7
8
9
|
긁지않은개발자
<c:set var="userid" value="h0-0cat.tistory.com" /> <c:choose>
<c:when test="${userid == 'admin'}">
관리자 페이지
</c:when>
<c:otherwise>
${userid}님 반갑습니다.
</c:otherwise>
</c:choose>
|
실행 결과
h0-0cat.tistory.com님 반갑습니다.
<c:forEach> 태그
반복 작업에 사용한다. 특히 목록에서 값을 꺼내서 처리할때 사용한다.
<c:forEach var="변수명" items="목록 데이터" begin="시작 인덱스" end="종료 인덱스">콘텐츠</c:forEach>
items에는 다음을 지정할 수 있다.
- 배열
- java.util.Collection 구현체(ArrayList, LinkedList, EnumSet, ...)
- java.util.Iterator 구현체
- java.util.Enumeration 구현체
- java.util.Map 구현체
- 콤마(,) 구분자로 나열된 문자열
var는 반복문을 돌면서 items에서 꺼낸 항목 값을 가리키는 참조 변수이다.
<c:forEach> - 배열
다음은 items에 배열을 지정한 forEach 예이다.
1
2
3
4
5
6
|
긁지않은개발자
<% pageContext.setAttribute("numList", new String[]{"1", "2", "3", "4", "5"}); %> <ul>
<c:forEach var="num" items="${numList}">
<li>${num}</li>
</c:forEach>
</ul>
|
실행 결과
- 1
- 2
- 3
- 4
- 5
시작 인덱스와 종료 인덱스를 지정
1
2
3
4
5
6
|
긁지않은개발자
<% pageContext.setAttribute("numList", new String[]{"1", "2", "3", "4", "5"}); %> <ul>
<c:forEach var="num" items="${numList}" begin="2" end="4">
<li>${num}</li>
</c:forEach>
</ul>
|
실행 결과
- 3
- 4
- 5
<c:forEach> - ArrayList
다음은 items에 ArrayList를 지정한 forEach 예이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
긁지않은개발자
<% List<String> alphabet = new ArrayList<>();
alphabet.add("A");
alphabet.add("B");
alphabet.add("C");
alphabet.add("D");
pageContext.setAttribute("alphabet", alphabet);
%>
<ul>
<c:forEach var="alphabet" items="${alphabet}">
<li>${alphabet}</li>
</c:forEach>
</ul>
|
실행 결과
- A
- B
- C
- D
<c:forEach> - 문자열
다음은 콤마(,)로 연결된 문자열에 대한 forEach 예제이다.
1
2
3
4
5
6
|
긁지않은개발자
<% pageContext.setAttribute("Hcat", "한식,중식,일식,양식"); %> <ul>
<c:forEach var="name" items="${Hcat}">
<li>${name}</li>
</c:forEach>
</ul>
|
실행 결과
- 한식
- 중식
- 일식
- 양식
<c:forEach> - 횟수 반복
items 지정 없이 begin과 end 속성을 사용해서 일정 횟수 반복할 수 있다.
1
2
3
4
5
|
긁지않은개발자
<ul> <c:forEach var="no" begin="1" end="5">
<li>forEach 예제 ${no}</li>
</c:forEach>
</ul>
|
- forEach 예제 1
- forEach 예제 2
- forEach 예제 3
- forEach 예제 4
- forEach 예제 5
<c:forTokens> 태그
문자열을 delimiter(구분자)로 분리해서 반복문을 돌리는데 사용한다.
<c:forTokens var="변수명" items="문자열" delims="구분자">콘텐츠</c:forTokens>
1
2
3
4
5
6
|
긁지않은개발자
<% pageContext.setAttribute("hcat", "v1=20&v2=20&op=+"); %> <ul>
<c:forTokens var="item" items="${hcat}" delims="&">
<li>${item}</li>
</c:forTokens>
</ul>
|
실행 결과
- v1=20
- v2=20
- op=+
<c:url> 태그
URL을 만들때 사용한다.
이 태그를 사용하면 매개변수를 포함한 URL을 쉽게 만들 수 있다.
<c:url var="변수명" value="url">
<c:param name="파라미터명" value="값" />
<c:param name="파라미터명" value="값" />
<c:param name="파라미터명" value="값" />
</c:url>
1
2
3
4
5
6
|
긁지않은개발자
<c:url var="calcUrl" value="http://localhost:8080/calc"> <c:param name="v1" value="10" />
<c:param name="v2" value="20" />
<c:param name="op" value="+" />
</c:url>
${calcUrl}
|
실행 결과

<c:import> 태그
url 속성에 콘텐츠가 있는 주소를 지정하면 해당 주소로 요청하고 응답 결과를 받아서 반환한다.
<c:import url="url" var="변수명" scope="page(기본값) | request | session | application" />
다음은 url에 구글검색) 긁지않은개발자 JSON으로 반환받은 결과를 출력하는 예제이다.
1
2
3
|
긁지않은개발자
<textarea rows="10" cols="80"> <c:import url="https://www.google.co.kr/search?q=%EA%B8%81%EC%A7%80%EC%95%8A%EC%9D%80%EA%B0%9C%EB%B0%9C%EC%9E%90&hl=ko" />
</textarea>
|
var, scope 속성을 사용해서 보관소에 저장했다가 출력할 수 있다.
1
2
3
4
|
긁지않은개발자
<c:import var="lottoResult" url="https://www.nlotto.co.kr/common.do?method=getLottoNumber&drwNo=800https://www.google.co.kr/search?q=%EA%B8%81%EC%A7%80%EC%95%8A%EC%9D%80%EA%B0%9C%EB%B0%9C%EC%9E%90&hl=ko" /> <textarea rows="10" cols="80">
${lottoResult}
</textarea>
|
실행 결과는 위와 동일하다.
이렇게 보관소에 저장해두면 필요할때마다 가져와서 쓰거나 결과 데이터를 변환하는 등의 작업을 할 수 있다.
<c:redirect> 태그
리다이렉트 처리를 할때 사용한다. 내부적으로 HttpServletResponse의 sendRedirect()를 호출한다.
<c:redirect url="url" />
<fmt:parseDate> 태그
날짜 형식으로 작성된 문자열로 java.util.Date 객체를 생성한다.
그리고 지정된 보관소에 저장한다.
<fmt:parseDate var="변수명" value="날짜 형식 문자열" pattern="패턴" scope="page(기본값) | request | session | application" />
1
|
<fmt:parseDate var="date1" value="2023-06-07" pattern="yyyy-MM-dd" />
긁지않은개발자 |
<fmt:formatDate> 태그
날짜 객체로부터 원하는 형식으로 날짜를 표현하고자 할때 사용한다.
<fmt:formatDate value="java.util.Date 객체 지정" pattern="패턴" />
1
2
|
<fmt:parseDate var="date1" value="2023-06-07" pattern="yyyy-MM-dd" />
<fmt:formatDate value="${date1}" pattern="MM/dd/yy" />
긁지않은개발자 |
실행 결과
06/07/23

'JSP > JSP 정리' 카테고리의 다른 글
[JSP] Mybatis, ibatis차이점과 사용방법 (0) | 2023.06.07 |
---|---|
[JSP] JSP EL 표현식과 문법 사용법 (0) | 2023.06.05 |
[JSP] JSP 자바 빈과 액션 태그 (0) | 2023.06.04 |
[JSP] 쿠키(Cookie)와 세션(session) (0) | 2023.06.04 |
[JSP] 서블릿(Servlet)이란? (0) | 2023.06.02 |