jsp 标准标记库(JSP Standard Tag Library,JSTL)fmt 库通过一组颇受关注的定制标记提供了用于访问所有 java 编程语言国际化功能的便利方式。Mark Kolb 研究了用于对数据进行格式化和国际化的 fmt 标记。 在本系列的前几篇文章中,我们讨论了 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 库中的定制标记又会利用这些方法来自动地确定用户的语言环境,从而相应地调整它们的输出。 图 1. 通过设置浏览器的语言首选项来选择语言环境
![](/images/load.gif)