본문 바로가기

프로그래밍/JSP

[JSP 요약 정리] 13. 표준 태그 라이브러리(JSTL)

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

1) JSTL(JSP Standard Tag Library)

- 커스텀 태그 중 자주 사용되는 태그를 모아 표준화한 라이브러리

- 커스텀 태그: JSP에서 필요에 따라 새로운 태그를 추가할 수 있는 기능

- JSTL 다운로드(다운로드 후 WEB-INF/lib 디렉토리에 복사)

https://mvnrepository.com/artifact/javax.servlet/jstl/1.2


2) JSTL이 제공하는 태그

- 코어(c) : 변수 지원, 흐름 제어, URL 처리

- XML(x) : XML 코어, 흐름 제어, XML 변환

- 국제화(fmt) : 지역, 메시지 형식, 숫자 및 날짜 형식

- 데이터베이스(sql) : SQL

- 함수(fn) : 컬렉션 처리, String 처리

* 각각 taglib 디렉티브를 추가해야 함

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

-> URI 자리에 각각 core, xml, fmt, sql, functions 를 삽입


3) 코어 태그

- 논리 처리에 사용되는 스크립트 코드를 대체하는 태그 제공

- JSP 페이지에 taglib 디렉티브를 추가해야 함

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


*코어 태그 라이브러리

- 변수 지원

set : 변수 설정

remove : 변수 제거

- 흐름 제어

if : 조건에 따라 내부 코드를 수행

choose : 다중 조건 처리시 사용

forEach : 컬렉션이나 Map의 각 항목을 처리할 때 사용

forTokens : 구분자로 분리된 각각의 토큰을 처리할 때 사용

- URL 처리

import : URL을 사용해서 다른 자원의 결과 삽입

redirect : 지정한 경로로 리다이렉트

url : URL을 재작성

catch : Exception을 처리할 때 사용

out : JspWriter에 내용을 출력


4) 변수지원 태그

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

-  <c:set> 태그 : EL변수의 값이나 프로퍼티 값을 지정할 때 사용

- <c:set> 태그로 EL변수 생성 형식

<c:set var="변수명" value="값" [scope="영역"] /> // scope 속성에서 지정한 영역에 값 저장

<c:set var="변수명" [scope="영역"]>값</c:set> // scope: page, request, session, application


- <c:set> 태그로 객체의 프로퍼티 값 설정

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

<c:set target="대상" property="프로퍼티명">값</c:set>

target: 프로퍼티 값을 설정할 대상 객체 지정(자바빈 객체 or Map)

property: 설정할 프로퍼티의 이름 지정(자바빈 객체의 경우 set 메소드 필수)

value: 프로퍼티의 값 지정

*타겟이 EL변수일 경우 ${EL변수}의 형태로 설정


- <c:set> 태그에서 value 속성의 값을 null로 설정 가능

-> 변수값 설정 태그는 PageContext.removeAttribute()를 이용해서 변수 삭제

-> 프로퍼티 값 설정 태그는 자바빈 객체의 경우 null, Map 객체의 경우 키 삭제


5) <c:remove> 태그

- set 태그로 지정한 변수 삭제시 사용

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

*scope 미지정시 동일한 이름으로 저장된 모든 영역의 변수 삭제


6) 조건문 <c:if>, <c:choose> 태그

- <c:if> 태그: 단순한 if 블록 대체

<c:if test="조건" [var="result" scope="sc"]>  // 조건 <%=%> 표현식, ${} EL, 정적 문자열 가능

코드 // 조건이 true일 경우 코드 실행

</c:if>

*var, scope는 필수 항목은 아니며 var 속성으로 지정한 EL변수에 연산 결과 저장 가능


- <c:choose> 태그: 자바의 switch와 if-else의 혼합 형태

<c:choose>

<c:when test="조건1">

코드1 // 조건1이 true일 경우 실행

</c:when>

<c:when test="조건2">

코드2 // 조건2가 true일 경우 실행

</c:when>

<c:otherwise>

코드3 // 조건1, 2가 false일 경우 실행

</c:otherwise>

</c:choose>



7) 반복문 <c:forEach>, <c:forTokens> 태그

배열, Collection, Map에 저장된 값을 순차 처리

- <c:forEach> 태그의 속성

var: 사용할 변수명(String)

items: 반복 처리할 데이터(Collection, Iterator, Enumeration, Map, Array)

varStatus: 루프 상태를 저장할 EL 변수명(String)

begin: 시작 인덱스 값(int)

end: 끝 인덱스 값(int)

step: 인덱스 증가 값(int)

* var, varStatus는 표현식/EL 사용 불가


- <c:forEach> 태그의 사용 형태

형태1

<c:forEach var="변수" items="아이템"> // items 속성에 배열, Collection, Map

코드 // 코드 내 ${변수} 사용

</c:forEach>


형태2

<c:forEach var="i" begin="1" end="10"> // 자바의 for 반복문 형태

코드 // ${i} 사용

</c:forEach>


- forEach의 varStatus 속성: 속성에 명시한 변수를 다룰 수 있음

index: 인덱스

count: 반복 횟수

begin: begin 속성값

end: end 속성값

step: step 속성값

first: 첫 번째 실행일 경우에만 true

last: 마지막 실행일 경우에만 true

current: 컬렉션 중 현재 루프에서 사용할 객체


-<c:forTokens> 태그: StringTokenizer 클래스와 같은 기능을 제공하는 태그

- items 속성으로 전달받은 문자열을 구분자를 이용해서 나누고 구분한 각 문자열을 var 속성에 명시한 변수에 저장


- <c:forTokens> 태그의 형태

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

${token}의 사용

</c:forTokens>


8) URL 처리 태그

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

<c:url value="URL" [var="varName"] [scope="영역"]> // var 속성 추가시 변수 선언

<c:param name="이름" value="값" /> // 파라미터 추가 가능

</c:url>


- <c:redirect> 태그 : 페이지 이동

<c:redirect url="URL" [context="컨텍스트경로"]>

<c:param name="이름" value="값" />

</c:redirect>


9) 기타 코어 태그

- <c:out> 태그 : JspWriter에 데이터 출력시 사용

<c:out value="value" [escapeXml="(true|false)"] [default="기본값"] />

<c:out value="value" [escapeXml="(true|false)"]>기본값</c:out>

value : JspWirter에 출력할 값, java.io.Reader의 종류일 시 Reader로 읽은 데이터를 출력

escapeXml : true  값을 가질 경우 < > & ' " 특수문자들을 인코딩(기본값 true)

default : value가 null일 때 사용될 값 지정


- <c:catch> 태그 : 발생된 Exception을 EL변수 저장시 사용

<c:catch var="exName">

Exception 발생 가능 코드

</c:catch>

- <c:catch> 태그 사용 예시

<c:catch var="exceptionVar">

Exception 발생 가능 코드

</c:catch>

<c:if test="{ex!=null}">

Exception 발생!

${exceptionVar}

</c:if>



10) 국제화 태그

- 특정 지역에 따라 알맞은 메시지를 출력해야할 때 사용


- Locale 지정 태그

<fmt:setLocale> : 국제화 태그들이 사용할 Locale 지정

<fmt:requestEncoding> : request parameter의 인코딩 지정


- Locale 지정 태그  예시

<fmt:setLocale value="ko" scope="request" />

value: 언어코드_국가코드or두글자 국가코드 // null일시 JVM 기본, web.xml 지정 Locale 사용


<fmt:requestEncoding value="utf-8" />


11) 메시지 처리 태그

- 메시지를 처리할 때 사용

<fmt:bundle> : 태그 몸체에서 사용할 리소스 번들 지정

<fmt:message> : 메시지를 출력

<fmt:setBundle> : 특정 메시지 번들을 사용할 수 있도록 로딩


- 메시지 처리 태그 사용 예시

<fmt:bundle basename="resource.message">

...

<fmt:message key="GREETING" />

...

</fmt:bundle>


- bundle 태그 속성

basename: 리소스 번들 이름

prefix: message 태그의 key 속성의 값 앞에 자동으로 붙게될 문자열


- message 태그 속성

key: 읽어올 메시지의 키

var: 메시지를 저장할 변수명

scope: 변수가 저장되는 영역 지정

bundle: setBundle 태그를 사용해서 로딩한 번들로부터 메시지를 읽어올 때 사용


- <fmt:setBundle> 태그: 리소스 번들을 변수로 저장해서 자유롭게 사용


12) 숫자 및 날짜 포맷팅 처리 태그

- 숫자와 날짜를 포맷팅할 때 사용하는 태그


- <fmt:formatNumber> 태그 : 숫자를 양식에 맞춰 출력

- 사용 형식

<fmt:formatNumber value="숫자값"/>

value: 양식에 맞춰 출력할 숫자 지정

type: 값 타입 지정

pattern: 패턴 지정

currencyCode: 통화 코드 지정

currentSymbol: 통화 표현시 기호 표시

groupingUsed: 단위 구분 기호 사용 여부

var: 결과 저장할 변수 지정

scope: 변수 저장 영역 지정


- <fmt:parseNumber> 태그 : 문자열을 숫자로 변환

- 사용 형식

<fmt:parseNumber value="값"/>

value: 문자열 지정

type: value의 문자열 타입 지정

pattern: 패턴 지정

parseLocale: Locale 지정

integerOnly: 정수 부분만 파싱(기본값 false)

var: 결과 저장할 변수 지정

scope: 변수 저장 영역 지정


- <fmt:formatDate> 태그 : 다양하게 날짜 및 시간 출력

- 사용 형식

<fmt:formatDate value="날짜값" />

value: 값 지정

type: 날짜, 시간 타입 지정 // time, date, both

dateStyle: 정의된 날짜 스타일 지정

timeStyle: 정의된 시간 스타일 지정

pattern: 패턴 지정

timeZone: 시간대를 변경하고 싶을 때 사용

var: 결과 저장할 변수 지정

scope: 변수 저장 영역 지정


- <fmt:parseDate> 태그 : 문자열로 표시된 날짜와 시간 값을 파싱

- 사용 형식 및 속성은 formatDate와 같다.


13) JSTL이 제공하는 EL 함수

- length(obj) : 크기 반환

- toUpperCase(str) : 대문자 변환

- toLowerCase(str) : 소문자 변환

- substring(str, idx1, idx2) : str문자열을 idx1 ~ idx2까지 잘라서 반환

- substringAfter(str1, str2) : str1안에서 str2 이후의 문자열 반환

- substringBefore(str1, str2) : str1안에서 str2 이전의 문자열 반환

- trim(str) : 좌우 공백문자 제거

- replace(str, src, dest) : str의 src를 dest로 변환

- indexOf(str1, str2) : str1에서 str2가 위치한 인덱스 반환

- startsWith(str1, str2) : str1이 str2로 시작할 경우 true

- endsWith(str1, str2) : str1이 str2로 끝날 경우 true

- contains(str1, str2) : str1이 str2를 포함하고 있을 경우 true

- containsIgnoreCase(str1, str2) : 대소문자 구분없이 str1이 str2를 포함하고 있을 경우 true

- split(str1, str2) : str1을 str2 구분자로 분리해서 배열 반환

- join(array, str2) : array에 저장된 문자열을 합치고 값 사이에 str2 구분자 추가

- escapeXml(str) : XML 객체 참조에 해당하는 특수문자 처리