[JSTL] fmt 標籤介紹

上一篇看了jstl裡面的基本標籤core,這一篇我們來看jstl另外一個標籤就是fmt全稱為format。

前言

上一篇看了jstl裡面的基本標籤core,這一篇我們來看jstl另外一個標籤就是fmt全稱為format。

fmt 的概觀

fmt的全稱是format而因為通常來說我們都是用fmt當做他的prefix,因此稱之為fmt。

fmt的uri是:http://java.sun.com/jsp/jstl/fmt。

在fmt裡面的標籤大多屬於設定格式有關。接下來我們會介紹fmt幾個用法。

fmt:requestEncoding

這個只有一個value attribute用來設定這個request所使用的encoding。這個方法和request.setCharacterEncoding()是一樣的。

日期格式輸出

通常不同地區所輸出時間的排列方式都不一樣,因此有兩個fmt標籤是來做這個的。

fmt:formatDate

這個是接受一個java.util.Date格式的variable,然後轉成你想顯示的格式字串出來。和java裡面DateFormate的formate()類似。

這個標籤有以下幾個attribute:

  1. value - 要格式化的日期參數
  2. type - 指定value屬於datetime還是both
  3. pattern - 日期格式。如果設定pattern那麼type就失效了。如果沒有設定pattern就用預設Locale裡面格式。pattern1所接受的格式和 java.text.DateFormat一樣。
  4. dateStyle - 日期的格式。有shortmediumlongfull
  5. timeStyle - 時間格式。和dateStyle一樣有4個可以選
  6. timeZone - 時間所在的區域。
  7. var - 格式化的內容輸出到var參數里面
  8. scope - var所處的位置

範例:

<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>

<fmt:formatDate value="${date}" pattern="yyyy-MM-dd"/>

上面的例子是取得了今天日期,然後以 年-月-日 方式輸出。

fmt:parseDate

和fmt:formatDate擁有一樣的Attribute,他們差異在於formateDate是把一個Date object轉成指定格式變成string。而fmt.parseDate是用string轉成Date。

和DateFormate的parse()一樣。

fmt:parseDate有多一個Attribute叫做parseLocale,作用是指定string要用那個國家的格式做parsing。

範例:

<fmt:parseDate var="parseDate" value="2013-10-14 10:00:00" pattern="yyyy-MM-dd HH:mm:ss" parseLocale="Asia/Taipei" />

<fmt:formatDate value="${parseDate}" timeZone="Asia/Tokyo" dateStyle="full" timeStyle="full" type="both"/>

上面是用台北地區把string轉成date,然後在把date的時區轉成日本時區,因此輸出會是2013-10-14 11:00:00.

處理和數字有關的格式

在不同地區顯示數字方式也會不一樣。同時,如果有需要輸出貨幣,不同貨幣的符號也不一樣,這篇我們會介紹如何做到這些效果。

fmt:formatNumber

基本上這個和javatext.NumberFormat的format()方法一樣作用,它有以下幾個Attribute:

  1. value - 要格式化的數字
  2. type - value類型,有numbercurrencypercent
  3. pattern - 數字格式。同javax.text.NumberFormat
  4. currencyCode - ISO 4217貨幣代碼。例如USD是美元
  5. currencySymbol - 要輸出的貨幣符號
  6. groupingUsed - 值為boolean。看似否要增加","在第1000的單位。
  7. maxIntergerDigits - 整數的最大值。超過截掉。
  8. minIntergerDigits - 整數最小值,不夠補零。
  9. maxFractionDigits - 小數點最大值,超過四捨五入
  10. minFractionDigits - 小數點最小值,不夠補〇
  11. var - 輸出到的參數名稱
  12. scope - var的範圍

fmt:parseNumber

和fmt:formatNumber一樣,差別是從string轉成number。Attribute和fmt:formatNumber一樣,不過沒有currency和xxxIntergerDigits。

fmt:setLocale

上面提到的數字和日期的格式,如果直接輸出來用的格式是預設的Locale。所以如果需要一次全部改成特定國家的格式,我們可以使用setLocale來達到。

因此輸出內容的時候最好透過jstl的fmt對應而不是直接用EL。因為EL不會收到setLocale的影響。

下面的範例能夠輸出不同Locale對於日期的格式:

<%	
	request.setAttribute("locales", Locale.getAvailableLocales());
%>

<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>

<table>
<tr>
<th>Locale</th>
<th>Language</th>
<th>Date</th>
</tr>
<c:forEach var="locale" items="${locales }">
<fmt:setLocale value="${locale }"/>
<tr>
<td>${locale.displayName }</td>
<td>${locale.displayLanguage }</td>
<td><fmt:formatDate type="both" value="${date }" /> </td>
</tr>
</c:forEach>
</table>

有scope和variant Attribute。scope表示這個setLocale要影響多深。例如session就會影響這個使用者在這段時間的情況。variant則顯示目前環境。

通常我們可以透過request.getLocale()來取得使用者使用的locale,然後在呼叫setLocale。預設使用Server的locale來設定。

設置時區

剛剛setLocale的方式只會影響輸出的時間格式,但是不會影響值。

我們知道不同國家時區不同,因此可以設置不同時區來取得不同國家的時間顯示。

fmt:timeZone

這個標籤有個value attribute可以選擇要使用的timeZone。可以是地區,例如"Asia/Taipei"或者是以"GMT-/+{數字}"的方式。例如GMT-8

範例:

<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>

<fmt:timeZone value="Asia/Tokyo">
	<fmt:formatDate value="${date }" type="both"/>
</fmt:timeZone>

上面把目前時間用日本時區顯示(和台灣相比多加1個小時)。

fmt:setTimeZone

和fmt:timeZone一樣的attribute,差別是fmt:timeZone只會影響在他下面的子jstl標籤。而fmt:setTimeZone會依照scope attribute的定義來決定影響範圍。

結語

其實fmt裡面還有一個很重要的部份,就是在做多語系用的。不過由於篇幅的關係,和因為還沒有接觸到多語系,因此沒有包含。

fmt其實屬於兩個部份,一個是做多語系,一個是用來format數字、日期的格式。

希望大家對於如何用fmt來做多國語系有更加的瞭解。

Dotblogs 的標籤: ,

Google+

創用 CC 授權條款
Alan Tsai 的隨手筆記Alan Tsai製作,以創用CC 姓名標示 4.0 國際 授權條款釋出。