국제적으로노는 JSTL 지역별로다른기능을사용할수있도록설정하는 <fmt:setlocale> 커스텀액션 - 날짜와시간, 통화기호들은사용하는언어와국가에따라서달라진다. - <fmt:setlocale> 액션태그는이런차이를반영해서특정지역에맞도록데이터의형태를설정할때사용한다. - 다음은영어권지역으로설정하는예 <fmt:setlocale value="en" /> - 위의예에서 "en" 은영어권지역을의미한다. 이와같이설정한후 <fmt:formatdate> 액션태그를사용하면출력되는날짜의형태가 요일, 월일, 년도 순서가된다. - 이태그를국가로도지정할수있다. 같은영어권지역이라고하더라도미국과영국등으로국가는다르다. - 이와같은경우언어지역과국가를동시에지정한다. <fmt:setlocale value="en_us" /> - 위의기능은날짜와시간이영어권에맞게설정되고, <fmt:formatnumber /> 액션을이용해서출력되는모든금액앞에는달러를의미하는 $ 기호가자동으로추가된다. 언어코드와국가코드는국제표준화기구에서제정한것으로, 전세계의언어코드와국가코드를검색하려면자바 API 의 Locale 클래스를찾은후내용중 "ISO language Code" 와 "ISO Country Code" 를클릭하면자세한내용을살펴 볼수있다.
- 다음은 대한민국, 미국, 일본 의화폐문자출력과날짜, 시간을출력하는 JSP(WorldFormat.jsp) <%@page contenttype="text/html; charset=euc-kr"%> <%@page import="java.util.*"%> <%@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="1000000" type="currency" /> <BR> 일시 : <fmt:formatdate value="${date}" type="both" datestyle="full" timestyle="full" /> <BR> <H3> 미국의포맷 </H3> <fmt:setlocale value="en_us" /> 금액 : <fmt:formatnumber value="1000000" type="currency" /> <BR> 일시 : <fmt:formatdate value="${date}" type="both" datestyle="full" timestyle="full" /> <BR> <H3> 일본의포맷 </H3> <fmt:setlocale value="ja_jp" /> 금액 : <fmt:formatnumber value="1000000" type="currency" /> <BR> 일시 : <fmt:formatdate value="${date}" type="both" datestyle="full" timestyle="full" /> <BR> </BODY> </HTML> 시간대를설정하는 <fmt:timezone>, <fmt:settimezone> 액션태그 - 날짜와시각은지구상의지역을구분해서변경된다. 즉, 동일한시간대에있는지역의시간은모두동일하지만다른시간대에있는지역의시간과는서로다르다. - <fmt:timezone> 액션태그는이와같이시간대에해당하는지역이름을설정하는역할을한다. - <fmt:timezone> 의시작태그와종료태그사이에포함된영역에영향을미쳐서출력되는날짜와시각은해당시간대영영ㄱ에맞게표시된다. <fmt:timezone value="america/new_york"> 날짜 : <fmt:formatdate value="${date}" type="date" /> 시작태그와종료태그사이에영향을미친다. 시각 : <fmt:formatdate value="${date}" type="time" /> 시작태그와종료태그사이에영향을미친다. </fmt:timezone> - 위의예는날짜와시각을미국의뉴욕시간대에맞춰서출력한다. 위에서사용한 "America/New_York" 은시간대를대표하는지역의이름으로반드시지정된이름을사용해야한다. 시간대의대표지역이름은 java.util.timezone 클래스의 getavailableids() 메서드를호출해서파악할수있다. 이메서드의리턴타입은 String[] 이고배열의값을모두출력해보면시간대의모든대표지역이름을살펴볼수있다. 다음은시간대의대표지역이름리스트를출력하는 JSP의예
<%@ page contenttype="text/html; charset=euc-kr" %> <%@ page import="java.util.timezone" %> <html> <head><title> 시간대대표지역이름리스트 </title></head> <body> <% String timelist[] = TimeZone.getAvailableIDs(); for(int cnt = 0; cnt < timelist.length; cnt++) { out.println(timelist[cnt] + "<br>"); } %> </body> </html> - 다음은 <fmt:timezone> 액션태그를사용해서각지역별현재시각을출력하는 JSP(WorldTime.jsp) <%@page contenttype="text/html; charset=euc-kr"%> <%@page import="java.util.*"%> <%@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> - <fmt:settimezone> 태그는 <fmt:timezone> 태그와같은기능을갖고있다. 차이점은시작태그와종료태그사이에영향을미치는것이아니라태그가사용된다음의모든부분에영향을미친다. - 다음은위의 WorldTime.jsp를 <fmt:settimezone> 태그를사용해서다시작성한예 <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> 바로위태그의영향을받는다. 즉 뉴욕 도전과제 : 각대륙별 ( 아프리카, 유럽, 아시아, 아메리카, 오세아니아 ) 로국가를선택해서각국가들의시각을출력 하는 JSP 를작성하세요. 유식한 JSTL. 세계각국의언어로출력할수있다. - 위에서살펴본것처럼 JSTL은세계의다양한지역의상황에맞게출력되는형태를변경하는기능을제공하고있다. - 그런데, 위와같이날짜나시각이라는데이터가아닌일반문자열도여러나라의언어로표현해야할경우도있다. - 예를들어, 하나의 JSP 페이지를작성한후고객이사용하는웹브라우저의설정언어에따라서해당지역의언어를출력할수있다. 즉, 전세계에공장을가지고있는다국적기업인경우에는회사의소개웹페이지를다양한언어로제공해야할필요가있다. - 이런경우에사용하는액션태그가 <fmt:sebundle> 이나 <fmt:bundle> 액션태그이다. - 이태그들은하나의 JSP 웹페이지를사용해서여러가지의언어를생성하는기능을지원한다. - 이태그들은브라우저의설정언어에따라서로다른파일을읽어서출력하는방식을사용하므로, 사용하려는언어의갯수만큼해당언어로작성된파일을생성해야한다. 이런파일을 프로퍼티파일 (property file) 이라고한다. - 프로퍼티파일 은문자열데이터를 키 = 값 ( 문자열 ) 의형태로작성된파일이다. - 한글로작성된데이터를내용으로하는프로퍼티파일과, 일어로작성된데이터를내용으로하는프로퍼티파일을만들고, 이프로퍼티파일을액션태그가사용해서다른종류의언어를내용으로하는웹페이지가생성된다. - 프로퍼티파일 을사용하지않는다면, 한글로작성된페이지와, 일어로작성된페이지각각이있어야하지만, 웹페이지의구조를하나만들고내용에대한부분을각각의언어로 프로퍼티파일 을만들면, 별도의웹페이지작성없이한글과일어로작성된웹페이지를생성할수있다. - 다음은한글과영어로작성된 프로퍼티파일 의예 한글로작성된프로퍼티파일의내용 TITLE= 회사소개 GREETING= 우리회사를방문해주셔서감사합니다. BODY= 우리회사는웹어플리케이션을전문적으로개발하는회사입니다. COMPANY_NAME=( 주 ) 대양컴퍼니 영어로작성된프로퍼티파일의내용 TITLE=About Us GREETING=Thank for your visiting our company BODY=We are a dedicated company to develop web application COMPANY_NAME=DaeYang Company Inc. - 위의프로퍼터파일의내용을보면키와값의쌍으로데이터가저장되어있슴을확인할수있다. - 프로퍼티파일은내용을작성하는규칙외에도파일의확장자를정하는규칙도존재한다. 1 파일의확장자는반드시 properties 이어야한다.( 예 intro.properties) 2 파일이름뒤에밑줄 (_) 을붙이고언어코드를쓴후확장자를붙인다. 즉, 파일의이름이 Intro이면, 한글인경우 Intro_ko, 영어인경우 Intro_en이된다. 따라서, 전제적인프로퍼티파일의이름은 Intro_ko.properties, Intro_en.properties 이다. 3 /WEB-INF/classes 폴더에프로퍼티파일들을저장한다.
영문프로퍼티파일의작성 - 영문프로퍼티파일은파일이름과언어코드그리고.properties 확장자를붙여서파일을생성하고, 영문으로내용을입력하면완성된다. 한글프로퍼티파일의작성 - 한글은국제표준의문자코드로변환하기위해별도의변환작업을수행해야한다. 1 한글을내용으로하는프로퍼티파일을만들고확장자를 properties.??? 형식으로설정한다.??? 부분에는별도의단어를추가해서변환하기전의파일임을나타내도록한다. 예를들어, XXX_ko.properties.org 라고하면내용이변환되기전의프로퍼티파일임을쉽게알수있다. 2 명령어창을열어서 "native2ascii XXX_ko.properties.org XXX_ko.properties" 라는명령어를실행해서한글을표준문자코드로변환한다. 3 이클립스의해당프로젝트폴더를선택한후 refresh" 를클릭해서새로고침을해서프로퍼티즈파일이정상적으 로생성되었는지확인한다. 국제화웹페이지만들기준비완료! 사용할태그는 <fmt:setbundle> - <fmt:setbundle> 을사용해서사용할프로퍼티파일을지정한다. - 파일을지정할때는 <fmt:setbundle basename=" 파일이름 " /> 으로지정한다. 여기주의할사항은 파일이름 에는위에서만든프로퍼티즈파일의전체이름을사용한것이아니라, 파일이름중밑줄과언어코드, 그리고확장자
(properties) 는제외한이름을사용한다. - 프로퍼티즈파일이름이 Intro_ko.properties 이면 basename="intro" 만지정한다. - 프로퍼티즈파일이름지정이완료되었으면, <fmt:message key="???" /> 태그를사용해서프로퍼티즈파일에있는 키 의이름을??? 부분에명시한다. 그러면, 웹페이지에는지정된 키 에해당하는 값 이출력된다. 다음의예제에사용할프로퍼티즈파일 (Intro_ko.properties) 의내용 TITLE=\ud68c\uc0ac\uc18c\uac1c GREETING=\uc774 \uc0ac\uc774\ud2b8\ub97c \ubc29\ubb38\ud574 \uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4. BODY=\ub2f9\uc0ac\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc14\ub97c \uc8fc \uc5c5\ubb34\ub85c \ud558\ub294 \ud68c\uc0ac\uc785\ub2c8\ub2e4. COMPANY_NAME=(\uc8fc)\uc54c\ud30c \uc18c\ud504\ud2b8\uc6e8\uc5b4 - 위에서확인하듯이한글이표준코드로변경되어있다. 회사소개글언어별출력 JSP(CompanyIntro.jsp) <%@page contenttype="text/html; charset=euc-kr"%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <fmt:setbundle basename="intro" /> 위에서작성한프로퍼티즈파일이름.( 확장자, 밑줄, 언어코드제외 ) <HTML> <HEAD><TITLE><fmt:message key="title" /></TITLE></HEAD> TITLE에해당하는값출력 <BODY> <H3><fmt:message key="title" /></H3> TITLE에해당하는값출력 <fmt:message key="greeting" /> <BR><BR> GREETING에해당하는값출력 <fmt:message key="body" /> <BR><BR> BODY에해당하는값출력 <FONT size=2><fmt:message key="company_name" /></FONT> COMPANY_NAME의값출력 </BODY> </HTML>
위 JSP 의결과화면 이번에는영문으로작성된내용출력 - 사용하는웹브라우저의언어를 영어 로설정한뒤동일한 JSP를다시시작한다. - 웹브라우저의 언어 를변경하는방법 웹브라우저의 도구 클릭 인터넷옵션 클릭 일반 탭화면의하단에 언어 클릭 영어 를 위로이동 혹은 영어 가없으면 추가 버튼을눌러서 영어 를추가 위 JSP 의결과화면
프로퍼티즈파일을쉽게만들어주는플러그-인 - 영어이외의프로퍼티즈파일을만드는방법은다소번거롭기도하고생성된프로퍼티즈파일의내용을알아보기도어렵다. - 번거로운프로퍼티즈파일을만드는방법을쉽게하는이클립스플러그-인을다음의순서로설치한다. 1 이클립스의 Help 메뉴의 Software Updates 선택 2 Add Site를선택해서 http://propedit.sourceforge.jp/eclipse/updates/ 입력 3 잠시기다리면, 설치가능한파일들목록이출력되는데, PropertiesEditor 를선택해서설치한다. 4 프로퍼티즈파일을생성하러면, "New" 선택후 기타 에서 Java" 항목의 프로퍼티파일 을선택한다. 5 프로퍼티즈파일의이름을입력해서생성한다. 6 내용을입력하려면, 프로퍼티즈파일을마우스로선택하고, 마우스의오른쪽버튼을클릭해서 "Open With" 항목을선택한후 "PropertiesEditor" 메뉴를선택한다. 7 프로퍼티즈파일을만드는규칙에따라내용을입력한다. 한글로입력하면자동으로한글이표준코드로바뀌어저장된다. 어떤언어로입력해도저장될때는표준코드로바뀌어서저장된다. 변수를사용한 <fmt:message> 액션태그 - <fmt:message key="title" /> 를사용하면해당위치에값이출력된다. 그런데, 이값을바로출력하는대신에변수에저장시켜서여러번반복해서사용할수도있다. - <fmt:message var="title" key="title" /> 이와같이 var항목지정된변수를사용할수있다. - 다음은위의 "CompanyIntro.jsp" 를변수를사용할수있도록변경한 JSP <%@page contenttype="text/html; charset=euc-kr"%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <fmt:setbundle basename="intro" /> <fmt:message var="title" key="title" /> <fmt:message var="greeting" key="greeting" /> <fmt:message var="body" key="body" /> <fmt:message var="companyname" key="company_name" /> <HTML> <HEAD><TITLE><fmt:message key="title" /></TITLE></HEAD> <BODY> <H3>${title}</H3> ${greeting} <BR><BR> ${body} <BR><BR> <FONT size=2>${companyname}</font> </BODY> </HTML>
<fmt:bundle> 액션태그 - 이액션태그는 <fmt:setbundle> 액션태그와기능은같지만시작태그와종료태그사이에있는부분만영향을미친다. - 다음은위의예를 <fmt:bundle> 액션태그로변경한예 <fmt:bundle basename="intro" > <fmt:message var="title" key="title" /> <fmt:message var="greeting" key="greeting" /> <fmt:message var="body" key="body" /> <fmt:message var="companyname" key="company_name" /> </fmt:bundle> 웹페이지에서프로퍼티즈파일로의데이터전송 - 프로퍼티즈파일의내용에 변경되는부분 은완성할수없다. 예를들어,??? 님반갑습니다. 를출력할때물음표부분은미리그내용을알수없기때문에프로퍼티즈파일내용으로작성할수없다. - 이부분에파라미터를사용하면전달받은값을출력할수있다. 즉, 위의물음표부분에전달받은값을출력하면방문한고객의이름을대입함으로써완성된문장을출력할수있다. - 다음은파라미터를통해서값을출력할수있도록작성된프로퍼티즈파일의예 GREETING= 안녕하세요. {0} 님, 반갑습니다. 당신의취미는 {1} 이네요. - 위의 {0} 과 {1} 에전달받은값을출력한다. - 다음은위의 {0} 과 {1} 에데이터를전달하는 JSP 페이지의코드 <fmt:message var="greeting" key="greeting" > <fmt:param>bigtree</fmt:param> 프로퍼티즈파일의 {0} 부분에대응된다. <fmt:param>watcing TV</fmt:param> 프로퍼티즈파일의 {1} 부분에대응된다. </fmt:message> <fmt:message> 액션태그를사용한예 - 다음은입력된 사용자이름 과 취미 를출력할수있는한글프로퍼티즈파일 (Welcome_ko.properties) TITLE= 환영인사 GREETING= 안녕하세요 {0} 님, 취미가 {1} 이군요. BODY= 좋은취미를갖고계십니다.\ 문장이길때다음줄로이어진다는의미즐거운시간을보내시기바랍니다. COMPANY_NAME=( 주 ) 알파엔터테인먼트 - 다음은입력된 사용자이름 과 취미 를출력할수있는영문프로퍼티즈파일 (Welcome_en.properties) TITLE=Welcome GREETING=How are you, Dear {0}, Your hobby is {1}. BODY=You have a good hobby. Have a good time. COMPANY_NAME=Alpha Entertainment Inc. - 다음은 사용자이름 과 취미 를입력할수있는입력창 (InputNameHobby.html) <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr"> <title>insert title here</title> </head> <body> <form action="welcomeview.jsp" method="post"> 당신의이름을입력하세요. <input type="text" name="id"><br> 당신의취미를입력하세요. <input type="text" name="hobby"><br> <input type="submit" value=" 입력 "/> </form> </body> </html> - 다음은입력된 사용자이름 과 취미 를프로퍼티즈파일을사용해서출력할수있는 JSP(WelcomeView.jsp) <%@ page language="java" contenttype="text/html; charset=euc-kr" pageencoding="euc-kr"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <fmt:bundle basename="welcome" > <fmt:message var="title" key="title" /> <fmt:message var="greeting" key="greeting" > <fmt:param>${param.id}</fmt:param> <fmt:param>${param.hobby}</fmt:param> </fmt:message> <fmt:message var="body" key="body" /> <fmt:message var="comapnyname" key="comapny_name" /> </fmt:bundle> <html> <head> <meta http-equiv="content-type" content="text/html; charset=euc-kr"> <title>${title }</title> </head> <body> ${greeting }<br><br> ${body }<br><br> <font size=2>${companyname }</font> </body> </html> POST 방식으로전송된한글데이터를받아서처리할수있도록해주는 <fmt:requestencoding> 액션태그 - 웹브라우저에서 <form> 태그를통해서입력된한글데이터를 POST 방식으로전송하면별도의처리를해주지않는이상한글이깨져서출력된다. - 이러한현상은한글데이터를국제표준코드로다시변경해야한글데이터가깨지는현상을방지할수있다. - 지금까지는자바코드를사용해서국제표준코드로변경하는작업을수행했다.
<% request.setcharacterencoding("euc-kr"); %> - 하지만, 웹페이지에서자바코드를사용하지않아야하므로, 이를대신할수있는태그가필요하게되었으며, 이러한기능의태그가 <fmt:requestencodeing value="euc-kr" /> 태그이다. - 위의예에서 사용자이름 과 취미 를모두한글로입력하면출력되는결과화면에한글이깨져서출력된다. - 한글의깨짐현상을방지하기위해서는위의 JSP 페이지상단에 <fmt:requestencoding value="euc-kr" /> 을추가한다. 도전과제 : 본인의소개글을한글과일어, 영어로출력할수있도록프로퍼티즈파일과웹페이지를작성하세요.