JSTL (JSTL (JavaServer Pages Standard Tag Library)
: 자바 웹 애플리케이션 개발을 위한 표준 태그 라이브러리
JSTL은 JSP 페이지에서 코드의 가독성을 향상시키고, 비즈니스 로직과 뷰를 분리시켜준다.
목적: JSP 페이지에서 자바 코드를 최소화
JSTL API 개발문서
JSTL 종류
종류 | 설명 |
Core (<c:> 태그) | 변수 설정, 반복문, 조건문 등 JSP의 기본 제어 구조를 제공합니다. 예를 들어, <c:forEach>, <c:if>, <c:set> 등의 태그가 포함됩니다. |
XML (<x:> 태그) | XML 데이터를 처리하는데 사용되며, XML 파싱, 검색, 변환 등의 작업을 수행할 수 있습니다. <x:parse>, <x:out>, <x:forEach> 등의 태그가 포함됩니다. |
Formatting (<fmt:> 태그) | 날짜, 시간, 숫자 등의 데이터 형식을 다루는데 사용됩니다. 데이터 포맷팅 및 다국어 지원을 위한 태그들이 포함됩니다. <fmt:formatDate>, <fmt:parseDate>, <fmt:setTimeZone> 등의 태그가 있습니다. |
SQL (<sql:> 태그) | 데이터베이스와 연동할 때 사용되며, SQL 쿼리 실행 및 결과 처리를 지원합니다. <sql:setDataSource>, <sql:query>, <sql:update> 등의 태그가 있습니다. |
Function (<fn:> 함수) | 문자열 처리 및 비교를 위한 함수들을 제공합니다. 예를 들어, <fn:length>, <fn:toUpperCase>, <fn:substring> 등의 함수가 있으며, 이러한 함수는 <c:out>와 함께 사용됩니다. |
taglib 디렉티브 태그
JSTL 라이브러리 | 디렉티브 태그 |
Core (<c:> 태그) | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> |
XML (<x:> 태그) | <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> |
Formatting (<fmt:> 태그) | <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> |
SQL (<sql:> 태그) | <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> |
Functions (<fn:> 함수) | <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> |
taglib 디렉티브 태그
: JSP 에서 JSTL, EL(표현 언어), 커스텀 태그 등 태그 라이브러리를 설정하는 태그
JSTL 태그 라이브러리 사용하기
JSTL (JavaServer Pages Standard Tag Library)
: Java 웹 애플리케이션에서 사용할 수 있는 표준 태그 라이브러리
Tomcat 10 버전 이상에서 사용
•
jstl
•
jstl-api
•
servlet-api
jstl
jstl-api
servlet-api
Tomcat 8.5 에서 사용
•
taglibs-standard-impl
•
taglibs-standard-spec
•
taglibs-standard-jstlel
•
taglibs-standard-compat
1.
JSTL 태그 라이브러리 다운로드
a.
taglibs-standard-compat-1.2.5.jar
b.
taglibs-standard-impl-1.2.5.jar
c.
taglibs-standard-jstlel-1.2.5.jar
d.
taglibs-standard-spec-1.2.5.jar
2.
JSP 프로젝트 에 포함하기
a.
[WEB-INF] > [lib] 폴더에 추가
JSTL 태그 라이브러리 추가하기
3.
JSP 코드 상단에 taglib 디렉티브 태그 추가
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
JavaScript
복사
4.
코드 작성
<%-- taglib 디렉티브 태그 추가 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>taglib 디렉티브 - JSTL</title>
</head>
<body>
<%-- WEB-INF > lib : jstl-xxx-impl.jar 라이브러리 추가 --%>
<c:forEach var="k" begin="1" end="10" step="1">
<c:out value="${k}" />
</c:forEach>
</body>
</html>
JavaScript
복사
JSP 동작순서
서버 측:
1.
Java (스크립틀릿, 표현식, 선언)
2.
JSTL
3.
EL
4.
HTML 생성 및 응답 전송
클라이언트 측:
1.
HTML 파싱
2.
CSS 로드 및 적용
3.
JavaScript 로드 및 실행
4.
페이지 렌더링
JSTL - core
태그 또는 함수 | 설명 |
<c:out> | 표현식을 평가하고 결과를 출력합니다. |
<c:set> | 변수를 설정하고 값을 할당합니다. |
<c:remove> | 변수를 제거합니다. |
<c:if> | 조건을 평가하고 조건이 참일 때 내용을 실행합니다. |
<c:choose> | 다중 조건을 처리하고 조건에 따라 다른 부분을 실행합니다. |
<c:when> | <c:choose> 내에서 조건을 정의합니다. |
<c:otherwise> | <c:choose> 내에서 모든 조건이 거짓인 경우 실행할 부분을 정의합니다. |
<c:forEach> | 컬렉션 또는 배열을 반복하면서 내용을 실행합니다. |
<c:forTokens> | 토큰을 구분자로 사용하여 문자열을 분할하고 내용을 실행합니다. |
<c:param> | URL 링크 또는 리다이렉트 요청에 매개변수를 추가합니다. |
<c:url> | URL을 생성하고 매개변수를 추가할 수 있습니다. |
<c:import> | 외부 리소스 또는 JSP 페이지를 가져와서 포함합니다. |
<c:redirect> | 지정된 URL로 리다이렉트합니다. |
<c:catch> | 예외를 처리하는 데 사용되며 <c:catch> 내에서 예외 정보를 사용할 수 있습니다. |
JSTL - fmt
메소드 | 설명 |
<fmt:formatDate> | 날짜를 지정된 형식으로 포맷하고 출력합니다. |
<fmt:formatNumber> | 숫자를 지정된 형식으로 포맷하고 출력합니다. |
<fmt:formatDouble> | 부동 소수점 숫자를 지정된 형식으로 포맷하고 출력합니다. |
<fmt:formatLong> | 정수를 지정된 형식으로 포맷하고 출력합니다. |
<fmt:formatMessage> | 메시지를 검색하고 지정된 형식으로 메시지를 포맷하고 출력합니다. |
<fmt:setLocale> | 페이지 또는 세션의 로케일을 설정합니다. |
<fmt:setBundle> | 메시지 리소스 번들을 설정합니다. |
<fmt:setTimeZone> | 페이지 또는 세션의 타임 존을 설정합니다. |
<fmt:requestEncoding> | 요청의 캐릭터 인코딩을 설정합니다. |
<fmt:responseEncoding> | 응답의 캐릭터 인코딩을 설정합니다. |
<fmt:parseDate> | 문자열을 날짜로 파싱하고 지정된 형식으로 포맷하고 출력합니다. |
<fmt:parseNumber> | 문자열을 숫자로 파싱하고 지정된 형식으로 포맷하고 출력합니다. |
<fmt:timeZone> | 타임 존을 설정하고 반환합니다. |
<fmt:message> | 메시지 리소스 번들에서 메시지를 검색하고 출력합니다. |
<fmt:setTimeZone> | 페이지 또는 세션의 타임 존을 설정합니다. |
<fmt:setRequestEncoding> | 요청의 캐릭터 인코딩을 설정합니다. |
<fmt:setResponseEncoding> | 응답의 캐릭터 인코딩을 설정합니다. |
JSTL - sql
메소드 또는 태그 | 설명 |
<sql:setDataSource> | 데이터베이스 연결을 설정하고 데이터베이스와 연결된 데이터 소스를 지정합니다. |
<sql:update> | INSERT, UPDATE 또는 DELETE 문을 실행하여 데이터베이스를 업데이트합니다. |
<sql:query> | SELECT 쿼리를 실행하고 결과 집합을 저장합니다. |
<sql:param> | SQL 쿼리에 매개변수를 바인딩합니다. |
<sql:dateParam> | SQL 쿼리에 날짜 형식의 매개변수를 바인딩합니다. |
<sql:transaction> | 트랜잭션을 시작하고 종료합니다. |
JSTL - functions
함수 | 설명 |
fn:length() | 문자열의 길이 또는 컬렉션의 요소 수를 반환합니다. |
fn:toUpperCase() | 문자열을 대문자로 변환합니다. |
fn:toLowerCase() | 문자열을 소문자로 변환합니다. |
fn:substring() | 문자열의 일부분을 추출합니다. |
fn:indexOf() | 문자열에서 지정된 문자 또는 문자열의 인덱스를 찾습니다. |
fn:replace() | 문자열에서 특정 문자 또는 문자열을 다른 문자열로 대체합니다. |
fn:split() | 문자열을 지정된 구분자를 기준으로 분할하여 배열로 반환합니다. |
fn:trim() | 문자열의 앞뒤 공백을 제거합니다. |
fn:escapeXml() | 문자열을 XML 엔터티로 이스케이프합니다. |
fn:contains() | 문자열이 지정된 부분 문자열을 포함하는지 여부를 확인합니다. |
fn:startsWith() | 문자열이 지정된 접두사로 시작하는지 여부를 확인합니다. |
fn:endsWith() | 문자열이 지정된 접미사로 끝나는지 여부를 확인합니다. |
fn:join() | 배열 또는 컬렉션의 요소를 지정된 구분자로 연결합니다. |
fn:containsIgnoreCase() | 대소문자를 무시하고 문자열이 지정된 부분 문자열을 포함하는지 여부를 확인합니다. |
fn:startsWithIgnoreCase() | 대소문자를 무시하고 문자열이 지정된 접두사로 시작하는지 여부를 확인합니다. |
fn:endsWithIgnoreCase() | 대소문자를 무시하고 문자열이 지정된 접미사로 끝나는지 여부를 확인합니다. |
fn:escapeCsv() | 문자열을 CSV(Comma-Separated Values) 형식으로 이스케이프합니다. |
fn:replaceIgnoreCase() | 대소문자를 무시하고 문자열에서 특정 문자 또는 문자열을 다른 문자열로 대체합니다. |
fn:containsWhitespace() | 문자열에 공백 문자가 포함되어 있는지 여부를 확인합니다. |
fn:join() | 문자열 배열 또는 컬렉션의 요소를 지정된 구분자로 연결합니다. |
fn:substringAfter() | 문자열에서 지정된 문자 뒤의 부분 문자열을 추출합니다. |
fn:substringBefore() | 문자열에서 지정된 문자 앞의 부분 문자열을 추출합니다. |
fn:containsAny() | 문자열이 주어진 문자 중 어느 하나라도 포함하고 있는지 여부를 확인합니다. |
fn:containsAll() | 문자열이 주어진 문자 모두를 포함하고 있는지 여부를 확인합니다. |
fn:escapeXmlAttr() | XML 속성 값으로 사용할 수 있는 문자열을 XML 엔터티로 이스케이프합니다. |
JSTL - core
•
JSTL core 지시자 (디렉티브 태그)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Java
복사
변수 선언 및 참조
•
변수 선언 <c:set>
•
변수 참조 <c:out>
<!--
* 실행순서
HTML → CSS → JavaScript → 스크립틀릿(자바) → JSTL
-->
<!-- 스크립틀릿 변수 선언 -->
<% String name = "김조은1"; %>
<!-- 스크립틀릿 변수 출력 -->
<% out.print(name); %>
<hr>
<!-- JSTL 변수 선언 -->
<%-- <c:set var="변수명" value="값" /> --%>
<c:set var="name" value="김조은2" />
<!-- JSTL 출력 -->
<%-- <%= name %> --%> <!-- JSTL 선언한 변수는 표현문으로 사용불가 -->
<c:out value="${name}" />
Java
복사
조건문
•
<c:if>
<!-- 단일 조건 -->
<!-- c:if 는 단독 조건문만 가능 (else 개념이 없음) -->
<c:if test="${number % 2 == 0}">
<c:out value="${number}" /> 은 짝수 입니다.
</c:if>
<c:if test="${number % 2 == 1}">
<c:out value="${number}" /> 은 홀수 입니다.
</c:if>
HTML
복사
•
<c:choose>
!-- 다중 조건 -->
<c:choose>
<c:when test="${number % 2 == 0}">
<c:out value="${number}" /> 은 짝수 입니다.
</c:when>
<c:when test="${number % 2 == 1}">
<c:out value="${number}" /> 은 홀수 입니다.
</c:when>
<c:otherwise>
숫자가 아닙니다.
</c:otherwise>
</c:choose>
Java
복사
반복문
•
<c:forEach>
<h1>리스트 목록</h1>
<%
ArrayList<String> list = new ArrayList<String>();
list.add("아이템1");
list.add("아이템2");
list.add("아이템3");
// JAVA -> JSTL
pageContext.setAttribute("list", list);
%>
<c:forEach items="${list}" var="item">
${item}
</c:forEach>
HTML
복사
JSTL - fmt
•
JSTL fmt 지시자 (디렉티브 태그)
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
Java
복사
날짜 포맷
<%
Date now = new Date();
pageContext.setAttribute("now", now);
%>
<h1><c:out value="${now}" /></h1>
<h1><fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss" /></h1>
<h1><fmt:formatDate value="${now}" pattern="yyyy년 MM월 dd일 HH시 mm분 ss초" /></h1>
<br>
<h1><fmt:formatDate value="${now}" type="date" /></h1>
<h1><fmt:formatDate value="${now}" type="time" /></h1>
<h1><fmt:formatDate value="${now}" type="both" /></h1>
Java
복사
숫자 포맷
<h1><fmt:formatNumber value="12.4567" type="number" /></h1>
<h1><fmt:formatNumber value="12.4567" type="currency" /></h1>
<h1><fmt:formatNumber value="12.4567" type="percent" /></h1>
<h1><fmt:formatNumber value="12.4567" pattern=".0" /></h1>
<h1><fmt:formatNumber value="12.4567" pattern="₩0.00" /></h1>
Java
복사
JSTL - sql
•
JSTL sql 지시자 (디렉티브 태그)
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
Java
복사
테이블 생성
DROP TABLE IF EXISTS board;
CREATE TABLE board (
no INT AUTO_INCREMENT PRIMARY KEY COMMENT 'PK',
id VARCHAR(64) NOT NULL UNIQUE COMMENT 'UK',
title VARCHAR(255) NOT NULL COMMENT '제목',
writer VARCHAR(100) NOT NULL COMMENT '작성자',
content TEXT NOT NULL COMMENT '내용',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '작성일',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일'
) COMMENT '게시판';
SQL
복사
샘플 데이터 추가
-- 샘플 데이터 추가
INSERT INTO board (id, title, writer, content ) VALUES (UUID(), '제목01', '작성자01', '내용01' );
INSERT INTO board (id, title, writer, content ) VALUES (UUID(), '제목02', '작성자02', '내용02' );
INSERT INTO board (id, title, writer, content ) VALUES (UUID(), '제목03', '작성자03', '내용03' );
INSERT INTO board (id, title, writer, content ) VALUES (UUID(), '제목04', '작성자04', '내용04' );
INSERT INTO board (id, title, writer, content ) VALUES (UUID(), '제목05', '작성자05', '내용05' );
-- 전체 실행
-- 데이터 조회 (alt+S)
SELECT * FROM board;
SQL
복사
데이터 소스 설정
<sql:setDataSource var="dataSource"
url="jdbc:mysql://localhost:3306/aloha?serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true&useSSL=false"
driver="com.mysql.cj.jdbc.Driver"
user="aloha"
password="123456"
/>
Java
복사
데이터 조회
<sql:query var="list" dataSource="${dataSource}">
SELECT * FROM board
</sql:query>
Java
복사
데이터 목록
<table border="1">
<tr>
<c:forEach var="col" items="${list.columnNames}">
<th><c:out value="${col}" /></th>
</c:forEach>
</tr>
<c:forEach var="row" items="${list.rowsByIndex}">
<tr>
<c:forEach var="col" items="${row}" varStatus="i">
<td>
<c:out value="${col}"/>
</td>
</c:forEach>
</tr>
</c:forEach>
</table>
HTML
복사
데이터 추가
<sql:update dataSource="${dataSource}" var="resultSet">
INSERT INTO board (title, writer, content)
VALUES( ?, ?, ? )
<sql:param value="${title}" />
<sql:param value="${writer}" />
<sql:param value="${content}" />
</sql:update>
HTML
복사
데이터 수정
<sql:update dataSource="${dataSource}" var="resultSet">
UPDATE board
SET title = ?
,writer = ?
,content = ?
WHERE board_no = ?
<sql:param value="${title}" />
<sql:param value="${writer}" />
<sql:param value="${content}" />
<sql:param value="${boardNo}" />
</sql:update>
HTML
복사
데이터 삭제
<sql:update dataSource="${dataSource}" var="resultSet">
DELETE FROM board
WHERE baord_no = ?
<sql:param value="${boardNo}" />
</sql:update>
HTML
복사
JSTL - functions
•
JSTL functions 지시자 (디렉티브 태그)
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
Java
복사
<h1>contains() 함수</h1>
<p>
문자열 포함 여부
: ${fn:contains("Hello JSTL~!", "JSTL")}
</p>
<p>
문자열 포함 여부(대소문자 구분X)
: ${fn:containsIgnoreCase("Hello JSTL~!", "jstl")}
</p>
<p>
문자열 포함 여부
: ${fn:contains("Hello JSTL~!", "JSP")}
</p>
<hr>
<h1>toUpperCase(), toLowerCase() 함수</h1>
<p>
hello jstl~!
: ${fn:toUpperCase("hello jstl~!")}
</p>
<p>
Hello JSTL~!
: ${fn:toLowerCase("Hello JSTL~!")}
</p>
<hr>
<h1>length() 함수</h1>
<p>
글자수 : Hello JSTL~! ( ${fn:length("Hello JSTL~!")} )
</p>
<h1>split() 함수</h1>
<c:set var="texts" value="${fn:split('Hello JSTL~!', ' ')}" />
<c:forEach var="i" begin="0" end="${fn:length(texts)-1}">
<p>texts[${i}] : ${texts[i]}</p>
</c:forEach>
HTML
복사








