[JSP] 15. JSTL(JSP Standard Tag Library) #2 코어 태그(set, remove, if, choose, forEach, forTokens)

2022. 6. 29. 11:48JAVA/Servlet&JSP

1. 코어 태그

코어 태그 라이브러리는 if-else나 변수의 지정 등과 같이 논리적인 처리를 위해 사용되는 스크립트 코드를 대체하기 위한 태그를 제공합니다.

 

코어 태그 라이브러리

기능 분류 태그 설명
변수지원 set JSP에서 사용될 변수를 설정
remove 설정한 변수를 제거
흐름제어 if 조건에 따라 내부 코드를 수행
choose 다중 조건을 처리할 때 사용
forEach 컬렉션이나 Map의 각 항목을 처리할 때 사용함
forTokens 구분자로 분리된 각각의 토큰을 처리할 때 사용됨
URL 처리 import URL을 사용하여 다른 자원의 결과를 삽입
redirect 지정한 경로로 리다이렉트
url URL을 재작성
기타 태그 catch 예외 처리에 사용됨
out JspWriter에 내용을 알맞게 처리한 후 출력함

 

코어 태그 라이브러리 정의

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

위 정의에서 prefix 속성에 명시된 "c"값은 코어 태그 라이브러리를 호출할때 사용할 접두어를 의미합니다.

 

1.1 변수 지원 태그

변수지원 태그는 JSTL이 지원하는 태그에서 사용할 수 있는 변수를 설정하기 위해 사용됩니다.

  • set 태그
  • remove 태그

set 태그 형식

<c:set var="varName" value="someValue" scope="session"/>
  • var : 값을 지정할 변수의 이름
  • value : 변수의 값을 지정합니다. 표현식이나 EL을 사용하여 값을 지정할 수 있습니다.
  • scope : 변수를 저장할 영역을 지정합니다. 값은 page, request, session, application 중의 하나가 옵니다.

remove 태그 형식

<c:remove var="varName" scope="request"/>

 

다음 예제는 set 태그를 사용하여 변수에 이름을 저장하고 출력하는 예제입니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>set태그와 remove태그</title>
</head>
<body>
	<c:set var="name" value="김용환" scope="request"/>
	<p>제 이름은 ${name}입니다</p>
	
	<c:remove var="name" scope="request"/>
	<p>제 이름은 ${name}입니다</p>
</body>
</html>

위 실행결과를 통하여 name이라는 변수에 이름을 저장하고 출력하였습니다. 그리고 remove 태그를 사용하여 name 변수를 제거하고 다시 출력하니 이름 부분이 공백이 나온것을 볼 수 있습니다.

 

1.2 흐름 제어 태그

  • if 태그
  • choose 태그
  • forEach 태그
  • forTokens 태그

 

1.2.1 if 태그

if 태그는 이름에서 알 수 있듯이 자바 언어의 if 블록과 비슷한 기능을 제공합니다. 중첩된 if-else 블록과 같은 효과를 낼수는 없지만 단순한 if 블록을 쉽게 대체할 수 있기 때문에 많이 사용되는 JSTL 태그중의 하나입니다.

<c:if test="조건">
...
</c:if>

 

if 태그에 사용될 수 있는 속성

  • test : 필수 속성으로 속성값으로 EL 비교식을 가집니다.
  • var  : 조건 결과를 저장할 변수를 지정합니다.
  • scope  : 조건 결과를 저장할 변수의 저장 scope를 지정합니다.
<c:if test="${name eq '김용환'}" var="result" scope="session">

</c:if>

 

test 속성에 사용될 비교 연산자

eq(==) : 문자열 또는 숫자가 같으면 참입니다. null 또는 빈 문자열 인지도 확인할 수 있습니다.

<c:if test="${name == '홍길동'}">
<c:if test="${name eq '홍길동'}">
<c:if test="${name == null}">
<c:if test="${name eq null}">
<c:if test="${num == 5}">
<c:if test="${num eq 5}">

 

ne(!=) : 문자열 또는 숫자가 다르면 참입니다.

<c:if test="${name != '홍길동'}">
<c:if test="${name ne '홍길동'}">
<c:if test="${num != 5}">
<c:if test="${num ne 5}">

 

empty : List 또는 배열이 비어있거나, 문자열이 null 또는 빈 문자열이면 참을 반환합니다. 숫자 0은 eq(==)로 비교해야 합니다.

<c:if test="${empty name}">

 

not empty : List 또는 배열이 비어 있지 않을 경우, 문자열이 값이 있을 경우 참을 반환합니다.

<c:if test="${not empty name}">

 

논리연산자

비교연산자의 조합으로 논리 연산을 할 수 있는 논리연산자입니다.

 

and(&&) : 모두 참일때 참이 됩니다.

<c:if test="${a > b and c < d}">
<c:if test="${a > b && c < d}">

 

or(||) : 둘중 하나라도 참이면 참이 됩니다.

<c:if test="${a > b or c < d}">
<c:if test="${a > b || c < d}">

 

not(!) : 논리 연산자 결과를 반전시킵니다.

<c:if test="${not a == ''}">
<c:if test="${! a == ''}">

 

다음은 비교연산자와 비교 연산자를 사용한 예제입니다.

<%@ 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>if 태그</title>
</head>
<body>
	<c:set var="name" value="김용환" scope="request"/>

	<!-- eq(==) -->
	<c:if test="${name eq '김용환'}">
		<p>name eq '김용환' = true</p>
	</c:if>
	<c:if test="${name == '김용환'}">
		<p>name == '김용환' = true</p>
	</c:if>
	
	<!-- ne(!=) -->
	<c:if test="${name ne '홍길동'}">
		<p>name ne '홍길동' = true</p>
	</c:if>
	<c:if test="${name != '홍길동'}">
		<p>name != '홍길동' = true</p>
	</c:if>
	
	<!-- empty -->
	<c:if test="${empty name}">
		<p>empty name = true</p>
	</c:if>
	<!-- not empty -->
	<c:if test="${not empty name}">
		<p>not empty name = true</p>
	</c:if>
	
	<!-- and(&&) -->
	<c:if test="${1 > 0 and 2 > 1}">
		<p>1 > 0 and 2 > 1 = true</p>
	</c:if>
	<c:if test="${1 > 0 && 2 > 1}">
		<p>1 > 0 and 2 > 1 = true</p>
	</c:if>
	
	<!-- or(||) -->
	<c:if test="${1 > 0 or 2 < 1}">
		<p>1 > 0 or 2 < 1 = true</p>
	</c:if>
	<c:if test="${1 > 0 || 2 < 1}">
		<p>1 > 0 or 2 < 1 = true</p>
	</c:if>
	
	<!-- not(!) -->
	<c:if test="${not (1 < 0)}">
		<p>!(1 < 0) = true</p>
	</c:if>
	<c:if test="${!(1 < 0)}">
		<p>!(1 < 0) = true</p>
	</c:if>	
</body>
</html>

 

1.2.2 choose 태그

choose 태그는 자바의 switch 구문과 if-else 블록을 혼합한 형태로서 다수의 조건문을 하나의 블록에서 수행하고자 할때 사용됩니다.

<c:choose>
    <c:when test="${member.level == 'trial'}">
        ...
    </c:when>
    <c:when test="${member.level == 'regular'}">
        ...
    </c:when>
    <c:when test="${member.level == 'provider'}">
        ...
    </c:when>
    <c:otherwise>
        ...
    </c:otherwise>
</c:choose>

각각의 when 태그는 test 속성의 결과값이 true일 경우 내부 블록을 수행합니다. 만약 모든 when 태그가 false인경우 otherwise 태그가 수행됩니다.

 

다음 예제는 choose 태그를 사용한 예제입니다.

<%@ 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>Choose 태그</title>
</head>
<body>
	<c:choose>
		<c:when test="${param.name == 'bk'}">
			<p>당신의 이름은 ${param.name}입니다.</p>	
		</c:when>
		<c:when test="${param.age >= 18}">
			<p>당신은 18세 이상입니다.</p>	
		</c:when>
		<c:otherwise>
			<p>당신은 'bk'가 아니고 18세 이상이 아닙니다.</p>
		</c:otherwise>
	</c:choose>
</body>
</html>

 

1.2.3 forEach 태그

forEach 태그는 배열, Collection 또는 Map에 저장되어 있는 값들을 순차적으로 처리할 때 사용할 수 있는 태그로서, 자바의 for, do-while 등을 대신해서 사용할 수 있는 태그입니다.

<c:forEach var="변수" items="아이템">
 <p>${변수}</p>
</c:forEach>

 

begin, end 속성을 사용한 forEach 태그

  • begin : 반복문의 시작 범위
  • end    : 반복문의 종료 범위
<c:forEach var="i" begin="1" end="10">
	${i} 사용
</c:forEach>

 

step  속성을 사용한 forEach 태그

  • step : 반복문이 반복 될 때마다 var 속성의 값을 step 속성값만큼 증가시킴
<c:forEach var="i" begin="1" end="10" step="2">
 ${i}
</c:forEach>

변수 i는 1, 3, 5 , 7, 9의 값을 가지게 될 것입니다.

 

items, begin, end 속성을 함께 사용한 forEach 태그

items 속성과 함께 begin, end 속성을 사용하면 참조할 변수의 개수를 제한할 수 있습니다. 예를 들어 items="정수형 배열", begin = "2", end ="4"라면 해당 forEach 태그는 정수형 배열의 2번 인덱스부터 4번 인덱스까지만 값을 참고합니다.

<c:forEach var="i" items="${intArray}" begin="2" end="4">
${i}
</c:forEach>

 

해시맵을 참조하는 forEach 태그

		<%
			Map<String, Integer> map = new HashMap<String, Integer>();
			map.put("김용환", 30);
			map.put("홍길동", 50);
			map.put("이성룡", 70);
		%>
		<c:set var="map" value="<%=map%>"/>
		<c:forEach var="i" items="${map}">
			${i.key} = ${i.value}<br>
		</c:forEach>

 

1.2.4 forTokens 태그

forTokens 태그는 java.util.StringTokenizer 클래스와 같은 기능을 제공하는 태그입니다.

<c:forTokens var="token" items="문자열" delims="구분자">
	${token}
</c:forTokens>

 

다음은 forTokens 태그를 사용한 예제입니다.

	<!-- 콤마를 구분자로 사용한 forTokens 태그 -->
	<c:forTokens var="token" items="빨강색, 주황색, 노란색, 초록색, 파랑색, 남색, 보라색" delims=",">
		${token}
	</c:forTokens>

 

References

source code : https://github.com/yonghwankim-dev/JSP2.0
JSP 2.0 프로그래밍 기초부터 중급까지
JSTL - <c:if>, <c:choose> 태그 사용법