上一篇看了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:
- value - 要格式化的日期參數
-
type - 指定value屬於
date
、time
還是both
。 -
pattern - 日期格式。如果設定pattern那麼
type
就失效了。如果沒有設定pattern就用預設Locale裡面格式。pattern1所接受的格式和 java.text.DateFormat一樣。 -
dateStyle - 日期的格式。有
short
、medium
、long
和full
。 - timeStyle - 時間格式。和dateStyle一樣有4個可以選
- timeZone - 時間所在的區域。
- var - 格式化的內容輸出到var參數里面
- 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:
- value - 要格式化的數字
-
type - value類型,有
number
、currency
和percent
- pattern - 數字格式。同javax.text.NumberFormat
- currencyCode - ISO 4217貨幣代碼。例如USD是美元
- currencySymbol - 要輸出的貨幣符號
- groupingUsed - 值為boolean。看似否要增加","在第1000的單位。
- maxIntergerDigits - 整數的最大值。超過截掉。
- minIntergerDigits - 整數最小值,不夠補零。
- maxFractionDigits - 小數點最大值,超過四捨五入
- minFractionDigits - 小數點最小值,不夠補〇
- var - 輸出到的參數名稱
- 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來做多國語系有更加的瞭解。