본문 바로가기

JSP

[JSP] JSTL

JSTL(JSP Standard Tag Libaray)

  • 표준 태그 라이브러리
  • JSP 페이지에서 일반적인 핵심 기능을 캡슐화하여 제공하는 JSP 태그의 컬렉션이다.
  • 제어문, 포매팅 작업, XML문서, 국제화 태그 및 SQL 태그 조작을 위한 태그에 대한 지원을 하고있다.
  • 기존 사용자 정의 태그를 통합하기 위한 프레임 워크또한 제공한다.

JSTL의 태그 종류

  • Core
    • 프로그래밍에서 기본적으로 필요한 변수선언, 제어문, 일반적인 로직등을 편리하게 사용하기 위한 기능제공
  • Formatting
    • 날짜, 시간, 숫자 및 텍스트의 포맷, 국제화에 따른 언어 설정의 기능들이 제공된다.
  • SQL
    • RDBMS와 상호작용을 하는 태그들을 지원한다.
  • XML
    • XML문서를 생성하고 조작하는 방법을 제공한다.
  • Functions
    • 일반적인 문자열 조작 함수를 제공한다.

JSTL core

  • 기존 JSP의 스크립틀릿을 이용해 제어문 및 변수선언 방법의 떨어지는 가독성을 보안하기 위해 사용된다.
  • JSTL라이브러리를 다운받은 후 WEB-INF/lib 폴더에 넣어준 뒤 JSP페이지에 최상단에 taglib를 추가해주기만하면된다.
  • <%@ taglib prefix="c" uri="http://java.sum.com/jstl/core">

JSTL core Tags

태그명 설명
<c:set> JSTL 변수에 값을 할당
<c:remove> JSTL 변수 제거
<c:out> 변수 출력
<c:if> Java의 if문에 해당된다.
<c:choose> switch문과 비슷하다. when과 otherwise태그와 함께 사용한다.
<c:when> switch문의 case와 비슷하나 조건을 비교할 수 있어
if문처럼 쓰일 수 있다.
<c:otherwise> switch문의 default와 비슷하다.
if문의 else처럼 쓰일 수 있다.
<c:forEach> Java의 향상된 for문과 사용방식이 비슷하다.
<c:import> include지시자 또는 액션태그와 비슷하다.
<c:redirect> 태그명 그대로의 의미와 같다. redirect를 한다.
<c:url> 인터넷주소값을 변수로 사용한다.
<c:param> 요청 url에 변수명과 값을 정의한다.
<c:catch> try-catch문처럼 예외처리를 위한 기능을 지원한다.

set, remove, out 예제

  • JSP의 스크립틀릿과 EL의 내부객체, JSTL의 <c:set>태그를 통해 변수를 선언한 뒤 사용해보자
<%@ 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">
<title>JSTL</title>
</head>
<body>
	<%
		String str1 = "java1";
		String str2 = "jsp1";
		
		pageContext.setAttribute("str3", "java2");
		pageContext.setAttribute("str4", "jsp2");
	%>
	<c:set var="str5" value="java3" scope="page"></c:set>
	<c:set var="str6" value="jsp3" scope="page"></c:set>
	
	<h1>Core Tags</h1>
	<h2>scriptlet + JSTL</h2>
	<div>${ str1 }</div>
	<c:remove var="str2"/>
	<div><c:out value="str2"></c:out></div>
	
	<hr>
	<h2>EL(내부 객체) + JSTL</h2>
	<div><c:out value="${str3}"></c:out></div>
	<c:remove var="str4"/>
	<div><c:out value="${str4}" default="값이 없을때 실행됩니다."></c:out></div>
	
	<hr>
	<h2>JSTL</h2>
	<div><c:out value="${str5}"></c:out></div>
	<c:remove var="str6"/>
	<div><c:out value="${str6}" default="값이 없을때 실행됩니다."></c:out></div>
	
	<hr>
	<% String str4 = (String)pageContext.getAttribute("str3") + " in script"; %>
	<div><%= str4 %></div>
</body>
</html>

결과

  • 결과를보면 스크립트릿에서 선언된 자바변수는 EL의 표현식을 이용할 수 없고, JSTL의 태그또한 이용할 수없기 때문에 변수 str1은 무시되고, st2는 JSTL의 <c:out>에 의해 순수한 리터럴이 출력된것을 알 수 있다.
  • 따라서 JSTL은 EL과 혼합하여 사용되기 위한 라이브러리임을 알 수 있다.
  • 또한 JSTL은 웹 애플리케이션 저장소에 저장된 객체만을 사용할 수 있으며, 변수의 선언 또한 해당 저장소에 값을 저장할 뿐이다. 즉 JSP 또는 EL의 내부객체를 이용한 방식임을 추측할 수 있다.
  • (온전히 제 추측이므로 틀릴 수 있습니다. 의견주시면 감사하겠습니다.)

제어문 예제

<%@page import="java.util.Arrays"%>
<%@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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP JSTL</title>
</head>
<body>
	<%
		pageContext.setAttribute("id", "java");
		pageContext.setAttribute("color", "green");
		
		List<String> names = Arrays.asList("abc", "java", "jps", "etc");
		pageContext.setAttribute("names", names);
		String str = "java, jsp; spring, android";
		pageContext.setAttribute("str", str);
	%>
	<h1>Core Tags</h1>
	<h2>If</h2>
	<c:if test="${!empty pageScope.id}">
	<div>not empty</div>
	</c:if>
	
	<h2>If-else</h2>
	<c:choose>
		<c:when test="${pageScopre.color eq 'yellow'}">
			<c:set var="c" value="yellow"></c:set>
		</c:when>
		<c:when test="${pageScopre.color eq 'yellow'}">
			<c:set var="c" value="red"></c:set>
		</c:when>
		<c:otherwise>
			<c:set var="c" value="green"></c:set>
		</c:otherwise>
	</c:choose>
	<div>색 : <c:out value="${c}"></c:out></div>
	
	<h2>for-each</h2>
	<c:forEach var="name" items="${names}">
		<div><c:out value="${name}"></c:out></div>
	</c:forEach>
	<hr>
	<c:forEach var="i" items="${names}" begin="0" step="1" end="2">
		<div>${i}</div>
	</c:forEach>
	
	<h2>split str</h2>
	<hr>
	<c:forTokens items="${str}" var="str" delims=", ;">
		<div>${str}</div>
	</c:forTokens>
	
	<h2>import</h2>
	<div>${pageScope.id}</div>
</body>
</html>

결과

그외 예제

<%@ 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">
<title>Insert title here</title>
</head>
<body>
	<h1>import eq include</h1>
	<c:import url="http://localhost:8090/jstl/coreTags2.jsp" />
	
	<h1>url</h1>
	<c:url var="url1" value="https://www.google.co.kr">
		<c:param name="q" value="JSPStudy"></c:param>
		<c:param name="safe" value="on"></c:param>
	</c:url>
	<a href="${url1}">구글에서 JSPStudy 검색</a>
	
	<h1>redirect</h1>
	<%-- <c:redirect url="http://www.oracle.com"></c:redirect> --%>
	
	<h1>catch</h1>
	<c:catch var="ex">
		<%
			int arr[] = {1,2,3};
			int sum = arr[0] + arr[1] + arr[2] + arr[3];
		%>
	</c:catch>
	${ex}
	
</body>
</html>

결과

  • 순서대로 import + catch, url, redirect한 결과이다.

'JSP' 카테고리의 다른 글

[JSP/Servlet] RequestDispatcher와 JSP Model2  (0) 2023.03.16
[JSP]EL  (0) 2023.03.16
[WEB] HTTP 프로토콜에서 상태를 지속시키기 위한 방법들  (1) 2023.03.15
[JSP] Java Beans와 JSP 빈즈태그  (0) 2023.03.15
[JSP] 내부객체  (0) 2023.03.15