在本系列的前幾篇文章中,我們討論了 JSTL 及其表達式語言(EL)。我們還研究了由 core 庫定義的定制標記。具體而言,在“JSTL 入門:表達式語言”中我們指出 EL 提供了一種簡化語言,用于在 JSP 應用程序中訪問和操作數據并使該數據可被 JSTL 定制標記用作動態屬性值。core 庫包含了一些定制標記,用于治理限定了作用域的變量、顯示 EL 值、實現迭代內容和條件內容以及與 URL 進行交互,這是“JSTL 入門:探討 core”的主題。
我們接下來將討論的 JSTL 庫是 fmt 庫。fmt 庫中的定制標記支持通過資源束對文本內容進行本地化,并支持對數字和日期的顯示和解析。這些標記利用在 java.util 和 java.text 包中實現的 Java 語言的國際化 API,因此假如您已經很熟悉諸如 ResourceBundle、Locale、MessageFormat 和 DateFormat 這樣的類,那么您將發現 fmt 庫中有很多方面值得稱道。假如您不熟悉這些類,那么 fmt 庫的標記用直觀的方式來封裝國際化 API,這種方式使您能夠很輕易將本地化功能合并到 JSP 應用程序中。
本地化
在 Java 語言國際化 API 中,影響數據本地化方式的因素主要有兩個。一個是用戶的語言環境,另一個是用戶的時區。語言環境表示某一特定區域或文化的語言習慣,包括日期、數字和貨幣金額的格式。一個語言環境始終會有一種相關聯的語言,在許多情況下這種語言是由多個語言環境共享的某種語言的方言。例如,美國英語、英國英語、澳大利亞英語和加拿大英語都具有不同的英語語言環境,而法國、比利時、瑞士和加拿大所用的法語方言則都具有不同的法語語言環境。
時區是數據本地化中的第二個因素,這僅僅是因為一些語言環境分布的地理區域很廣。當您顯示有關跨洲語言環境(比如澳大利亞英語)的時間信息時,針對用戶時區定制數據與對其進行正確格式化一樣重要。
但是這就有了一個問題:應用程序如何確定用戶的語言環境和時區?在 Java 應用程序的情況下,JVM 能夠通過與本地操作系統進行交互來設置缺省語言環境和時區。雖然這種方法對于桌面應用程序而言可以正常工作,但是它實際上并不適合于服務器端的 Java 應用程序,因為這種應用程序所處理的請求,可能來自于距離該應用程序所駐留的服務器萬里之遙的地方。
幸運的是,HTTP 協議通過 Accept-Language 請求頭將本地化信息從瀏覽器傳遞至服務器。許多 Web 瀏覽器答應用戶定制他們的語言首選項,如圖 1 所示。通常,那些沒有為一種或多種首選語言環境提供顯式設置的瀏覽器會詢問操作系統以確定在 Accept-Language 頭中發送哪個值(或哪些值)。servlet 規范通過 javax.servlet.ServletRequest 類的 getLocale() 和 getLocales() 方法自動地利用 HTTP 協議的這一功能。JSTL fmt 庫中的定制標記又會利用這些方法來自動地確定用戶的語言環境,從而相應地調整它們的輸出。
但遺憾的是,不存在將用戶的時區從瀏覽器傳輸到服務器的標準 HTTP 請求頭。因此,那些希望自己的 Web 應用程序對時間數據進行本地化的用戶,將需要實現他們自己的機制,用來確定和跟蹤特定于用戶的時區。例如,在本系列文章第 2 部分“JSTL 入門:探討 core”中所介紹的 Weblog 應用程序包含了一種將用戶的時區首選項存儲在 cookie 中的方式。
fmt 庫
JSTL fmt 庫中的定制標記主要分成四組。第一組答應您設置本地化上下文,其它標記將在其中進行操作。換句話說,這組標記答應頁面作者顯式地設置其它 fmt 標記在格式化數據時將要使用的語言環境和時區。第二組和第三組標記分別支持對日期和數字進行格式化和解析。最后一組標記側重于對文本消息進行本地化。
既然我們已經有了些基本了解,那就讓我們集中精力逐個研究這四組標記,并演示其用法。
本地化上下文標記
正如我們已經討論過的那樣,JSTL 標記在格式化數據時所使用的語言環境往往是通過查看用戶瀏覽器發送的每個 HTTP 請求所包含的 Accept-Language 頭來確定的。假如沒有提供這樣的頭,那么 JSTL 提供一組 JSP 配置變量,您可以設置這些變量以指定缺省的語言環境。假如尚未設置這些配置變量,那么就使用 JVM 的缺省語言環境,該缺省語言環境是從 JSP 容器所運行的操作系統中獲取的。
新聞熱點
疑難解答