Link Search Menu Expand Document

Internationalization Tag

Table of contents

  1. Internationalization Tag
  2. Internationalization Tag Basic
  3. Locale Designation Tag
    1. <fmt:setLocale>
    2. <fmt:requestEncoding>
  4. Message Processing Tag
    1. Resource Bundle
    2. <fmt:bundle>
      1. Summary of attributes of fmt:bundle
    3. <fmt:message>
      1. Summary of attributes of fmt:message
      2. Resource bundle Search Order
    4. <fmt:setBundle>
      1. Summary of attributes of fmt:setBundle
  5. Number Print and Related to Parsing Tag
    1. <fmt:formatNumber>
      1. Summary of attributes of fmt:formatNumber
    2. <fmt:parseNumber>
      1. Summary of attributes of fmt:parseNumber
  6. Date Print and Related to Parsing Tag
    1. <fmt:formatDate>
      1. Summary of attributes of fmt:parseNumber
    2. <fmt:parseDate>
      1. Summary of attributes of fmt:parseDate
  7. Time Zone Setting Tag
    1. <fmt:timeZone> / <fmt:setTimeZone>
    2. web.xml 파일에 국제화 관련 태그 기본값 설정하기

Internationalization Tag

Internationalization Tag Basic

국제화 태그는 특정 지역에 따라 알맞은 메시지를 출력해야 할 때 사용

예를들어 한글 브라우저로 접속을 하면 한글 메시지로 출력하고 영문 브라우저로 접속을 하면 영문 메시지로 출력해야 할 경우 국제와 태그를 사용

국제화 태그 라이브러리

기능태그설명
로케일setLocaleLocale을 지정
 requestEnCodingLocale을 지정
메시지bundle사용할 번들을 지정
 message지역에 알맞은 메시지를 출력
 setBundle리소스번들을 로딩후 특정 변수에 저장
포매팅formatNumber숫자 형식을 지정
 formatDate날짜 형식을 지정
 parseDate문자열로 표시된 날짜를 Date객체로 파싱
 parseNumber문자열로 구성된 자를 숫자로 파싱
 setTimeZone시간대 정보를 특정 변수에 저장
 timeZone시간대를 저장

Locale Designation Tag

<fmt:setLocale>

국제화 태그를 사용할 로케일을 지정

웹 브라우저는 Accept-Language 헤더를 사용해서 수용 가능한 언어 목록을 전송하는데 국제화 테그들은 이 헤더의 값을 사용해서 언어별로 알맞은 처리를 하게 됨

예를들어 메시지를 출력해주는 message태그는 Accept-language의 값이 ‘ko’인 경우 한글 메시지를 우선적으로 처리하고 ‘en’일 경우에는 영문메시지를 우선으로 처리

Accept-Language 헤더에서 지정한 언어가 아닌 다른 언어를 사용하도록 지정할 때 사용하는 태그

일반적으로 웹 브라우저가 전송한 Accept-Language 헤더값에 맞게 메시지를 출력하기 때문에 사용하는경우는 드뭄

syntax

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

  • value : locale을 “언어코드_국가코드” 형식으로 지정

    ▸ 두 글자 언어코드는 반드시 지정해야 하며, 두글자로 된 국가 코드를 추가로 지정할 수 있음

    ▸ 언어코드와 국가코드는 하이픈이나 밑줄로 구문해야 함 (ko_kr)

    ▸ null이면 기본로케일을 사용함 (JVM의 기본 로케일 또는 web.xml파일에서 설정한 로케일을 기본 로케일로 사용함)

  • scope : 지정한 Locale이 영향을 미치는 범위를 지정, 기본값 page

<fmt:requestEncoding>

요청파라미터의 문자셋 인코딩을 지정

요청 파라미터의 인코딩을 utf-8로 하고싶다면 다음과 같이 하면됨

예제

<fmt:requestEncoding value="utf-8" />

<% request.setCharacterEncoding("utf-8"); %> //위 코드는 아래 코드와 동일함

Message Processing Tag

Resource Bundle

메시지 번들 파일은 클래스 패스에 위치해야 하기 때문에 WEB-INF\classes폴더나 WEB-INF\lib에 포함된 jar파일에 포함해야 함

리소스 번들파일은 기본적으로 java.util.Properties 클래스를 사용해서 읽어오기 때문에 확장자가 .properties임

리소스번들파일에서 중요한 점은 리소스번들파일의 이름을 정해진 규칙에 의거 작성해야 함

예를들어 “번들이름_국가.properties”의 형식으로 작성해야 하고 국가코드는 생략할 수 있음

  1. 영문 메시지를 보여줄 때 사용할 리소스 번들 파일

    message.properties

     TITLE=Learning JSP/Servlet
     GRETTING=Hello JSP/Servlet?
     USER=Your Id is {0} ! 
    
  2. 한글 메시지를 보여줄 때 사용할 리소스 번들 파일

    message.properties.src

     TTILE=최범균의 JSP배우기
     GREETING=안녕하세요 최범균입니다
     VISITOR= 당신의 아이디는{0}입니다
    

    리소스 번들 파일은 직접 작성하지 못함, 유니코드로 변경한 형태로 변환한 파일을 사용할 수 있음

    JDK가 제공하는 native2ascii.exe를 사용해야 함

    위 파일 생성 후 명령프롬프트 경로잡기 아래명령어 치기

     C:\> e:
     E:\> cd lec\05.jsp\jsp01_basic\WebContent\WEB-INF\classes\resource
     E:\...> native2ascii message_ko.properties.src message_ko.properties
    

    마지막 명령어를 사용하면 한국어가 유니코드로 변경된 properties파일이 생성됨

<fmt:bundle>

태그몸체에서 사용할 리소스 메세지 번들을 지정, message태그와 함께 사용함

예제

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

<fmt:bundle basename="resource.message">
	<fmt:message key="TITLE" var="title"></fmt:message>
</fmt:bundle>

<h3>${title}</h3>

Summary of attributes of fmt:bundle

fmt:bundle태그의 속성 설명요약

속성표현식/EL타입설명
basename사용가능String사용할 리소스 번들의 이름
prefix사용가능Stringbundle 태그의 내부에서 사용되는 message태그의 key 속성의 값 앞에 자동으로 붙게 될 문자열

<fmt:message>

지정한 리소스 번들로부터 메시지를 읽어와 출력 메시지를 출력

Summary of attributes of fmt:message

fmt:message태그의 속성 설명요약

  • key : 읽어올 메세지의 키값

  • var : 메시지를 저장할 변수 명, 속성을 지정하면 메시지를 출력하지 않고 var속성으로 지정한 변수에 저장함

  • scope : 변수가 저장되는 영역 지정

  • bundle : 태그를 사용해서 로딩한 번들로부터 메시지를 읽어올 때 사용

리소스 번들이 제공하는 메시지 중에는 위와같이 {0}, {1}, {2}와 같이 변경 가능한 요소를 제공하는 메시지가 존재할 때, 그 값을 지정하려면 fmt:messate 태그에 fmt:param 태그를 사용해야함

주의할 점은 자바 배열의 인덱스와 마찬가지로 시작 번호가 0이라는 점!

1개 존재할 때

<fmt:message key="VISITOR">
    <fmt:param value="${id}" />
</fmt:message>

여러개 존재할 때

<fmt:message key="VISITOR">
    <fmt:param value="${id}" />      // 0에 들어감
    <fmt:param value="${name}" />    // 1에 들어감
    <fmt:param value="${email}" />   // 2에 들어감
</fmt:message>

Resource bundle Search Order

다음과 같은 순서로 리소스 번들을 검색함

  1. bungle 속성에 지정한 리소스 번들을 사용

  2. 태그에 중첩된 경우 태그에서 설정한 리소스 번들 사용
  3. 1이나 2가 아닐 경우 기본 리소스 번들 사용

    기본 리소스 번들은 web.xml파일에서 javax.servlet.jsp.jstl.fmt.localizationContext 속성을 통해서 설정

<fmt:setBundle>

특정메시지를 사용할 수 있도록 지정

bundle은 태그 안에서 사용될 리소스 번들을 지정하는 반면 setBundle은 리소스 번들을 변수로 저장한 후 어디서나 사용할 수 있게 함

syntax

Summary of attributes of fmt:setBundle

fmt:setBundle태그의 속성 설명요약

속성표현식/EL타입설명
basename사용가능String읽어올 리소스 번들의 이름
var사용불가String리소스 번들을 저장할 변수 명
scope사용불가String변수를 저장할 영역

<fmt:formatNumber>

숫자를 양식에 맞춰 출력

syntax

<fmt:formatNumber value="숫자값" [type="값타입"] [pattern="패턴"]
    [currentCode="통화코드"] [currencySymbol="통화심볼"]
    [groupingUsed="(true/false)"] [var="변수명"] [scope="영역"] />

예제

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
<c:set var="price" value="10000" />
<fmt:formatNumber value="${price}" type="number" var="numberType" />
<br/>
통화: <fmt:formatNumber value="${price}" 
            type="currency" currencySymbol="원" /> <!--원10,000.00-->
<br/>
퍼센트: <fmt:formatNumber value="${price}" 
            type="percent" groupingUsed="false" /><!--100000%-->
<br/>
숫자: ${numberType}<!--10,000-->
<br/>
패턴: <fmt:formatNumber value="${price}" pattern="00000000.00"/><!--00010000.00-->

Summary of attributes of fmt:formatNumber

fmt:formatNumber태그의 속성 설명요약

속성표현식/EL타입설명
value사용가능String / Number양식에 맞춰 출력할 숫자를 지정
type사용가능String어떤 양식으로 출력할지 정함. number → 숫자(기본값), percent → %, currency → 통화
pattern사용가능String직접 숫자가 출력되는 양식을 지정
currencyCode사용가능String통화 코드를 지정
currentSymbol사용가능String통화를 표현할 때 사용할 기호를 표시
groupingUsed사용가능Boolean콤마와 같이 단위를 구분할 때 사용되는 기호를 사용할 지의 여부를 결정.
var사용불가String포멧팅한 결과를 저장할 변수명을 지정
scope사용불가String변수를 저장할 영역 지정, 기본값 page

<fmt:parseNumber>

문자열을 숫자(Number) 타입으로 변환해주는 기능

syntax

<fmt:parseNumber value="값" [type="값타입"] [pattern="패턴"]
        [parseLocale="통화코드"] [integerOnly="true/false"]
        [var="변수명"] [scope="영역"] />

예제

<fmt:parseNumber value="1,100.12" pattern="0,000,00" var="num" />

${num}

Summary of attributes of fmt:parseNumber

fmt:parseNumber태그의 속성 설명요약

속성표현식/EL타입설명
value사용가능String파싱할 문자열을 지정
type사용가능Stringvalue 속성의 문자열 타입을 지정 number → 숫자(기본값), percent → %, currency → 통화
pattern사용가능String직접 파싱할 때 사용할 양식을 지정
parseLocale사용가능String파싱할 때 사용할 로케일을 지정
integerOnly사용가능String정수 부분만 파싱할 지의 여부를 지정. 기본값 false
var사용불가String포멧팅한 결과를 저장할 변수명을 지정
scope사용불가String변수를 저장할 영역 지정, 기본값 page

<fmt:formatDate>

날짜 정보를 담고 있는 객체를 포메팅하여 출력할 때 사용

syntax

<fmt:formatDate value="날짜값" [type="타입"] [dateStyle="날짜스타일"] 
        [timeStyle="시간스타일"] [pattern="패턴"] [timeZone="타임존"]
        [var="변수명"] [scope="영역"] />

예제

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

<c:set var="now" value="<%= new java.util.Date() %>" />
<fmt:formatDate value="${now}" type="date" dateStyle="full" /> <br>
<fmt:formatDate value="${now}" type="date" dateStyle="short" /> <br>
<fmt:formatDate value="${now}" type="time" /> <br>
<fmt:formatDate value="${now}" type="both" 
                dateStyle="full" timeStyle="full" /> <br>
<fmt:formatDate value="${now}" pattern="z a h:mm" /> <br>

Summary of attributes of fmt:parseNumber

fmt:parseNumber태그의 속성 설명요약

속성표현식/EL타입설명
value사용가능java.util.Date포메팅할 시간 값을 지정
type사용가능String날찌, 시간 또는 둘 다 포맷팅할 지 여부를 지정. time, date(기본값), both중 한 가지 값을 가질 수 있음
dateStyle사용가능String날짜에 대해 미리 정의된 포멧팅 스타일을 지정
timeStyle사용가능시간에 대해 미리 정의된 포멧팅 스타일을 사용 
pattern사용가능직접 파싱할 때 사용할 양식을 지정 
timeZone사용불가시간대를 변경하고 싶을 때 사용 
var사용불가파싱한 결과를 저장할 변수명을 지정 
scope사용불가변수를 저장할 영역을 지정, 기본값은 page 

<fmt:parseDate>

문자열로 표시된 날짜와 시간 값을 java.util.Date로 파싱해주는 기능

syntax

<fmt:parseDate value="날짜값" [type="타입"] [dateStyle="날짜스타일"] 
        [timeStyle="시간스타일"] [pattern="패턴"] [timeZone="타임존"] [parseLocale="로케일"]
        [var="변수명"] [scope="영역"] />

예제

<fmt:parseDate value="2009-03-01 13:00:59" pattern="yyyy-MM-dd HH:mm:ss" var="date"/>
${date}

Summary of attributes of fmt:parseDate

fmt:parseDate태그의 속성 설명요약

속성표현식/EL타입설명
value사용가능java.util.Date포메팅할 시간 값을 지정
type사용가능String날자, 시간 또는 둘 다 포맷팅할 지 여부를 지정. time, date(기본값), both중 한 가지 값을 가질 수 있음
dateStyle사용가능String날짜에 대해 미리 정의된 포멧팅 스타일을 지정
timeStyle사용가능시간에 대해 미리 정의된 포멧팅 스타일을 사용 
pattern사용가능직접 파싱할 때 사용할 양식을 지정 
timeZone사용불가시간대를 변경하고 싶을 때 사용 
parseLocale사용가능String 또는 java.util.Locale파싱할 때 사용할 로케일을 지정
var사용불가파싱한 결과를 저장할 변수명을 지정 
scope사용불가변수를 저장할 영역을 지정, 기본값은 page 

Time Zone Setting Tag

JSTL 포메팅 태그도 시간대별로 시간을 처리할 수 있는 기능을 제공

<fmt:timeZone> / <fmt:setTimeZone>

fmt:timeZone value속성으로 시간대를 입력받으며 timeZone태그 안에서 사용된 formatDate태그에 영향을 미침

예제

<fmt:timeZone value="HongKong">
    <fmt:formatDate ..../> <!--사용하는 시간을 Hongkong 시간대에 맞춤-->
</fmt:timeZone>

현재 시간과 홍콩 시간 두가지 출력하기

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

<c:set var="now" value="<%= new java.util.Date() %>" />

<fmt:formatDate value="${now}" type="both" 
                dateStyle="full" timeStyle="full" /><!--현재 시간-->

<br>
<fmt:timeZone value="Hongkong">
<fmt:formatDate value="${now}" type="both" 
                dateStyle="full" timeStyle="full" /><!--홍콩 시간-->
</fmt:timeZone>

web.xml 파일에 국제화 관련 태그 기본값 설정하기

웹 어플리케이션이 기본으로 사용할 로케일 정보나 시간대를 web.xml파일에 컨텍스트 초기화 파라미터를 이용해서 설정할 수 있음.

예를들어 기본 리소스 번들은 resource.message 를 사용하고 시간대를 홍콩 시간대로 지정하고 싶다면 다음과 같이 web.xml파일에 컨텍스트 초기화 파라미터를 추가해 주면 됨

<web-app>
   ...
    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
        <param-value>resource.message</param-value>
    </context-param>

    <context-param>
        <param-name>javax.servlet.jsp.jstl.gmt.timeZone</param-name>
        <param-value>Hongkong</param-value>
    </context-param>
</web-app>

이 웹사이트는 jekyll로 제작되었습니다. Patrick Marsceill, Distributed by an MIT license.