자바(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 파일들은 다 되는데….

반응형