자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)
JAVA/JSP 34. JSP 표준 태그 라이브러리(JSTL) - 국제화(Formatting) 태그, XML 태그
개발학생
2025. 4. 23. 15:54
반응형
1. 국제화(Formatting) 태그
- JSTL의 Formatting 태그로, 국가별로 다양한 언어/날짜/시간/숫자 형식을 설정할 때 사용됨
- 사용 전 선언해야 하는 지시어 (접두어 fmt)
<%@ taglib prefix="fmt" uri="http://java.s.un.com/jsp/jstl/fmt" %>
- 종류
분류 | 태그명 | 기능 |
숫자 포맷 | formatNumber | 숫자 포맷 설정 |
parseNumber | 문자열을 숫자 포맷으로 변환 | |
날짜 포맷 | formatDate | 날짜나 시간의 포맷 설정 |
parseDate | 문자열을 날짜 포맷으로 변환 | |
타임존 설정 | setTimeZone | 시간대 설정 정보를 변수에 저장 |
timeZone | 시간대를 설정 | |
로케일 설정 | setLocale | 통화 기호나 시간대를 설정한 지역에 맞게 표시 |
requestEncoding | 요청 매개변수의 문자셋을 설정 |
1) 숫자 포맷팅 및 파싱
(1) fmt:formatNumber
- 사용 형식
<fmt:formatNumber value="출력할 숫자" type="출력 양식" var="변수 설정"
groupingUsed = "구분 기호 사용 여부" pattern="숫자 패턴" scope="영역" />
- 속성
속성명 | 기능 |
value | 출력할 숫자 설정 |
type | 출력 양식 설정-percent(퍼센트), currency(통화), number(일반 숫자, 기본값) 등을 지원 |
var | 출력할 숫자를 변수에 저장-해당 속성 사용 시 즉시 출력되지 않으며, 원하는 위치에 출력 가능 |
groupingUsed | 세 자리마다 콤마를 출력할지 여부를 결정함(기본값 true) |
pattern | 출력할 숫자의 양식을 패턴으로 지정함 |
scope | 변수를 저장할 영역을 지정 |
(2) fmt:parseNumber
- 사용 형식
<fmt:parseNumber value="파싱할 문자열" type="출력 양식" var="변수 설정"
integerOnly="정수만 파싱" pattern="패턴" scope="영역" />
- 속성
속성명 | 기능 |
value | 변환할 문자열 설정 |
type | 문자열의 타입 설정(기본값 number(숫자)) |
var | 출력할 값을 변수에 저장 |
pattern | 문자열의 양식을 패턴으로 지정 |
scope | 변수를 저장할 영역을 지정 |
integerOnly | 정수 부분만 표시할지 여부를 결정(기본값 false) |
- 사용 예제
// WebContent/JSTL/etc/Fmt1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>JSTL - fmt 1</title></head>
<body>
<h4>숫자 포맷 설정</h4>
<c:set var="number1" value="12345" /> //1.
콤마 O: <fmt:formatNumber value="${ number1 }" /><br /> //2.
콤마 X: <fmt:formatNumber value="${ number1 }" groupingUsed="false" /><br /> //3.
<fmt:formatNumber value="${number1 }" type="currency" var="printNum2" /> //4.
통화기호: ${ printNum1 } <br /> //5.
<fmt:formatNumber value="0.03" type="persent" var="printNum2 /> //6.
퍼센트: ${ printNum2 } //7.
<h4>문자열을 숫자로 변경</h4>
<c:set var="number2" value="6,789.01" /> //8.
<fmt:parseNumber value="${ number2 }" pattern="00,000.00" var="printNum3" /> //9.
소수점까지: ${ printNum3 } <br />
<fmt:parseNumber value="${ number2 }" integerOnly="true" var="printNum4" /> //10.
정수 부분만: ${ printNum4 }
</body>
</html>
- Fmt1.jsp 실행 결과
2) 날짜 포맷팅 및 타임존
(1) fmt:formatDate 태그
- 사용 형식
<fmt:formatData value="출력할 날짜" type="출력 양식" var="변수 설정"
datestyle="날짜 스타일" timeStyle="시간 스타일" pattern="날짜 패턴" scope="영역"
/>
- 속성
속성명 | 기능 |
value | 출력할 값을 설정 |
type | 출력 시 날짜(date), 시간(time), 날짜 및 시간(both) 세 가지 중 선택 가능 |
var | 출력할 숫자를 변수에 저장 |
dateStyle | 날짜 스타일 지정-default, short, medium, long, full 중 선택 가능 |
timeStyle | 시간 스타일 지정-default, short, medium, long, full 중 선택 가능 |
pattern | 출력할 날짜 및 시간의 양식을 패턴으로 직접 지정 |
scope | 변수를 저장할 영역 지정 |
(2) 태그
- fmt:timeZone 출력할 시간의 시간대(time zone)를 설정할 수 있음
→ fmt:formatDate 태그를 fmt:timeZone 태그의 하위에 사용하면, 설정한 시간대에 따라 다른 시간 출력
*날짜 포맷팅 및 타임존 사용 예제
// WebContent/JSTL/etc/Fmt2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefic="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head><title>JSTL - fmt 2</title></head>
<body>
//1.java.util 패키지에서 Date 클래스의 객체를 변수로 설정-Date를 기본 생성자로 만들면 생성한 날짜와 시간을 값으로 갖는 객체가 만들어짐
<c:set var="today" value="<%= new java.util.Date() %>" />
<h4>날짜 포맷</h4>
full : <fmt:formatDate value="${ today }" type="date" dateStyle="full"/> <br />
//2.아래 코드 3줄-날짜 포맷을 출력하기 위해 type="date"로 설정(날짜 스타일은 dateStyle 속성에 각각 지정)
short : <fmt:formatDate value="${ today }" type="date" dateStyle="short"/> <br />
long : <fmt:formatDate value="${ today }" type="date" dateStyle="long"/> <br />
default : <fmt:formatDate value="{ today }" type="date" dateStyle="default"/>
<h4>시간 포맷</h4>
full : <fmt:formatDate value="${ today }" type="time" timeStyle="full"/> <br />
//3.아래 코드 3줄-시간 포맷을 출력하기 위해 type="time"으로 설정(시간 스타일은 timeStyle 속성에 각각 지정)
short : <fmt:formatDate value="${ todqy }" type="time" timeStyle="short"/> <br />
long : <fmt:formatDate value="${ today }" type="time" timeStyle="long"/> <br />
default : <fmt:formatDate value="${ today }" type="time" timeStyle="default"/>
<h4>날짜/시간 표시</h4>
//4.날짜와 시간을 동시에 출력
<fmt:formatDate value="${ today }" type="both" dateStyle="full" timeStyle="full"/>
<br />
//5.스타일 대신 pattern 속성을 직접 지정할 수 있음
<fmt:formatDate value="${ today }" type="both" pattern="yyyy-mm-dd hh:mm:ss"/>
<h4>타임존 설정</h4>
//6.시간대를 세계협정시(GMT, 대한민국보다 9시간 빠름)로 변경
<fmt:timeZone value="GMT">
<fmt:formatDate value="${ today }" type="both" dateStyle="full"
timeStyle="full"/>
<br />
</fmt:timeZone>
//7.시간대를 특정 지역명으로 설정
<fmt:timeZone value="America/Chicago">
<fmt:formatDate value="${ today }" type="both" dateStyle="full"
timeStyle="full/>
</fmt:timeZone>
</body>
</html>
*Fmt2.jsp 실행 결과
3) 로케일 설정
- fmt:setLocale 태그: 국가별로 다른 통화 기호나 날짜를 표현할 때 사용
→ value의 값에 따라 통화와 날짜가 다르게 출력됨 - 예제
// WebContent/JSTL/etc/Fmt3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http:java.sun.com/jsp/jstl/fmt" %>
<html>
<head><title>JSTL - fmt 3</title></head>
<body>
<h4>로케일 설정</h4>
<c:set var="today" value="<%= new java.util.Date() %>"/> //1.Date 타입의 변수를 준비
한글로 설정: <fmt:setLocale value="ko_kr" /> //2.로케일을 한글로 설정
<fmt:formatNumber value="10000" type="currency" /> /
<fmt:formatDate value="${ today }" /><br />
일어로 설정: <fmt:setLocale value="ja_JP" /> //3.로케일을 일어로 설정
<fmt:formatNumber value="10000" type="currency" /> /
<fmt:formatDate value="${ today }" /><br />
영어로 설정: <fmt:setLocale value="en_US" /> //4.로케일을 영어로 설정
<fmt:formatNumber value="10000" type="currency" /> /
<fmt:formatDate value="${ today }" /><br />
</body>
</html>
*Fmt3.jsp 실행 결과
2. XML 태그
1) XML(eXtensible Markup Language)이란?
- 확장이 가능한 마크업 언어→ HTML과 다르게, 데이터를 보여주는 것이 아니라 데이터를 저장하고 전달할 목적으로 만들어짐 ⇒ 웹 애플리케이션 사이에서 데이터를 전달하는 역할
- → HTML과 비슷하게 태그로 데이터를 표현하지만, XML은 태그를 개발자가 직접 정의할 수 있고 데이터를 기술할 수 있는 언어
2) XML 태그의 특징
- JSTL의 xml 태그는 XML 문서를 처리하기 위한 것으로, XML 파싱 및 출력, 흐름 제어 등의 기능을 제공함
- XML 문서의 요소(element)에 접근하기 위해 XPath를 사용(XPath는 XML 문서의 노드를 식별하고 탐색하는 역할)
- XML 태그 사용을 위해 선언되어야 하는 지시어(접두어는 “x” 사용)
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
3) XML 태그의 종류
*파싱(parsing)
- 구문 분석. 주어진 데이터를 분석하여 원하는 데이터를 특정 패턴이나 순서로 추출해 가공하는 것 → XML이나 HTML 등으로 구성된 데이터를 분석해서 내가 원하는 부분만 추출하는 것
태그명 | 기능 |
out | select 속성에 지정한 XPath 표현식의 결과를 출력함 |
parse | XML을 파싱할 때 사용 |
forEach | select 속성에 지정한 반복되는 노드를 파싱 |
if | select 속성에 지정한 XPath 표현식의 값을 하나의 조건으로 결정 |
choose | select 속성에 지정한 XPath 표현식의 값을 다중 조건으로 결정 (하위에 when, otherwise 태그 사용) |
4) 사용 예제
(1) 분석 대상이 될 XML 문서
- 책 두 권에 관한 정보를 담은 간단한 형태의 XML 파일
// WebContent/JSTL/inc/BookList.xml
<?xml version="1.0" encoding="UTF-8"?>
<booklist>
<book>
<name>사피엔스</name>
<author>유발 하라리</author>
<price>19800</price>
</book>
<book>
<name>총,균,쇠</name>
<author>제러드 다이아몬드</author>
<price>25200</price>
</book>
</booklist>
(2) XML 태그 사용 예제(jsp 파일)
// WebContent/JSTL/etc/Xml.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<html>
<head><title>JSTL - xml</title></head>
<body>
<c:import url="../inc/BookList.xml" var="booklist" charEncoding="UTF-8"/> //1.외부의 XML 문서를 <c:import> 태그를 통해 가져올 수 있음
<!--
<c:set var="booklist"> //2.주석 처리: 변수에 담긴 문자열 데이터를 파싱할 수 있음
<booklist>
<book>
<name>사피엔스</name>
<author>유발 하라리</author>
<price>19800</price>
</book>
<book>
<name>총,균,쇠</name>
<author>제러드 다이아몬드</author>
<price>25200</price>
</book>
</booklist>
</c:set>
-->
<x:parse xml="${booklist}" var="blist" /> //3.방금 선언한 변수를 파싱해줄 <x:parse> 태그 선언
<h4>파싱 1</h4>
//4. 아래 코드 3줄-<x:out> 태그를 이용해 파싱된 내용을 출력
// -> select 속성의 값이 바로 XPath(EL과 다르게 중괄호 사용하지 않음): 일반적인 경로를 기술할 때와 마찬가지로 /(슬래시)로 노드를 타고 들어가면 됨
제목 : <x:out select="$blist/booklist/book[1]/name" /> <br />
저자 : <x:out select="$blist/booklist/book[1]/author" /> <br />
가격 : <x:out select="$blist/booklist/book[1]/price" /> <br />
<h4>파싱 2</h4>
<table border="1">
<tr>
<th>제목</th><th>저자</th><th>가격</th>
</tr>
<x:forEach select="$blist/booklist/book" var="item"> //5.반복되는 노드가 있을 때는 <x:forEach> 태그를 사용하면 편함
//-> 여기서 반복되는 노드는 <book>: book을 select 속성에 지정한 후 그 개수만큼 반복
<tr>
//6-1 ~ 6-3: 선택된 요소들을 var 속성에 지정한 item을 사용해 출력
<td><x:out select="$item/name" /></td> //6-1
<td><x:out select="$item/author" /></td> //6-2
<td>
<x:choose> //7.<x:choose> 태그를 사용해 가격이 20,000원 이상인지 판단
<x:when select="$item/price >= 20000"> //6-3
2만 원 이상 <br />
</x:when>
<x:otherwise>
2만 원 이상 <br />
</x:otherwise>
</x:choose>
</td>
</tr>
</x:forEach>
</table>
<h4>파싱 3</h4>
<table border="1">
<x:forEach select="$blist/booklist/book" var="item"> //8.5와 동일하게 <book>의 개수만큼 반복하여 출력
<tr>
<td><x:out select="$item/name" /></td>
<td><x:out select="$item/author" /></td>
<td><x:out select="$item/price" /></td>
<td><x:if select="$item/name" = '총,균,쇠'">구매함</x:if></td> //9.<x:if> 태그를 사용하여 문자열 비교(XML 태그에서는 비교 연산자로 ==대신 =을 사용)
</tr>
</x:forEach>
</table>
</body>
</html>
(3) Xml.jsp 파일 실행 결과
- XML 데이터를 내부에서 처리할 때는 변수로 선언하여 파싱하면 되지만, 외부 파일을 가져올 때는 한글 깨짐 현상 때문에 charEncoding 속성을 사용해야 함
- XPath는 EL과 달리 { }(중괄호)를 사용하지 않고, 마치 경로 표시처럼 /(슬래시)로 노드를 찾아 들어가는 형태로 작성
- core 태그와 마찬가지로 x:if, x:choose, x:foreach 태그가 있어, XML 파싱에 조건문이나 반복문 사용 가능
개인적으로 500 에러를 해결하지 못함: 왜…. 이런오류가… 오라클안켜서 그런것도 아니고 다른 jstl 파일들은 다 되는데….
반응형