Chap 16. 표준 태그 라이브러리 ( JSTL )
개발자가 직접 <jsp:include> 와 같은 태그를 작성할 수 있는 기능을 제공하는데 이를 커스텀 태그라고 한다.
커스텀 태그 중에서 많이 사용되는 것들을 모아서 JSTL( JSP Standard Tag Library ) 라는 규약을 만들었다.
* JSTL 이란?
JSP 는 스크립트릿과 표현식 등의 스크립트 코드와 HTML 코드가 뒤섞이게 되는데, 이렇게 뒤섞인 JSP 코드는 알아보기 쉽지 않다.
<% %> { } 같은 녀석들이 뒤섞이기 때문이다.
<jsp:include> 와 같은 기능을 하는 하는 태그를 프로그래머가 만들 수 있는데 이것이 커스텀 태그이다.
이 중 JSP 페이지에서 많이 사용되는 논리적인 판단, 반복문의 처리, 데이터베이스 등의 처리를 위한 표준 커스텀 태그가 JSTL 이다.
-
JSTL 이 제공하는 태그의 종류.
JSTL 1.2 는 5가지 종류의 태그를 제공한다.
코어
변수 지원, 흐름 제어, URL 처리
접두어 : c
URI : http://java.sun.com/jsp/jstl/core
xml
xml 코어, 흐름 제어, XML 변환
접두어 : x
URI : http://java.sun.com/jsp/jstl/xml
국제화
지역, 메세지 형식, 숫자 및 날짜 형식
접두어 : fmt
URI : http://java.sun.com/jsp/jstl/fmt
데이터베이스
SQL
접두어 : sql
URI : http://java.sun.com/jsp/jstl/sql
함수
콜렉션 처리, String 처리
접두어 : fn
URI : http://java.sun.com/jsp/jstl/functions
* 코어 태그
변수지원
set : JSP 에서 사용될 변수 설정
remove : 설정한 변수 제거
흐름 제어
if
choose : 다중 조건을 처리할 때 사용. ( switch )
forEach
forTokens
URL 처리
import : URL 을 사용하여 다른 자원의 결과를 삽입한다.
redirect
url : URL 을 재작성 한다.
기타 태그
catch : Exception 처리에 사용된다.
out : JspWriter 에 내용을 알맞게 처리한 후 출력한다.
코어 태그 라이브러리를 사용하려면 JSP 페이지에 다음과 같이 taglib 디렉티브를 추가해주어야 한다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
변수 지원 태그
(1) <c:set> 태그
EL 변수의 값이나 EL 변수의 프로퍼티 값을 지정할 때 사용된다.
<c:set var="변수명" value="값" [scope="영역"]/>
or
<c:set var="변수명" [scope="영역"]>값</c:set>
<c:set target="대상" property="프로퍼티이름" value="값" />
or
<c:set target="대상" property="프로퍼티이름">값</c:set>
주의할 점은 target 에는 실제 object 가 들어가야지, 대상 이름이 들어가는 것이 아니다.
cf) <c:set> 태그에서 value 값을 null 로 설정할 경우, 변수의 경우에는 PageContext.removeAttribute 가 불려 변수를 삭제하고, 프로퍼티의 값의 경우에는 그냥 값을 null 로 처리, 마지막으로 Map 인 경우는 해당 키를 Map 에서 삭제한다.
(2) <c:remove> 태그
지정한 변수를 삭제할 때 사용된다.
<c:remove var="varName" [scope="영역"]/>
주의할 점은 scope 속성을 지정하지 않으면 동일한 이름으로 저장된 모든 영역의 변수가 삭제된다.
-
흐름 제어 태그
JSTL 에서 가장 많이 사용되는 태그 중 하나.
(1) <c:if> 태그
<c:if test="조건" var="variable이름">
...
</c:if>
var 에 지정된 변수에는 test result 가 들어간다.
(2) <c:choose>, <c:when>, <c:otherwise> 태그
<c:choose>
<c:when test="조건">
...
</c:when>
<c:when test="조건2">
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>
(3) <c:forEach> 태그
Collection, Map 에 저장되느 이쓴 값들을 순차적으로 처리할 때 좋다.
<c:forEach var="변수" items="아이템">
...
</c:forEach>
or
<c:forEach var="변수" begin="숫자" end="숫자" step="숫자">
...
</c:forEach>
items 와 begin, end 도 함께 사용될 수 있다.
items 값이 있는 경우 var 에는 Object 가 들어가곤 한다.
이 때 만약 index 도 함께 사용하고 싶다면 varStatus="변수이름" 을 추가로 넣어주면 된다.
varStatus 는 LoopTagStatus 객체로 다음의 프로퍼티들을 갖는다.
index
count : loop 실행 횟수
begin
end
step
first : true/false
last : true/false
current : 현재 객체
(4) <c:forToens> 태그
<c:forTokens var="변수명" items="문자열" delims="구분자">
...
</c:forTokens>
c:forEach 와 동일하게 begin, end, step, varStatus 속성을 제공한다.
-
URL 처리 태그
내부/외부 자원의 삽입( c:import ), URL 생성 ( c:url ), 리다이렉트 ( c:redirect ) 의 세 가지 기능을 제공한다.
(1) <c:import> 태그
특정 URL 의 결과를 읽어와 현재 위치에 삽입하거나 EL 변수를 저장할 때 사용된다.
<jsp:include> 가 동일한 웹 어플리케이션 내에 위치한 자원을 포함해주는 기능이라면, <c:import> 는 동일한 웹 어플리케이션 뿐만 아니라 외부의 다른 자원을 읽어와 포함시킬 수 있도록 해준다.
<c:import url="URL" [var="변수명"] [scope="영역"] [charEncoding="캐릭터셋"] />
var 속성이 없으면 호출한 위치에 import 한 내용을 출력하고, var 속성이 있으면 해당 변수에 결과를 저장한다.
<c:import> 를 사용하면서 요청 parameter 를 set 하는 경우는 URL 에 직접 붙여쓰는 방법도 있지만, <c:param> 을 이용하는 방법도 있다.
<c:param> 의 장점은 절대 URL 의 경우 파라미터 이름과 값에 URL 인코딩 처리를 직접 해주지 않아도 된다는 것이다. ( page 디렉티브에 정의된 charset 값을 사용한다. ) 반대로 상대 URL 일 경우에는 request.setCharacterEncoding 을 통해 알맞은 캐릭터 셋을 지정해 주어야 한다.
(2) <c:url> 태그
<c:url value="URL" [var="varName"] [scope="영역"]>
<c:param name="이름" value="값" />
</c:url>
(3) <c:redirect> 태그
response.sendRedirect() 처럼 지정한 페이지로 리다이렉트시켜주는 기능을 제공한다.
<c:redirect url="URL" [context="컨텍스트경로"]>
<c:param name="이름" value="값" />
</c:redirect>
-
기타 코어 태그
(1) <c:out> 태그
<c:out value="value" [escapeXml="(true|false)"] [default="defaultValue"] />
or
<c:out value="value" [escapeXml="(true|false)"]> default value </c:out>
value 값에는 reader 객체같은 녀석도 들어올 수 있다.
(2) <c:catch> 태그
발생한 exception 을 EL 변수에 저장할 때 사용되는 태그.
<c:catch var="변수이름">
... 익셉션이 발생할 수 있는 코드
</c:catch>
* 국제화 태그
지역에 따라 알맞은 메세지를 출력하고 싶은 경우에 사용된다.
로케일 지정
setLocale
requestEncoding
메세지 처리
bundle : 사용한 번들 지정
message : 지역에 알맞은 message 출력
setBundle : 리소스 번들을 읽어와 특정 변수에 저장
숫자 및 날짜 포맷팅
formatNumber
formatDate
parseDate
parseNumber
setTimeZone
timeZone
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
로케일 지정 태그
웹 브라우저는 Accept-Language 헤더를 사용해서 수용 가능한 언어 목록을 전송한다.
JSTL 국제화 태그들은 이 헤더의 값을 사용해서 언어별로 알맞은 처리를 하게 된다.
<fmt:setLocale> 태그는 궂제화 태그가 Accept-Language 헤더에서 지정한 언어가 아닌 다른 언어를 사용하도록 지정하는 기능을 제공한다.
<fmt:setLocale value="ko" scope="request" />
리소스 번들에서는 한글을 직접적으로 사용할 수 없고, 각 글자를 유니코드 숫자로 표시한 형태로 변환한 것만 사용할 수 있다.
이는 JDK 가 제공하는 native2ascii.exe 를 통해서 처리할 수 있다.
> native2ascii message_ko.properties.src message_ko.properties
-
메세지 처리 태그
(1) <fmt:bundle> 태그와 <fmt:message> 태그
<fmt:bundle basename-"resource.message">
...
<fmt:message key="NAME" />
...
</fmt:bundle>
bundle 태그에는 prefix 속성도 사용할 수 있다.
message 태그에는 var, scope, bundle 속성도 사용할 수 있다.
message 에는 {0}, {1} 와 같은 녀석도 들어갈 수 있는데, 이 녀석들에 값을 넣기 위해서는 <fmt:message> 의 sub 태그로 <fmt:param> 을 사용할 수 있다.
...
<fmt:message key="FILLIN">
<fmt:param value="값" /> <!-- {0} 에 들어간다. -->
<fmt:param value="값2" /> <!-- {1} 에 들어간다. -->
</fmt:message>
...
(2) <fmt:setBundle> 태그와 <fmt:message> 태그
<fmt:bundle> 은 태그 안에서 사용될 리소스 번들을 지정하는 반면, <fmt:setBundle> 은 리소스 번들을 변수에 저장한 후 어디서나 사용할 수 있도록 해준다.
<fmt:setBundle var="message" basename="resource.message" />
...
<fmt:message bundle="${message}" key="NAME" />
setBundle 에는 scope property 도 들어갈 수 있다.
(3) <fmt:message> 태그의 리소스 번들 검색 순서
1. bundle 속성에 지정된 리소스 번들 사용
2. <fmt:bundle> 태그에 중첩된 경우 <fmt:bundle> 태그에서 설정한 리소스 번들 사용
3. 그 외에는 기본 리소스 번들 사용. web.xml 파일에 정의되어 있다.
-
숫자 및 날짜 포맷팅 처리 태그
(1) <fmt:formatNumber> 태그
숫자를 양식에 맞춰 문자열로 변환해준다.
<fmt:format value="숫자값" [속성="값"] />
type : 어떤 양식으로 출력할지 결정한다. number, percent, currency 값이 올 수 있다. 기본은 number
pattern : 숫자가 출력되는 양식을 지정한다. DecimalFormat 에 정의되어 있는 패턴을 사용한다.
currencyCode : 통화 코드를 지정한다. ISO 4217 에 정의된 값을 사용한다. type 이 currency 일때에만 의미가 있다.
currencySymbol : 통화를 표현할 때 사용할 기호를 표시한다. type 속성의 값이 currency 일때만 의미가 있다.
groupingUsed : 콤마(,) 와 같이 단위를 구분할 때 사용되는 기호를 사용할지 여부를 결정한다. 기본값은 true 이다.
var : 포맷팅 결과를 저장할 변수 명. 사용하지 않으면 바로 출력한다.
scope
(2) <fmt:parseNumber> 태그
문자열을 숫자로 변환해주는 기능을 제공한다.
<fmt:parseNumber value="값" [속성="값"] />
type : number, currency, percentage 가 올 수 있다.
pattern : 파싱할 떄 사용할 양식을 지정한다.
parseLocale : 파싱할 때 사용할 로케일을 지정한다. String 혹은 Locale 값이 온다.
IntegerOnly : 정수 부분만 파싱할 지 여부를 지정한다. 기본 값은 false 이다.
var
scope
(3) <fmt:formatDate> 태그
날짜 정보를 담고 있는 객체를 포맷팅하여 출력할 때 사용한다.
<fmt:formatDate value="날짜값" [속성="값"] />
type : time, date, both 중 한가지 값을 가지며, 기본값은 date 이다.
dateStyle : default, short, medium, long, full 중 한 가지 값을 가지며, 기본값은 default 이다.
timeStyle : default, short, medium, long, full 중 한 가지 값을 가진다.
pattern : 파싱할 때 사용할 양식을 지정한다. DateFormat 의 양식을 사용한다.
timeZone : String 또는 TimeZone 값으로, 시간대를 변경할 때 사용한다. TimeZone 은 <fmt:setTimeZone> 태그를 통해 생성 가능하다.
var
scope
(4) <fmt:parseDate> 태그
문자열로 표시된 날짜 및 시간 값을 Date 로 파싱해준다.
<fmt:parseDate value="날짜값" [속성="값"] />
type : time, date, both 중 한 가지 값을 갖는다. 기본값은 date 이다.
dateStyle :default, short, medium, long, full 중 한 가지 값을 가질 수 있으며 기본값은 default 이다.
timeStyle
pattern
timeZone
parseLocale
var
scope
(5) <fmt:timeZone> 태그와 <fmt:setTimeZone> 태그
<fmt:timeZone value="Hongkong">
...
<fmt:formateDate .../> <!-- Hongkong 시간대에 맞춰진 date format -->
...
</fmt:timeZone>
-
web.xml 파일에 국제화 관련 태그 기본 값 설정하기.
<web-app ...>
...
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>resource.message</pram-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.timeZone</param-name>
<param-value>Hongkong</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>ko</param-value>
</context-param>
...
</web-app>
* 함수
length( obj )
List 와 같은 Collection 인 경우 저장된 항목의 개수를 리턴
문자열일 경우 문자열 길이를 리턴
toUpperCase( str )
toLowerCase( str )
substring( str, index1, index2 )
substringAfter( str1, str2 )
str1 에서 str1에 포함되어 있는 str2 이후의 문자열을 리턴
substringBefore( str1, str2 )
trim( str )
replace( str, src, dest )
indexOf( str1, str2 )
startsWith( str1, str2 )
endsWith( str1, str2 )
contains( str1, str2 )
containsIgnoreCase( str1, str2 )
split( str1, str2 )
str1 을 str2 를 delimiter 로 tokening 한다.
join( array, str2 )
array 의 element 들을 str2 를 delimiter 로 합친다.
escapeXml( str )
XML 의 객체 참조에 해당하는 특수문자를 처리한다. 예를 들어 & 를 & 로 변환한다.
'프로그래밍 놀이터 > Web' 카테고리의 다른 글
어떻게 contents 를 vertical 중앙 정렬 시킬 것인가? ( vertical-align 에 대한 오해 ) (0) | 2016.04.30 |
---|---|
millisecond to date / date to millisecond converter (0) | 2015.02.05 |
Chap 15. 표현 언어 ( Expression Language ) (0) | 2015.01.21 |
Chap 13. 웹 어플리케이션의 일반적인 구성 및 방명록 구현 (0) | 2015.01.20 |
Chap 12. 데이터베이스 프로그래밍 기초 (0) | 2015.01.18 |
댓글