要使用 JSTL 的 i18n 相容格式標籤庫,必須在 JSP 網頁上使用 taglib
指示元素定義前置名稱與 uri
參考,慣例上使用 i18n 相容格式標籤庫時,會使用 fmt
作為前置名稱,JSTL 1.1 格式標籤庫的 uri
參考則為 http://java.sun.com/jsp/jstl/fmt
。例如:
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
首先來看到最基本的 <fmt:bundle>
、<fmt:message>
如何使用,假設準備了一個messages1.properties檔案如下:
cc.openhome.title=Welcome
cc.openhome.forGuest=Hello! Guest!
這個 .properties 檔案必須放在 Web 應用程式的 /WEB-INF/classes 中,接著如下建立 JSP 檔案:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<fmt:bundle basename="messages1">
<html>
<head>
<meta charset="UTF-8">
<title><fmt:message key="cc.openhome.title" /></title>
</head>
<body>
<h1><fmt:message key="cc.openhome.forGuest" /></h1>
</body>
</html>
</fmt:bundle>
首先,使用 taglib
指示元素定義前置名稱與 uri
,然後使用 <fmt:bundle>
指定 basename
屬性為 "messages1"
,這表示預設的訊息檔案為 messages1.properties,使用 <fmt:message>
的 key
屬性則指定訊息檔案中的哪條訊息。下圖為執行時的一個參考畫面:
如果將 <fmt:bundle>
的 basename
改設定為 "messages2"
,並且另外準備一個messages2.properties:
cc.openhome.title=Aloha
cc.openhome.forGuest=Hi! New Guest!
那麼顯示出來的畫面中,訊息內容就是來自 messages2.properties,如下圖所示:
也可以使用 <fmt:setBundle>
標籤設置 basename
屬性,設置的效力預設是整個頁面都有作用,如果額外有 <fmt:bundle>
設置,則會以 <fmt:bundle>
的設置為主,例如:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<fmt:setBundle basename="messages1"/>
<html>
<head>
<meta charset="UTF-8">
<title><fmt:message key="cc.openhome.title" /></title>
</head>
<body>
<h1><fmt:message key="cc.openhome.forGuest" /></h1>
<fmt:bundle basename="messages2">
<h1><fmt:message key="cc.openhome.forGuest" /></h1>
</fmt:bundle>
</body>
</html>
這個 JSP 一開始使用 <fmt:setBundle>
設置 basename
為 "messages1"
,所以第一個 <fmt:message>
取得的訊息就是來自 messages1.properties,另一個被 <fmt:bundle>
包括的 <fmt:message>
,取得的訊息就是來自 messages2.properties。
如果訊息中有些部份必須動態決定,可以使用佔位字符先代替,例如:
cc.openhome.title=Hello
cc.openhome.forUser=Hi! {0}! It is {1, date, long} and {2, time ,full}.
在上面的訊息檔案中,粗體字部份就是佔位字符,號碼從0開始,分別代表第幾個佔位字符,在指定時可以指定型態與格式,使用的格式是由 java.text.MessageFormat
定義,可參考 java.text.MessageFormat` 的 API 文件說明。
如果想設置佔位字符的真正內容,則是使用 <fmt:param>
標籤,例如:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<jsp:useBean id="now" class="java.util.Date"/>
<!DOCTYPE html>
<fmt:setBundle basename="messages3"/>
<html>
<head>
<meta charset="UTF-8">
<title><fmt:message key="cc.openhome.title" /></title>
</head>
<body>
<fmt:message key="cc.openhome.forUser">
<fmt:param value="${param.username}"/>
<fmt:param value="${now}"/>
<fmt:param value="${now}"/>
</fmt:message>
</body>
</html>
在這個 JSP 中,使用 <jsp:useBean>
建立 Date
物件以取得目前系統時間,並設置為屬性,訊息檔案的基礎名稱設定為 "messages3"
,而訊息檔案中每個佔位字元,則使用 <fmt:param>
逐一設置,執行的結果畫面如下所示: