詳見:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt326html
JSTL標籤提供了對國際化(I18N)的支持,它能夠根據發出請求的客戶端地域的不一樣來顯示不一樣的語言。同時還提供了格式化數據和日期的方法。實現這些功能須要I18N格式標籤庫(I18N-capable formation tags liberary)。引入該標籤庫的方法爲:java
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>git
I18N格式標籤庫提供了11個標籤,這些 標籤從功能上能夠劃分爲3類以下:web
(1)數字日期格式化。formatNumber標籤、formatData標籤、parseNumber標籤、parseDate標籤、timeZone標籤、setTimeZone標籤。瀏覽器
(2)讀取消息資源。bundle標籤、message標籤、setBundle標籤。session
(3)國際化。setlocale標籤、requestEncoding標籤。app
接下將詳細介紹這些標籤的功能和使用方式。jsp
9.3.1 數字日期格式化工具
數字日期格式化標籤共有6個,用來將數字或日期轉換成設定的格式。測試
1.<frm:formatNumber/>標籤
該標籤依據特定的區域將數字改變爲不一樣的格式來顯示。
【語法1】:
<frm:formatNumber value=」被格式化的數據」[type=」number|currency|percent」]
[pattern=」pattern」]
[currencyCode=」code」]
[currencySymbol=」symbol」]
[groupingUsed=」true|false」]
[maxIntergerDigits=」maxDigits」]
[minIntergerDigits=」minDigits」]
[maxFractionDigits=」maxDigits」]
[minFractionDigits=」minDigits」]
[var=」name」]
[scope=page|request|session|application]
/>
【語法2】:
<frm:formatNumber [type=」number|currency|percent」]
[pattern=」pattern」]
[currencyCode=」code」]
[currencySymbol=」symbol」]
[groupingUsed=」true|false」]
[maxIntergerDigits=」maxDigits」]
[minIntergerDigits=」minDigits」]
[maxFractionDigits=」maxDigits」]
[minFractionDigits=」minDigits」]
[var=」name」]
[scope=page|request|session|application]
>
<fmt:formatNumber>標籤參數說明:
名稱 |
說明 |
EL |
類型 |
必須 |
默認值 |
value |
要格式化的數據 |
是 |
String |
是 |
無 |
type |
指定類型(單位、貨幣、百分比等)見表 |
是 |
String |
否 |
number |
pattern |
格式化的數據樣式 |
是 |
String |
否 |
無 |
currencyCode |
貨幣單位代碼 |
是 |
String |
否 |
無 |
cuttencySymbol |
貨幣符號($、¥) |
是 |
String |
否 |
無 |
groupingUsed |
是否對整數部分進行分組如(9,999) |
是 |
boolean |
是 |
true |
maxIntergerDigits |
整數部分最對顯示多少位數 |
是 |
int |
否 |
無 |
minIntergerDigits |
整數部分最少顯示多少位 |
是 |
int |
否 |
無 |
maxFractionDigits |
小數部分最多顯示多少位 |
是 |
int |
否 |
無 |
minFractionDigits |
小數部分最少顯示多少位 |
是 |
int |
否 |
無 |
var |
存儲格式化後的數據 |
否 |
String |
否 |
無 |
scope |
var的JSP範圍 |
否 |
String |
否 |
page |
Type屬性的類型應用:.
類型 |
說明 |
示例 |
number |
數字格式 |
0.8 |
currency |
當地貨幣 |
¥0.80 |
percent |
百分比格式 |
80% |
【示例代碼】:實現了對數字的格式化、貨幣的格式、貨幣的格式化。使用<frm:formatNumber>的各類屬性的設定。
<table border=1 cellpadding="0" cellspacing="0" align="center">
<tr align="center">
<td width="100">類型 </td>
<td width="100">使用數據</td>
<td width="100">結果</td>
<td width="300">說明</td>
</tr>
<tr>
<td>數字格式化</td><td>108.75</td>
<td><fmt:formatNumber type="number" pattern="###.#">108.75</fmt:formatNumber></td>
<td>使用pattern能夠定義顯示的樣式。本例設定爲###.#小數部分將使用四捨五入法。</td>
</tr>
<tr>
<td>數字格式化</td><td>9557</td>
<td><fmt:formatNumber type="number" pattern="#.####E0">9557</fmt:formatNumber></td>
<td>使用科學計數法。</td>
</tr>
<tr>
<td>數字格式化</td><td>9557</td>
<td><fmt:formatNumber type="number" >9557</fmt:formatNumber></td>
</td>
<td>使用默認分組。</td>
</tr>
<tr>
<td>數字格式化</td><td>9557</td>
<td><fmt:formatNumber type="number" groupingUsed="false" >9557</fmt:formatNumber></td>
<td>不使用分組。</td>
</tr>
<tr>
<td>數字格式化</td><td>9557</td>
<td><fmt:formatNumber type="number" maxIntegerDigits="3">9557</fmt:formatNumber></td>
<td>使用位數限定,根據指定的位數顯示,其餘數字忽略。例如:9不被顯示。</td>
</tr>
<tr>
<td>百分比格式化</td><td>0.98</td>
<td><fmt:formatNumber type="percent">0.98</fmt:formatNumber></td>
<td>用百分比形式顯示一個數據。</td>
</tr>
<tr>
<td>貨幣格式化</td><td>188.88</td>
<td><fmt:formatNumber type="currency" >188.8</fmt:formatNumber></td>
<td>將一個數據轉化爲貨幣形式輸出。</td>
</tr>
<tr>
<td>存儲數據</td><td>188.88</td>
<td><fmt:formatNumber type="currency" var="money">188.8</fmt:formatNumber>
<c:out value="${money}"></c:out>
</td>
<td>存儲的money的值爲${money} </td>
</tr>
</table>
【代碼說明】:
(1)從應用角度能夠把屬性分爲三類:數字格式化、貨幣格式化、百分比格式化。使用type指定類型。
(2)應用於數字格式化的屬性有:partten屬性、maxIntegerDigits屬性、minIntegerDigits屬性、maxFractionDigits屬性和minFactionDigits屬性。其中partten屬性在設定格式化樣式時會比較準確如:四捨五入、科學計數法的使用。而使用maIntegerDirgits等屬性時,只把設定位數之外的數字捨去。
(3)貨幣格式化可使用數字格式化的全部屬性。若是有必要建議使用partten屬性。currencyCode屬性和currencySymbol只用於貨幣格式化。
(4)百分比格式化使用到的屬性爲type屬性、partten屬性,設定type屬性的類型爲percent便可。
(5)使用var屬性時,會將格式化後的值存在JSP的某個範圍內(一個String類型的字符串包括符號等)。<frm:forNumber>將再也不輸出格式化後的值可使用EL表達式輸出。
(6)通用屬性:type屬性、partten屬性、var屬性和scope屬性。
2.<frm:parseNumber>標籤
將格式化後的數字、貨幣、百分比都轉化爲數字類型。
【語法1】:
<fmt:parseNumber value="number" [type=」number|currency|percent」]
[pattern=」pattern」]
[parseLocale=」locale」]
[intergerOnly=」true|false」]
[scope=」page|request|session|application」]
/>
【語法2】:
<fmt:parseNumber [type=」number|currency|percent」]
[pattern=」pattern」]
[parseLocale=」locale」]
[intergerOnly=」true|false」]
[scope=」page|request|session|application」]
>
Number
</fmt:parseNumber>
<fmt:parseNumber>標籤參數說明:
名稱 |
說明 |
EL |
類型 |
是否必須 |
默認值 |
value |
被解析的字符串 |
是 |
String |
是 |
無 |
type |
指定單位(數字、貨幣、百分比) |
是 |
String |
是 |
number |
pattern |
格式樣式 |
是 |
String |
否 |
無 |
parseLocale |
用來替代默認區域的設定 |
是 |
String, Java.util. Locale |
是 |
默認本地樣式 |
var |
存儲已經格式化的數據 |
否 |
String |
否 |
無 |
scope |
var變量的做用域 |
否 |
String |
是 |
page |
<fmt:parseNumber>能夠看做是<fmt:formatNumber>的逆運算。相應的參數和類型的配置和使用<fmt:formatNumber>格式化時相同。
【示例代碼】:實現了從字符串中提取數據,並用合適的數據類型進行存儲(浮點性、整型等)。能夠對轉換後的數據進行加法運算。
<fmt:formatNumber type="currency" var="money">188.8</fmt:formatNumber>
<li>格式化前的數據爲:<c:out value="${money}"></c:out>
<fmt:parseNumber var="money" type="currency">${money}</fmt:parseNumber>
<li>格式化後的數據爲:<c:out value="${money}"></c:out>
<li>能夠對格式化的後的數據進行運算:
<c:out value="${money+200}"></c:out>
<li>對百分比進行格式化98%爲:
<fmt:parseNumber type="percent">98%</fmt:parseNumber>
【代碼解析】:
(1)首先使用<fmt:formatNumber>將188.8轉換爲字符串¥188.8並在page範圍內存儲一個String類型的變量,變量名爲money。
(2)使用<fmt:parseNumber>將¥188.8轉化爲浮點型的數據188.8並賦值爲變量money,
則變量money轉變爲一個浮點型的值188.8,對188.8進行加運算。
(3)直接對一個百分比數98%進行轉化。
3.<fmt:formatDate>標籤
該標籤主要用來格式化日期和時間。
【語法】:
<fmt: formatDate value=」date」 [type=」time|date|both」]
[pattern=」pattern」]
[dateStyle=」default|short|medium|long|full」]
[timeStyle=」default|short|medium|long|full」]
[timeZone=」timeZone」]
[var=」name」]
[scope=」page|request|session|application」]
/>
<fmt:formatDate>標籤屬性說明:
屬性名 |
說明 |
EL |
類型 |
必須 |
默認值 |
value |
將要格式化的日期對象。 |
是 |
Java.util.Date |
是 |
無 |
type |
顯示的部分(日期、時間或者二者)。 |
是 |
String |
否 |
date |
partten |
格式化的樣式。 |
是 |
String |
否 |
無 |
dateStyle |
設定日期的顯示方式。 |
是 |
String |
否 |
default |
timeStyle |
設定時間的顯示方式。 |
是 |
String |
否 |
default |
timeZone |
設定使用的時區。 |
是 |
String |
否 |
當地所用時區 |
var |
存儲已格式化的日期或時間。 |
否 |
String |
否 |
無 |
scope |
指定var存儲的JSP範圍。 |
否 |
String |
否 |
無 |
type屬性參數說明:
參數名 |
說明 |
time |
只顯示時間 |
date |
只顯示時期 |
both |
顯示日期和時間 |
【示例程序】:實現了對日期的格式化,使用了type、dateStyle、timeStyle等屬性。
<fmt:formatDate value="${date}"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both" dateStyle="default"
timeStyle="default"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both" dateStyle="short"
timeStyle="short"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both" dateStyle="long"
timeStyle="long"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both" dateStyle="full"
timeStyle="full"></fmt:formatDate><br>
<fmt:formatDate value="${date}" type="both" dateStyle="full"
timeStyle="full"></fmt:formatDate><br>
【代碼解析】:
(1)首先經過配置JavaBean在頁面上實例化java.util.Date對象。實現代碼以下:
<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>
(2)對日期對象進行格式化時${date}是一個日期對象,若是給value設的值爲String時程序會報錯。
(3)設置type爲both時,將顯示日期和時間,同時示例中依次改變dateStyle和timeStyle的值做爲比較。
4.<fmt:parseDate>標籤
<fmt:parseDate>標籤主要將字符串類型的時間或日期轉化爲時間或日期對象。
【語法1】:
<fmt:parseDate value=」date」 [type=」time|date|both」]
[pattern=」pattern」]
[parseLocale=」locale」]
[dateStyle=」default|short|medium|long|full」]
[timeStyle=」default|short|medium|long|full」]
[timeZone=」timezone」]
[var=」name」]
[scope=」page|request|session|application」]
/>
【語法2】:
<fmt:parseDate [type=」time|date|both」]
[pattern=」pattern」]
[parseLocale=」locale」]
[dateStyle=」default|short|medium|long|full」]
[timeStyle=」default|short|medium|long|full」]
[timeZone=」timezone」]
[var=」name」]
[scope=」page|request|session|application」]
>
Date
</fmt:parseDate>
<fmt:parseData>標籤屬性說明:
屬性名 |
說明 |
EL |
類型 |
必須 |
默認值 |
value |
將要格式化的日期時間 |
是 |
String |
是 |
無 |
type |
字符串的類型(日期、時間或所有) |
EL |
String |
是 |
date |
pattern |
字符串使用的時間樣式 |
是 |
String |
是 |
無 |
parseLocale |
取代默認地區設定 |
是 |
String |
是 |
默認地區 |
dateStyle |
字符串使用的日期顯示方式 |
是 |
String |
否 |
default |
timeStyle |
字符串使用的時間顯示格式 |
是 |
String |
否 |
default |
timeZone |
使用的時區 |
是 |
String |
否 |
當地區時 |
var |
使用var定義的名字保存對象 |
否 |
String |
否 |
無 |
scope |
var的JSP範圍 |
否 |
String |
否 |
page |
【示例代碼】:實現瞭如下功能:首先,使用了<fmt:formatDate>把一個日期對象格式化成一個日期的字符串,並把該字符串以參數名爲a存儲page範圍內。其次,使用<fmt:parseDate>方法把a的值(字符串)格式化成一個Date並以參數名爲b存儲在page範圍內。最後,使用Java腳本證實生成的b爲對象。
<fmt:formatDate value="${date}" var="a" type="both"
dateStyle="full" timeStyle="full"></fmt:formatDate>
<fmt:parseDate var="b" type="both" dateStyle="full" timeStyle="full">
${a}
</fmt:parseDate>
<%
out.println(pageContext.getAttribute("b").toString());
out.println("<br>");
out.println(pageContext.getAttribute("b").hashCode());
%>
</body>
</html>
【代碼解析】:
(1)使用<fmt:formatDate>把日期對象格式化成字符串。
(2)使用<fmt:parseDate>把字符串對象轉化爲日期對象,注意同(1)中的參數對比,能夠發現二者是一個互逆的過程。
(3)使用Java腳本進行測試Date對象的toString()方法能夠輸出時間字符串。hashCode()能夠獲得一個對象的hashCode。該方法只能應用於對象,所以能夠證實獲得的是一個日期對象。
5.<fmt:setTimeZone>標籤
該標籤用於設定默認時區或者將時區存儲在指定的JSP範圍內。
【語法】:
<fmt:setTimeZone value=」value」 [var=」name」][scope=」page|request|session|application」]/>
<fmt:setTimeZone>標籤屬性說明:
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
value |
使用的時區 |
是 |
String Java.util.TimeZone |
是 |
無 |
var |
使用var定義的參數名保存值 |
否 |
String |
否 |
無 |
scope |
存儲var的JSP範圍 |
否 |
String |
否 |
page |
value用來設定使用的時區,例如中國使用的時區爲CST,其餘的還有EST、PST等。能夠把時區存儲在指定的JSP範圍內,例如存儲在session中,用戶訪問的全部頁面均可以顯示使用的設定的時區下對應的時間。
【示例代碼】
<fmt:setTimeZone value=」EST」 scope=」session」/>
提示:有關TimeZone的說明見JDK幫助文檔的java.util.TimeZone類。
6.<fmt:timeZone>標籤
該標籤主要用於設置標籤體內使用的時區。
【語法】:
<fmt:timeZone value=」timeZone」>
…..
</fmt:timeZone>
使用<fmt:timeZone></fmt:timeZone>只會應用到標籤體內使用的時區,對標籤外部將不產生影響。
9.3.2 讀取消息資源
讀取消息資源用到的標籤主要有4個:<fmt:message>標籤、<fmt:param>標籤、<fmt:bundle>標籤和<fmt:setBundle>標籤。主要用於從資源文件中讀取信息。
1.<fmt:bundle>標籤
該標籤主要用於將資源文件綁定於它的標籤體中的顯示。
【語法】:
<fmt:bundle basename=」name」[prefix=」prefix」]>
….標籤主題
</fmt:bundle>
<fmt:bundle>標籤屬性說明:
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
basename |
指定使用的資源文件的名稱 |
是 |
String |
是 |
無 |
prefix |
前置關鍵字 |
是 |
String |
否 |
無 |
2.<fmt:setBundle>標籤
該標籤主要用於綁定資源文件或者把資源文件保存在指定的JSP範圍內。
【語法】:
<fmt:setBundle basename=」name」 [var=」name」]
[scope=」page|request|session|application」]
>
<fmt:setBundle>標籤屬性說明:
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
basename |
指定使用的資源文件的名稱 |
是 |
String |
是 |
無 |
var |
指定將資源文件保存的名稱 |
否 |
String |
否 |
無 |
scope |
設定將資源文件保存的JSP範圍 |
否 |
String |
否 |
page |
3.<fmt:message>標籤
該標籤主要負責讀取本地資源文件,從指定的消息文本資源文件中讀取鍵值,而且能夠將鍵值保存在指定的JSP範圍內。
【語法1】:
<fmt:message key=」keyName」[bundle=」bundle」]
[scope=」page|request|session|application」]
/>
【語法2】:
<fmt:message key=」keyName」[bundle=」bundle」]
[scope=」page|request|session|application」]
>
<fmt:param/>
</fmt:message>
【語法3】:
<fmt:message key=」keyName」[bundle=」bundle」]
[scope=」page|request|session|application」]
>
key<fmt:param/>
…
</fmt:message>
<fmt:message>標籤屬性說明:
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
key |
指定鍵值的名稱(索引) |
是 |
String |
是 |
無 |
bundle |
指定消息文本的來源 |
是 |
LocalizationContext |
否 |
無 |
var |
指定存儲鍵值的變量名 |
否 |
String |
否 |
無 |
scope |
指定var的做用域 |
否 |
String |
否 |
page |
提示:建議此處的bundle使用EL表達式,由於屬性bundle的類型爲LocalizationContext,而不是一個String類型的URL。
【示例代碼】:實現從指定的資源文件中讀取對應key的值。
首先編寫一個資源文件內容下
name=olive
password=01234
使用標籤從資源文件中讀取相應的值。
<fmt:bundle basename="message">
<c:out value="從message資源文件中獲得的key爲name的值爲:"></c:out>
<fmt:message key="name" ></fmt:message>
</fmt:bundle>
<hr>
<fmt:setBundle basename="message" var="m"/>
<fmt:message key="password" bundle="${m}"></fmt:message>
${m}
【代碼解析】:
(1)使用<fmt:bundle>標籤指定從message.properties文件中讀取值。
(2)使用<fmt:message>標籤讀取資源文件中key爲name的值。<fmt:message>標籤放在<fmt:bundle>標籤體內使用。
(3)使用<fmt:setBundle>標籤在page範圍綁定一個配置文件,以m爲參數名存儲。
(4)使用<fmt:message>標籤獲得key爲password的值,此處指定資源文件的方式爲使用<fmt:message>標籤的bundle屬性來設定。
(5)輸出參數m的值,加深對bundle的理解。
<fmt:bundle>標籤中有一個prefix屬性,該標籤用來指明前綴。例如配置文件內容以下:
org.person.name=olive
org.personpassword=01234
若是不使用prefix標籤,在取值是要指明前綴。例如:
<fmt:bundle basename=」message」>
<fmt:message key=」org.person.name」></fmt:message>
<fmt:message key=」org.person.password」></fmt:message>
</fmt:bundle>
使用prefix屬性能夠簡化取值時的代碼。
<fmt:bundle basename=」message」 prefix=」org.person」>
<fmt:message key=」name」></fmt:message>
<fmt:message key=」password」></fmt:message>
</fmt:bundle>
4.<fmt:param>標籤
該標籤主要用於當<fmt:message>中資源文件中得到鍵值時,動態的爲資源文件中的變量賦值。
【語法1】:
<fmt:param value=」value」/>
【語法2】:
<fmt:param >
…標籤主體
</fmt:param>
【示例代碼】:
(1)建立資源文件。在message.properties文件中增長一個key和value。
news={0} welcome to out website!<br>today is :{1,date}
表達的含義是鍵news對應的是一個字符串,字符串中還有動態變量{0}表示第一個動態變量,{1,date}表示第二個動態變量而且該變量是一個日期類型的對象。
(2)經過標籤從資源文件中取出鍵值,並給動態變量賦值顯示在頁面。
<fmt:bundle basename="message">
<fmt:message key="news">
<fmt:param value="olive" />
<fmt:param value="${date}"/>
</fmt:message>
</fmt:bundle>
【代碼解析】:
(1)使用<fmt:bundle>標籤把資源文件綁定在標籤體內。
(2)在<fmt:bundle>標籤體內使用<fmt:message>獲得鍵值。
(3)使用<fmt:param>爲資源文件中的動態變量賦值。
9.3.3 國際化
國際化這個分類中共包含兩個標籤:用於設定語言地區<fmt:setLocale/>和用於設定請求的字符編碼的<fmt:requestEncoding>標籤。
1.<fmt:setLocale/>標籤
<fmt:setLocale>標籤用來設定用戶語言區域。
【語法】:
<fmt:setLocale value=」locale」[variant=」variant」]
[scope=」page|request|session|application」]>
<fmt:setLocale>標籤屬性說明:
參數名 |
說明 |
EL |
類型 |
必須 |
默認值 |
value |
指定區域代碼 |
是 |
String java.util.Locale |
是 |
無 |
variant |
操做系統的類型 |
是 |
String |
是 |
無 |
scope |
設定時區的做用範圍 |
否 |
String |
是 |
page |
value屬性用來指定使用的語言代碼,能夠從瀏覽器的【工具】---【Internet選項】---【語言】---【添加】中查看瀏覽器支持的語言種類及語言代碼。例如:中文(zh_cn)、臺灣(zh_tw)、香港(zh_mo)等。
【示例代碼】:實現了設定不一樣的區域代碼,根據不一樣的區域代碼瀏覽將顯示不一樣格式的日期。
<fmt:setLocale value="en_us" />
<fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full"/>
<hr>
<fmt:setLocale value="zh_cn" />
<fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full"/>
<hr>
<fmt:setLocale value="zh_TW"/>
<fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full"/>
【代碼解析】:
(1)瀏覽器默認跟您使用的操做系統的語言相同,所以默認值zh_cn。使用<fmt:setLocale/>標籤設置使用的語言爲en_us(英語)。使用<fmt:formateDate>格式化輸出的時間字符串,該標籤會根據不一樣的語言輸出不一樣的日期格式。
(2)使用的語言修改成zh_cn,再次用格式化輸出。
(3)使用語言修改成zh_TW,輸出格式化後的時間。
2.<fmt:requestEncoding>標籤
該標籤用於設定請求的編碼格式。功能同servletRequest.setCharacterEncoding()方法相同。
【語法】:
<fmt:requestEncoding [value=」charEncoding」]/>
【參數說明】:
value屬性用來指定使用的編碼集例如:gbk、gb2312等。當沒有給出value的值時將會自動搜索取尋找合適的編碼方式,所以可以很好的解決中文亂碼問題。