Undergoing

JSTL 본문

개발/Web Development

JSTL

Halkrine 2012. 6. 1. 11:46

What is JSTL?

- JSTL(JavaServer Pages Standard Tag Library). Java EE 기반의 웹 애플리케이션 개발 플랫폼을 위한 컴포넌트

- JSP 페이지 안에서 사용할 수 있는 커스텀 액션(XML 문법을 따르면서 특정한 동작을 수행하는 태그)과 함수 제공

- if나 for문 등 간단한 프로그램 로직 구사 가능

- 다른 JSP 페이지를 호출할 수 있음

- JSP 페이지 하나로 여러가지 언어의 웹페이지 생성

- DB로의 입력, 수정, 삭제, 조회

- XML 문서의 처리

- 문자열을 처리하는 함수 호출


JSTL Library


 라이브러리

 기능

 URI 식별자

 접두어

 코어

 일반 프로그래밍 언어에서 제공하는 것과 유사한 변수 선언. 실행 흐름의 제어 기능을 제공, 다른 JSP 페이지로 제어를 이동하는 기능도 제공

 http://java.sun.com/jsp/jstl/core

 c

 포매팅

 숫자, 날짜, 시간을 포매팅하는 기능과 국제화, 다국어 지원 기능 제공

 http://java.sun.com/jsp/jstl/fmt

 fmt
 데이터베이스

 DB data를 입력/수정/삭제/조회

 http://java.sun.com/jsp/jstl/sql

 sql
 XML 처리  XML 문서를 처리할 때 필요한 기능 제공

 http://java.sun.com/jsp/jstl/xml

 x
 함수  문자열을 처리하는 함수 제공  http://java.sun.com/jsp/jstl/functions  fn


* 라이브러리 사용 예 : <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>


JSTL 설치

- JSTL은 웹 페이지에서 무료로 다운 받아 설치 가능

http://jakarta.apache.org/  의 좌측 Taglib 선택

- JSTL을 적용할 톰캣 내 프로젝트 폴더의 WEB-INF/lib에 설치


How to use Core Library

- <c:set> : 변수를 선언한 후 그 변수에 초기값을 대입함

  . <c:set var ="변수 이름" value = "초기값">

  ex) <c:set var = "sum" value = "${num1+num2}"/> 처럼 value attribute 값에는 EL식 사용 가능

  ex) <c:set var = "PRICE" value = "!5000" scope ="request" /> 처럼 변수가 저장될 데이터 영역 지정 가능


- <c:remove> : 선언한 변수 삭제

  . <c:remove var = "변수명" />

  ex) <c:remove var = "code" scope ="request"/> : request 데이터 영역 안에 있는 "code" 변수 제거


- <c:if> : 커스텀 액션식 if문

  ex) <c:if test="${num1 > num2}"> num1이 더 큽니다. </c:if>

  . <c:if> 커스텀 액션의 attribute에 쓰는 조건식은 EL식 형태로 써야 하는 것이 기본이지만 true와 false라는 상수 값을 직접 기입할 수 있음


 - <c:choose> : switch문과 하는 기능 유사. <c:when>과 <c:otherwise>를 같이 사용함. 각각 case와 default 역할을 함

  ex)

  <c:choose>

    <c:when test = "${num == 0}">

      하이요. <BR>

    </c:when>

    <c:when test = "${num == 1}">

      방가 <BR>

    </c:when>

    <c:otherwise>

      안녕요 <BR>

     </c:otherwise>

  <c:choose>


 - <c:forEach> : for문에 해당하는 기능을 제공. 특정 HTML 코드를 일정 횟수만큼 반복해서 출력할 수 있음

  . <c:forEach begin ="1" end ="10"> ~~~ </c:forEach> : 10번 반복해서 ~~~ 실행

  ex) <c:forEach var = "cnt" begin = "1" end = "10" step = "2"> ${cnt} <BR> </c:forEach> : 1, 3, 5, 7, 9 출력. step 때문에 2씩 건너뛰어 출력됨


<c:forEach> 액션의 items attribute를 이용해서 처리할 수 있는 데이터 

 배열
 java.util.Collection 객체

 java.util.Iterator 객체

 java.util.Enumeration 객체

 java.util.Map 객체

 콤마로 구분된 항목들을 포함한 문자열


 - <c:forTokens> : 문자열에 포함된 토큰을 분리해서 각각의 토큰에 대해 반복 처리를 수행하도록 만들어줌

  . <c:forTokens var = "토큰을 대입할 변수" items = "토큰을 포함할 문자열" delims = " "> ${pet}<BR></c:forTokens> : " "는 구획문자


 - <c:catch> : try 문과 같은 기능 수행

  . <c:catch var = "익셉션 객체를 저장할 변수"> ~~~ </c:catch>


- <c:redirect> : 웹 자원과 다른 웹 서버에 있는 웹 자원을 호출할 수 있음

  . <c:redirect url = "HTTP://~~~~~~" />


 - <c:import> : 현재의 JSP 페이지에 다른 JSP 페이지의 결과를 포함시킴. JSP가 아닌 형식의 웹 페이지도 불러올 수 있는 메리트 존재


 - <c:url> : URL을 저장하기 위한 변수의 선언에 사용

  . <c:redirect url="http://~~~~"> <c:param name ="데이터 이름" value = "데이터 값" /> </c:redirect>


- <c:out> : 데이터를 출력할 때 사용

  . <c:out value = "<h3>부두술사</h3>"/> -> 이렇게 하면 태그까지 그대로 표시되지만

  . <c:out value = "<h3>부두술사</h3"> escapeXml = "false" /> -> 이렇게 하면 HTML태그로 인식됨

  . <c:out value = "${str}" default = "No data"/> -> str값이 없으면 디폴트로 설정된 값 대신 출력


Formatting Library

- <fmt:formatDate> 날짜와 시각을 포맷함. 출력할 날짜와 시각을 java.util.Date 클래스 타입의 객체로 넘겨야 하기 때문에 먼저 이 클래스의 객체를 만들어야 함(Ex. Date date = new Date();)


 Now.jsp 

<%@ page language="java" import="java.util.*" pageEncoding="EUC-KR"%>

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

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

<c:set var = "date" value = "<%= new Date()%>"/> 


<html>

  <head>

    

    <title>현재 시각</title>

    

  </head>

  

  <body>

    [S] <fmt:formatDate value = "${date}" type = "both" dateStyle ="short" timeStyle = "short" /><br/>

    [M] <fmt:formatDate value = "${date}" type = "both" dateStyle ="medium" timeStyle = "medium" /><br/>

    [L] <fmt:formatDate value = "${date}" type = "both" dateStyle ="long" timeStyle = "long" /><br/>

    [F] <fmt:formatDate value = "${date}" type = "both" dateStyle ="full" timeStyle = "full" /><br/>

    [오늘의 날짜] <fmt:formatDate value = "${date}" type = "date" pattern = "yyyy/mm/dd (E)"/><br/>

    [현재의 시각] <fmt:formatDate value = "${date}" type = "time" pattern = "(a) hh:mm:ss" />

    

  </body>

</html> 




- <fmt:formatNumber> : 다양한 수치 표현 가능


 NumberFormat.jsp

<!--<%@ page language="java" import="java.util.*" pageEncoding="EUC-KR"%> -->

<%@ page contentType = "text/html;charset = euc-kr" %>

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

<html>

<head>

<title>숫자 포맷</title></head>

<body> 

첫번째 수 : <fmt:formatNumber value = "1234500" groupingUsed = "true" /><br/>

두번째 수 : <fmt:formatNumber value = "3.14158" pattern = #.##" /><br/>

세번째 수 : <fmt:formatNumber value = "10.5" pattern = "#.00" /> <br/>

  금액 : <fmt:formatNumber value = "1000000" type = "currency" currencySymbol = "\"/><br/>

퍼센트 : <fmt:formatNumber value = "0.99" type = "percent"/> 

</body></html> 


* 소스상으로는 문제가 되지 않는데 error 500이 출력됨. OS환경을 바꿔서 결과 봐야 할 듯.


- <fmt:setLocale> : 특정 지역에 맞게 데이터의 포맷을 설정


WorldFormat.jsp

<%@ page language="java" import="java.util.*" pageEncoding="EUC-KR"%>

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

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

<c:set var  ="date" value = "<%= new Date()%>"/>

<html><head>

<title>다른 나라의 포맷</title></head>

<body>

<h3>우리나라의 포맷</h3>

<fmt:setLocale value = "ko_kr" />

금액 : <fmt:formatNumber value = "100000" type = "currency"/><br/>

일시 : <fmt:formatDate value = "${date}" type = "both" dateStyle  ="full" timeStyle = "full"/><br/>

<h3>미국의 포맷</h3>

<fmt:setLocale value = "en_us" />

금액 : <fmt:formatNumber value = "100000" type = "currency"/><br/>

일시 : <fmt:formatDate value = "${date}" type = "both" dateStyle  ="full" timeStyle = "full"/><br/>

<h3>일본의 포맷</h3>

<fmt:setLocale value = "ja_jp" />

금액 : <fmt:formatNumber value = "100000" type = "currency"/><br/>

일시 : <fmt:formatDate value = "${date}" type = "both" dateStyle  ="full" timeStyle = "full"/><br/>

<h3>중국의 포맷</h3>

<fmt:setLocale value = "zh_HK" />

금액 : <fmt:formatNumber value = "100000" type = "currency"/><br/>

일시 : <fmt:formatDate value = "${date}" type = "both" dateStyle  ="full" timeStyle = "full"/><br/>

</body>

</html> 



* 중국 코드를 ch_cn으로 할 경우 이상하게 엔화로 출력됨. HK는 홍콩. TW는 타이완인 듯.

* 언어 코드는 ISO 639, 국가 코드는 ISO 3166을 따름.

* ISO 639 조회 : http://www.loc.gov/standards/iso639-2/php/English_list.php

* ISO 3166 조회 : http://www.iso.org/iso/country_codes/iso_3166_code_lists.htm

* [언어 코드_국가 코드] 의 조합(ex. ko_kr)


- <fmt:timeZone>, <fmt.setTimeZone> : 시간대마다 달라지는 날짜와 시각을 자동으로 계산하여 출력

 . timeZone은 시작 태그와 끝 태그 사이에만 영향을 미침

 . setTimeZone은 이 액션이 실행된 다음의 모든 코드에 영향을 미침


WorldTime.jsp 

<%@ page language="java" import="java.util.*" pageEncoding="EUC-KR"%>

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

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

<c:set var  ="date" value = "<%= new Date()%>"/>

<html><head>

<title>세계시 프로그램</title></head>

<body>

서울 : <fmt:formatDate value = "${date}" type = "both"/><br/>

<fmt:timeZone value = "Asia/Hong_Kong">

홍콩 : <fmt:formatDate value = "${date}" type = "both"/><br/>

</fmt:timeZone>

<fmt:timeZone value = "Europe/London">

런던 : <fmt:formatDate value = "${date}" type = "both"/><br/>

</fmt:timeZone>

<fmt:timeZone value = "America/New_York">

뉴욕 : <fmt:formatDate value = "${date}" type = "both"/><br/>

</fmt:timeZone>

</body>

</html> 


NewWorldTime.jsp 

<%@ page language="java" import="java.util.*" pageEncoding="EUC-KR"%>

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

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

<c:set var  ="date" value = "<%= new Date()%>"/>

<html><head>

<title>세계시 프로그램</title></head>

<body>

서울 : <fmt:formatDate value = "${date}" type = "both"/><br/>

<fmt:setTimeZone value = "Asia/Hong_Kong"/>

홍콩 : <fmt:formatDate value = "${date}" type = "both"/><br/>

<fmt:setTimeZone value = "Europe/London"/>

런던 : <fmt:formatDate value = "${date}" type = "both"/><br/>

<fmt:setTimeZone value = "America/New_York"/>

뉴욕 : <fmt:formatDate value = "${date}" type = "both"/><br/>

</body>

</html> 


* 이 소스로는 WorldTime이나 NewWorldTime이나 결과는 같음

'개발 > Web Development' 카테고리의 다른 글

web.xml 거치지 않고 Servlet 내에서 해결하기  (0) 2012.08.28
커스텀 액션 - 태그 파일  (0) 2012.06.05
Standard Action  (0) 2012.05.31
Expression Language  (0) 2012.05.18
ServletContext  (0) 2012.05.15