관리 메뉴

Just Do it

표준 태그 라이브러리 (JSTL) 본문

신입 개발자가 되기 위해 공부했던 독학 자료들/JSP

표준 태그 라이브러리 (JSTL)

Seojoo21 2022. 2. 6. 13:54

*출처: CHAPTER 12 표현 언어(Expression Language), 최범균의 JSP 2.3 웹 프로그래밍 기초부터 중급까지, 최범균, 가메출판사

 

0. 표준 태그 라이브러리 (JSTL)

JSP는 <jsp:include>와 같은 태그를 개발자가 추가할 수 있는 기능을 제공하는데 이를 커스텀 태그라고 한다. 커스텀 태그 중에서 많이 사용되는 것들을 모아서 JSTL (JSP Standard Tag Library)라는 표준을 만들었다. 이 표준 태그 라이브러리를 사용하면 스크립트릿 코드의 사용을 줄이면서 더욱 간결하고 이해하기 쉬운 JSP 코드를 작성할 수 있다.

 

1. JSTL이란?

JSP는 스크립트릿과 표현식 등의 스크립트 코드와 HTML 코드가 뒤섞이게 되는데 이렇게 뒤섞인 JSP 코드는 알아보기가 쉽지 않다. 

JSP는 실행 코드와 화면을 구성하는 HTML 코드를 쉽게 섞을 수 있어 개발이 편리하지만, 반대로 스크립트 코드와 HTML 코드가 섞이면서 코드의 가독성은 도리어 나빠진다.

 

HTML 태그와 비슷한 태그를 사용해서 반복문이나 조건문을 처리할 수 있다면, 스크립트 코드를 사용할 때보다 보기 좋고 이해하기 쉬운 코드를 작성할 수 있을 것이다. 

 

JSP 페이지에서 많이 사용되는 논리적인 판단, 반복 처리, 포맷 처리를 위한 커스텀 태그를 표준으로 만들어서 정의한 것이 바로 JSTL이다.

 

2.  JSTL이 제공하는 태그의 종류 

라이브러리 주요 기능 접두어 관련 URI
*코어 변수 지원
흐름 제어
URL 처리
c http://java.sun.com/jsp/jstl/core
XML XML 코어
흐름 제어
XML 변환 
x http://java.sun.com/jsp/jstl/xml
*국제화 지역
메시지 형식
숫자 및 날짜 형식
fmt http://java.sun.com/jsp/jstl/fmt
데이터베이스 SQL sql http://java.sun.com/jsp/jstl/sql
*함수 컬렉션 처리 
String 처리 
fn http://java.sun.com/jsp/jstl/functions

- 이 중 코어, 국제화, 함수 라이브러리를 많이 사용한다.

- 접두어: JSP 페이지가 커스텀 태그를 호출할 때 사용한다. 

- 관련 URI: JSTL이 제공하는 커스텀 태그를 구분해주는 식별자이다. 이 식별자를 이용해서 JSP 페이지에서 사용할 커스텀 태그 라이브러리를 선택할 수 있다. 

 

3. 코어 태그 

-코어 태그 라이브러리는 변수 설정이나 if-else와 같은 논리 처리에 사용되는 스크립트 코드를 대체하는 태그를 제공한다. 

-코어 태그 라이브러리를 사용하려면 JSP 페이지에 다음과 같이 taglib 디렉티브를 추가해야한다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
기능 분류 태그 설명
변수 지원 set JSP에서 사용할 변수를 설정한다.
remove 설정한 변수를 제거한다.
흐름 제어 if 조건에 따라 내부 코드를 수행한다. 
choose 다중 조건을 처리할 때 사용된다. 
forEach 컬렉션이나 Map의 각 항목을 처리할 때 사용된다. 
forTokens 구분자로 분리된 각각의 토큰을 처리할 때 사용된다. 
URL 처리  import URL을 사용하여 다른 자원의 결과를 삽입한다. 
redirect 지정한 경로로 리다이렉트 한다. 
url URL을 재작성 한다. 
기타 태그 catch 익셉션을 처리할 때 사용한다. 
out JspWriter에 내용을 출력한다. 

 

3.1 변수 지원 태그

3.1.1 <c:set> 태그

- <c:set> 태그는 EL 변수의 값이나 EL 변수의 프로퍼티 값을 지정할 때 사용된다. <c:set> 태그의 첫 번째 사용방법은 EL 변수를 생성하는 것으로서 형식은 다음과 같다.

<c:set var="변수명" value="값" [scope="영역"] />
<c:set var="변수명" [scope="영역"]> 값 </c:set>

*scope: 변수를 저장할 영역을 지정한다. page, request, session, application 중 하나가 오는데 지정하지 않으면 page를 기본값으로 사용한다. 

 

-<c:set>태그의 두 번째 사용방법은 객체의 프로퍼티 값을 설정하는 것이다.

<c:set target="대상", property="프로퍼티이름", value="값"/>
<c:set target="대상", property="프로퍼티이름">값</c:set>

 

3.1.2 <c:remove> 태그

- <c:remove> 태그는 set 태그로 지정한 변수를 삭제할 때 사용한다. 

<c:remove var="varName" [scope="영역"] />

*삭제할 변수의 scope를 지정하지 않으면 동일한 이름으로 저장된 모든 영역의 변수를 삭제한다. 

 

 

3.2 흐름 제어 태그 

3.2.1 <c:if> 태그

- 자바의 if 블록과 비슷한 기능을 제공한다. 중첩된 if-else 블록과 같은 효과를 낼 수는 없지만 단순한 if 블록을 쉽게 대체할 수 있기 때문에 많이 사용한다.

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

 

-<c:if> 태그의 test 속성의 계산 결과를 var 속성으로 지정한 EL 변수에 저장할 수 있다. 예를 들어, 다음 코드는 <%= someCondition %>의 값을 testResult EL 변수에 저장한다.

<c:if test="<%= someCondition %>" var="testResult">
...
</c:if>
테스트 조건 검사 결과는 ${testResult}임

 

 

3.2.2 <c:choose>, <c:when>, <c:otherwise> 태그

 

- <c:choose> 태그는 자바의 switch 구문과 if-else 블록을 혼합한 형태로서 다수의 조건문을 하나의 블록에서 수행할 때 사용한다. 사용 방법은 다음과 같다.

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

 

3.2.3 <c:forEach> 태그

- <c:forEach> 태그는 배열, Collection 또는 Map에 저장되어 있는 값들을 순차적으로 처리할 때 사용한다. 자바의 for, do-while등을 대신하여 사용할 수 있다. 사용 방법은 다음과 같다.

<c:forEach var="변수" items="아이템">
...
</c:forEach>

 

- items 속성에는 Map, 배열, Collection이 올 수 있다. 

 

- forEach 태그를 사용해서 자바의 for 구문과 같은 효과를 낼 수 있는데 다음과 같이 begin 속성과 end 속성을 통해 범위를 지정해서 forEach 태그를 사용하면 된다. 

<c:forEach var="i" begin="1" end="10"> // 변수 i는 1부터 10까지의 값을 차례대로 갖는다.
	${i} 사용
</c:forEach>

 

- step 속성을 사용하면 증가분을 변경할 수 있다. 예를 들어 다음과 같이 step 속성값으로 2를 주면 변수 i는 1,3,5,7,9의 값을 차례대로 갖는다. 

<c:forEach var="i" begin="1" end="10" step="2">
 ${i} 사용
</c:forEach>

 

-items 속성과 함께 begin, end 속성을 사용하면 참조할 변수의 개수를 제한할 수 있다. 예를 들어, 정수형 배열에서 2번 인덱스부터 4번 인덱스까지만 값을 참고하고 싶다면 다음과 같이 begin, end 속성을 지정하면 된다. 

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

 

-items 속성값으로 List와 같은 컬렉션이나 배열을 전달한 경우, forEach 태그의 몸체에서 현재 사용하는 항목의 인덱스 값을 사용해야할 때가 있다. 이 경우 varStatus 속성을 이용해서 인덱스 값을 사용할 수 있다.

<c:forEach var="item" items="<%=someItemList%>" varStatus="status">
	${status.index+1} 번째 항목: ${item.name}
</c:forEach>

 

3.2.4 <c:forToken> 태그

- <c:forToken> 태그는 java.util.StringTokenizer 클래스와 같은 기능을 제공하는 태그로서 기본 형식은 다음과 같다.

<c:forToken var="token" items="문자열" delims="구분자">
	${token}의 사용
</c:forToken>

 

-<c:forToken> 태그는 items 속성으로 전달받은 문자열을 구분자를 이용해서 나누고, 구분한 각 문자열을 각 var 속성에 명시한 변수에 저장한다. 예를 들어, 아래 코드는 items 속서으이 값을 콤마(,)로 나눈 "red", "green", "blue" 문자열을 color 변수에 차례대로 대입한다. 

<c:forToken var="color" items="red,green,blue" delim=",">
	${color}
</c:forToken>

 

-<c:forToken> 태그는 <c:forEach> 태그와 동일하게 begin, end, step, varStatus 속성을 제공한다. 

 

 

3.3 URL 처리 태그

- URL 생성: <c:url> 태그

*context root 자동 추가 기능과 session id 자동 추가 기능이 있다.

<c:url value="URL" [var="varName"][scope="영역"]> // var속성, scope속성은 생략 가능 
	<c:param name="이름" value="값" /> // param 태그를 이용하여 파라미터를 URL에 추가 가능 
</c:url>

예) context root 자동 추가 

   <form action="<c:url value="/register/save"/>" method="post" onsubmit="return formCheck(this)">
   //context root=ch2Review이다. 원래 value="ch2Review/register/save/" 라고 적어야하는데 <c:url /> 태그로 conext root를 자동 추가함

웹에서 소스 보기를 눌러보면 아래와 같이 자동으로 context root가 들어갔음을 확인할 수 있다.

 

- 리다이렉트 처리: <c:redirect> 태그 

* <c:redirect>태그를 실행하면 그 이후의 코드는 실행되지 않는다. 

<c:redirect url="URL" [context="컨텍스트경로"]> // 컨텍스트경로가 지정되지 않으면 현재 웹 어플리케이션의 컨텍스트가 경로로 들어간다. 
	<c:param name="이름" value="값" /> // param 태그를 이용하여 파라미터를 URL에 추가 가능 
</c:url>