본문 바로가기
프로그래밍 놀이터/Web

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

by 돼지왕 왕돼지 2015. 1. 22.
반응형

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" />


사실 대부분은 Accept-Header 값에 따라 메세지를 표시하기 때문에 fmt:setLocale 태그는 거의 사용되지 않는다.


<fmt:requestEncoding value="euc-kr" />

위의 태그는 request.setCharacterEncoding( "euc-kr" ); 과 동일하다.


-
리소스 번들

메세지 번들 파일은 클래스 패스에 위치해야 하기 때문에 WEB-INF/classes 혹은 WEB-INF/lib 에 jar 파일로 포함시키면 된다.
message bundle 을 읽어오는 클래스는 Properties 이기 때문에 확장자는 properties 여야 한다.

// WEB-INF/classes/resource/message.properties

NAME = Gamza

// WEB-INF/classes/resource/message_ko.properties.src

NAME = 감자

리소스 번들에서는 한글을 직접적으로 사용할 수 없고, 각 글자를 유니코드 숫자로 표시한 형태로 변환한 것만 사용할 수 있다.

이는 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 의 객체 참조에 해당하는 특수문자를 처리한다. 예를 들어 & 를 &amp; 로 변환한다.







반응형

댓글