JSTL (JSP Standard Tag Library) , JSP 표준 태그 라이브러리

2013. 7. 31. 08:50Java/Spring Framework

JSTL (JSP Standard Tag Library) , JSP 표준 태그 라이브러리


JSP
페이지를 작성할 때 유용하게 사용할 수 있는 여러 가지 커스텀 액션 과 함수가 포함되어 있는 라이브러리이다.

1.     JSTL 이란.
JSP
페이지를 작성할 때 유용하게 사용할 수 있는 여러 가지 커스텀 액션 과 함수가 포함되어 있는 라이브러리이다
.

2.     JSTL 적용 목적

A.     간단한 프로그램 로직의 구사(자바의 변수 선언, if/for 문 등에 해당하는 로직)

B.      다른 JSP 페이지 호출 ( <c:redirect> , <c:import> )

C.      날짜, 시간, 숫자의 포멧

D.     JSP 페이지 하나를 가지고 여러 가지 언어의 웹 페이지 생성

E.      데이터베이스로의 CRUD

F.      XML문서의 처리

G.     문자열을 처리하는 함수 호출
문자열을 처리하는 함수 호출을 제외한 나머지 기능들을 모두 커스텀 액션 형태로 제공된다.

3.     JSTL 커스텀 액션 예

A.     <c:forEach> 커스텀 액션은 자바의 for 문과 비슷한 기능
<c:forEach begin=”1” end=”10”>
    <a>show me the lucky</a>
</c:forEach>

B.      <fmt:formatNumber> 커스텀 액션은 수치 값을 포멧하는 기능
<for:formatNumber value=”3.14159” pattern=”#.00” />
(
위의 value의 수치를 소수점 이하 2자리까지 끊어서 출력)

C.      JSTL에는 커스텀 액션만 있는 것이 아니라, 표현식 언어에서 사용할 수 있는 EL함수도 지원한다.
${fn:toUpperCase(“Hello”)}
(
대문자로 변경한 문자열 반환
)

4.     JSTL 구성 라이브러리

A.     Core (접두어 : c , URI 식별자 : http://java.sun.com/jsp/jstl/core )
일반 프로그래밍 언어에서 제공하는 것과 유사한 변수 선언,
실행 흐름의 제어 기능을 제공하고, 다른 JSP 페이지로 제어를 이동하는 기능 제공

B.      Formatting (접두어 : fmt, URI 식별자 : http://java.sun.com/jsp/jstl/fmt )
숫자, 날짜, 시간 을 포매팅하는 기능과 국제화, 다국어 지원 기능을 제공

C.      Database (접두어 : sql, URI 식별자 : http://java.sun.com/jsp/jstl/sql )
데이터베이스의 데이터를 입력/수정/삭제/조회 하는 기능을 제공.

D.     XML 처리(접두어 : x, URI 식별자 : http://java.sun.com/jsp/jstl/xml )
XML
문서를 처리할 때 필요한 기능을 제공

E.      함수(접두어 : fn, URI 식별자 : http://java.sun.com/jsp/jstl/functions )
문자열을 처리하는 함수를 제공

5.     JSTL 사용

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

A.     JSP 페이지에서 taglib 지시자를 이용해서 JSTL 라이브러리의 URL 식별자와 접두어를 연결해야 한다.

B.      taglib 지시자는 다른 지시자와 마찬가지로 <%@ 으로 시작해서 %> 로 끝난다.

C.      Taglib 지시자에는 uri prefix 라는 두개의 어트리뷰트를 정의


6.     JSTL 1.1 라이브러리 파일 설치

A.     WEB-INF/lib 폴더내 Jakarta.apache.org 에서 다운받은 jstl.jar (스펙라이브러리), standard.jar(구현라이브러리) 파일을 넣기만 하면 끝

7.     Core library 사용

A.     <c:set>

                         i.         속성 변수를 선언하고 초기값을 대입하는 커스텀 액션
int num = 100;
è <c:set var=”num1” value=”1” />
<c:set var=”num1” value=”2” />
<c:set var=”num” value=”100” />

                        ii.         Value attribute value 위치에 EL 식도 사용 가능.
<c:set var=”num” value=”${num1 + num2}” />

                       iii.         <c:set> 액션을 이용하여 선언한 변수는 기본적으로 page 데이터 영역의 속성으로 바인딩 된다.

                       iv.         Scope Attribute를 이용하여 바인딩되는 내장객체(생존 범위)를 지정 가능

1.      Page, request, session, application 중 한 값을 지정

2.      각각 page, request, session,application 내장 객체의 속성으로 바인딩
<c:set var=”PRICE” value=”15000” scope=”request” />
<c:set var=”CODE” value=”A01002” scope=”request” />
(
변수가 저장될 데이터 영역은 바로 request 객체 이다.)
상품가격
: ${PRICE} <br/>
상품코드 : ${CODE}}

B.      <c:remove>

1.      <c:set> 액션으로 선언한 변수는 삭제시에 명시적으로 삭제해야함.

2.      <c:remove> 커스텀 액션은 내장 객체에 바인딩된 속성을 삭제
<c:remove var=”num” />

3.      Page,request,session,application 내장 객체에 저장되어 있는 num 이라는 이름의 속성을 모두 찾아서 제거하는데, 이때에는 scope 사용하면 됨.
<c:remove var=”num” scope=”request” />

C.      <c:if> : If
if(num1 > num2) {}
è <c:if test=”${num1 > num2}”> </c:if>

D.     <c:choose> : Switch
switch(num){
case 0:
  break;
case 1:
  break;
default:
  break;
}
è<c:choose>
     <c:when test=”${param.NUM ==0}”>
     </c:when>
     <c:otherwise>
     </c:otherwise>
  </c:choose>

E.      <c:forEach> : For
for(int i=0; i < 100 ; i++){}
è <c:forEach var=”i" begin=”0” end=”100” step=”1”>  (step : default값은 1)
      ${i} <br/>
   </c:forEach>

                         i.         items 속성을 이용하면 여러 개의 항목으로 구성된 데이터(Collection, Iterator, Enumeration, Map 객체 및 콤마(,)로 구분된 항목들을 포함한 문자열)를 순서대로 출력하는 일도 할 수 있다.
<c:forEach var=”str” items=”${arr}”>
  ${str}<br/>
</c:forEach>

                        ii.         실용예제
String arr[] = { 1,2,3,4};
request.setAttribute{“MENU”,arr};
(request
상에 배열값을 저장합니다.)
<jsp:forward page=”gogogo.jsp" />
è이동된 페이지상에서

<c:forEach var=”dish” items=”${MENU}”>
<LI>${dish}<LI>
</c:forEach>

F.      <c:forTokens>

                         i.         이것은 자바의 java.util.StringTokenizer 클래스의 기능을 합친 것 같은 기능 제공

                        ii.         Items, delims, var 속성 제공

1.      Item : 토큰을 포함하는 문자열

2.      Delims 토큰을 분리에 사용할 구획 문자

3.      Var : 분리된 토큰을 대입할 변수의 이름
<c:set var=”guests” value=”monkey rabbit elephant” />
<c:forTokens var=”pet” items=”${guests}” delims=” “>
  ${pet}<br/>
</c:forTokens>

4.      토큰의 구획 문자로 한 종류 이상의 문자를 지정할 수도 있다.
<c:forTokens var=”pet” items=”monkey*rabbit/elephant-tiger” delims=”*/-“>

G.     <c:catch> : Try / Catch

                         i.         <c:catch> 커스텀 액션은 자바의 try블록에 해당하는 일만 하기 때문에 catch 블록에 해당하는 일은 별도로 코딩해야 함.

                        ii.         var 속성에 지정된 변수(Exception 객체가 저장되는 변수) <c:catch> 액션의 범위 밖에서도 EL 식을 통해 사용할 수 있으므로, 이를 이용해 에러 처리하면 된다.
${e.message}
라는 EL식은 Exception 객체 e에 대해 getMessage 메서드를 호출하는 일을 한다네요
.
<c:catch var=”e”>
   <% int result= num1 / num2 %>
   <%=result%>
</c:catch>
<c:if test=”${e != null}”>
 
에러 메시지는
: ${e.message}
</c:if>

H.     <c:redirect> : sendRedirect 메서드
<c:redirect url=http://www.google.com />
  <c:param name=”num1” value=”5”/>
  <c:param name=”num2” value=”25”/>
</c:redirect>

I.       <c:import>

                         i.         <c:import> <jsp:include> 표준 액션과 비슷하다. 다른 jsp 페이지 뿐만 아니라 다른 종류의 웹 자원도 호출할 수 있다는 점이 차이가 있다.
또한 호출할 웹 자원에 데이터를 넘겨주려면 <c:param> 커스텀 액션을 쓰면됨
.
<c:import url=”http://www.givemethedata.com”/>
  <c:param name=”num1” value=”5”/>
  <c:param name=”num2” value=”25”/>
</c:import >

J.       <c:url>

                         i.         <c:url> 커스텀 액션은 <c:set> 커스텀 액션과 마찬가지로 변수의 선언에 사용되나, URL을 쉽게 다를수 있다는 방법을 제공한다는 점에서 차이가 있다.
또한 <c:url>은 세션 유지를 위한 URL 재작성 기법을 지원한다
.
Response.encodeURL(
http://localhost:8080/test/test.jsp)
è <c:url value=http://localhost:8080/test/test.jsp>

<c:url var=”myURL” value=
http://localhost:8080/test/test.jsp>
<c:param name=”num1” value=”1” />
<c:param name=”num2” value=”3” />
</c:url>
<c:redirect url=”${myURL}” />

                        ii.         <c:param> 커스텀 액션은 URL 인코딩도 자동으로 수행, 쿼리스트링에 사용할 수 없는 예약 문자를 다른 문자로 변경

K.      <c:out>

                         i.         데이터를 출력할 때 사용하고 특히, 웹 브라우저에 의해 특수한 문자로 해석되는 <,> ,& , ‘ ,” 를 포함하는 데이터 출력할 때 편리.
<c:out value=”<INPUT>
<FORM> &&&입니다.” Default=”No data”/>

                        ii.          Default 속성을 사용하면 출력할 데이터의 디폴트 값을 지정할 수 있다.

8.     Formatting Library

A.     <fmt:formatDate>

                         i.         날짜와 시각 데이터를 포맷하는 커스텀 액션

                        ii.         출력할 날짜와 시각을 java.util.Date 클래스 타입으로 객체로 넘겨줘야 하므로 먼저 이 클래스의 객체를 만들어야 한다.
Date date = new Date();
<fmt:formatDate value=”${date} “ type=”both” dateStyle=”long” timeStyle=”short”/>
value
속성에 Date 객체를 지정하면 그 객체가 포함하고 있는 날짜가 YYYY.MM.DD 포맷으로 출력된다.

                       iii.         Type 값에 both는 날짜,시각 모두, time은 시각, date는 날짜 겠지

                       iv.         dateStyle timeStyle full/long/medium/short 포멧으로 각각 지정 가능하다.

                        v.         또한 pattern 적용도 가능
<fmt:formatDate value=”${date}” type=”time” patten=”(a) hh:mm:ss “/>

B.      <fmt:formatNumber>

                         i.         <fmt:formatNumber value=”1234599 “ groupingUsed=”true” />
è 3자리 마다 , 추가

                        ii.         <fmt:formatNumber value=”3.14158 “ pattern=”#.##” />
è 패턴 적용

                       iii.         <fmt:formatNumber value=”3.2 “ pattern=”#.00” />
è 요건 3.20 요렇게 나온다는

                       iv.         <fmt:formatNumber value=”0.2 “ type=”percent” />
è 요건 20% 요렇게 나온다는

                        v.         <fmt:formatNumber value=”2500000 “ type=”currency” currencySymbol=”\” />
è 금액으로 표시

C.      <fmt:setLocale>

                         i.         출력할 데이터의 포멧을 특정 지역에 맞게 설정하고자 할 때 사용
<fmt:setLocale value=”en” />

                        ii.         위 액션이 실행되고 나면 날짜,시각,통화 부분에 대한 것이 그 나라로 변경

D.     <fmt:timeZone>

                         i.         시간대마다 다른 날짜와 시각을 자동으로 계산 표시
<fmt:timeZone value=”America/New_York”>
  
날짜 : <fmt:formatDate value=${date} type=”date” />
  
시간
: <fmt:formatDate value=${date} type=”time” />
</fmt:timeZone>

E.      <fmt:setTimeZone>

                         i.         위와 다르게 모든 코드에 영향.

F.      <fmt:setBundle> <fmt:bundle>

                         i.         위 커스텀 액션을 사용하면 하나의 JSP 페이지만 가지고 서로 다른 언어로 기술된 두 개 이상의 웹 페이지를 생성할수 있다.

                        ii.         우선 웹 페이지마다 서로 다른 언어로 기술되어야 할 부분을 추출해서 프로퍼티 파일(property file)로 만들어 놓아야 한다.

                       iii.         프로퍼티 파일은 대표명_ISO언어코드.properties” 라는 이름으로 만들어서 “WEB-INF/classes” 폴더에 저장해야 한다.

                       iv.         <fmt:setBundle> 은 역시 전체 영향을 미치고, <fmt:bundle>은 프로퍼티 파일이 적용되는 코드의 범위를 한눈에 알아 볼수 있게 만들기 때문에 코드의 가독성을 높여 준다.

                        v.         프로퍼티 파일에도 변수를 쓸수 있으나, 이때는 영문변수이름이 아니고 숫자 인덱스값으로 변수를 표시해야 하고 변수 대입은 jsp페이지 안에서 한다.

<fmt:message var=”greeting” key=”GREETING”>
  <fmt:param>test</fmt:param>
  <fmt:param>test</fmt:param>
</fmt:message >

G.     <fmt:requestEncoding>

                         i.         Post 메서드로 전송된 한글 입력 데이터를 입력 받기를 하면 한글 깨지는데, 일반적으로 setCharacterEncoding 메서드를 호출해야 한다. <fmt:requestEncoding>은 내부적 으로 setCharacterEncoding를 호출한다.
<fmt:requestEncoding value=”euc-kr” />

9.     함수 라이브러리 사용하기

A.     표현식 언어의 EL 식 안에서 사용할 수 있는 EL 함수들의 라이브러리
toUpperCase
라는 함수을 쓰려면 아래와 같이 쓴다.
${fn:toUpperCase{“Hello”}}
${fn:substring(“
도레미파솔라시도”,3,6)} 
è 파솔라 return

B. 그밖에 다양한 함수