用标记库国际化JSP(2)
类别: JSP教程
本文对JSP国际化的简要介绍,着重探讨了使用标记库对JSP进行国际化的过程,并通过详细的示例演示了如何使用jakarta的i18n标记库。
综述
当我们在用JSP设计面对不同国家的站点时,特别是那些在界面之间没有特别大差别的商业站点,我们可以利用JSP的一些机制来支持国际化.
通常有三种方式可以实现国际化.
为每个国家编写一套JSP代码, 可以通过嵌入BEAN和标记处理器的方式重用一些逻辑代码.
维护统一的JSP代码,直接利用JAVA的资源捆绑机制实现国际化.
维护统一的JSP代码,利用通用的或自定义标记库实现国际化.
我们重点讨论第三种方法,因为它有很好的灵活性,可维护性和可扩展性.
其实标记库也是利用JAVA的资源捆绑机制, 只是把国际化常用的方法封装的更容易使用,而且更符合JSP的编程思想, 把表述层和逻辑层分开.通用的标记库比较著名的有JAKARTA的I18N标记库。本文接着上一篇继续讨论i18n标记库的各种标记和使用方法,包括以下内容:
对时间,日期,货币,数字国际化
I18N标记库的一些高级用法
一个简单的例子
对时间,日期,货币,数字国际化
formatString
输出一个字符串,如果value为空则显示defaultText
<i18n:formatString value="<%= s2 %>" defaultText="the String was null"/>
表1:formatString的属性描述
属性名称 描述
id 该formatString的标识变量, 通过它,其他标记和代码可以访问该formatString,
value 输出的字符串
defaultText 默认的输出字符串
formatNumber
根据locale信息国际化数字,它的pattern可以定义为‘##,###.##’。如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatNumber value="<%= n %>" pattern="##,###,###.##"/>
表2:formatNumber的属性描述
属性名称 描述
id 该formatNumber的标识变量, 通过它,其他标记和代码可以访问该formatNumber
value 输出的数字
pattern 输出的模式(##,###.##)
locale locale信息
defaultText 默认的输出数字
formatCurrency
根据locale信息国际化货币。如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatCurrency value="<%= n %>"/>
表3:formatCurrency的属性描述
属性名称 描述
id 该formatCurrency的标识变量, 通过它,其他标记和代码可以访问该formatCurrency
value 输出的货币值
locale locale信息
defaultText 默认的输出货币值
formatPercent
根据locale信息国际化百分数。如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatPercent value="<%= n %>"/>
表4:formatPercent的属性描述
属性名称 描述
id 该formatPercent的标识变量, 通过它,其他标记和代码可以访问该formatPercent
value 输出的百分数
locale locale信息
defaultText 默认的输出百分数
formatDateTime
根据locale信息国际化日期时间。它的dateStyle和timeStyle可以定义为´short/medium/long/full´如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatDateTime dateStyle="medium" timeStyle="medium"/>
表5:formatDateTime的属性描述
属性名称 描述
id 该formatDateTime的标识变量, 通过它,其他标记和代码可以访问该formatDateTime
value 输出的日期时间
locale 指定的locale信息
dateStyle 输出的日期格式
timeStyle 输出的时间格式
defaultText 默认的输出日期和时间
formatDate
根据locale信息国际化日期。它的style可以定义为(short/medium/long/full),pattern可定义为´YYYY MMM ddd´.如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatDate pattern="yyyy MMMMM ddd hh:mm:ss"/>
表6:formatDate的属性描述
属性名称 描述
id 该formatDate的标识变量, 通过它,其他标记和代码可以访问该formatDate
value 输出的日期
locale 指定的locale信息
pattern 日期的模式(YYYY MMM ddd)
Style 日期的格式(short/medium/long/full)
defaultText 默认的输出日期
formatTime
根据locale信息国际化日期。它的style可以定义为(short/medium/long/full).如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatTime style="full"/>
表7:formatTime的属性描述
属性名称 描述
id 该formatTime的标识变量, 通过它,其他标记和代码可以访问该formatTime
value 输出的时间
locale 指定的locale信息
Style 日期的格式(short/medium/long/full)
defaultText 默认的输出日期
I18N标记库的一些高级用法
ifdef
判断一个key是否存在于指定(或默认)的资源文件中,如果存在则进行该标记中的语句.
<i18n:ifdef key="zh_CN_ONLY">
Only users specifying zh_CN as their locale will see this!
</i18n:ifdef>
表8:ifdef的属性描述
属性名称 描述
key 欲判断是否在资源文件中的key的名字
bundle ResourceBundle的基本名,可以连同locale信息定位所需的ResourceBundle.
bundleRef 一个包含ResourceBundle的属性名,通常为bundle的id
ifndef
判断一个key是否存在于指定(或默认)的资源文件中,如果不存在则进行该标记中的语句.
<i18n:ifndef key="zh_CN_ONLY">
Only users specifying something OTHER than zh_CN
as their locale will see this!
</i18n:ifndef>
表9:ifndef的属性描述
属性名称 描述
key 欲判断是否在资源文件中的key的名字
bundle ResourceBundle的基本名,可以连同locale信息定位所需的ResourceBundle.
bundleRef 一个包含ResourceBundle的属性名,通常为bundle的id
一个简单的例子
<%--
this page contains a variety of demonstrations of the <i18n:formatXXX> tags
--%>
<%@ taglib uri="http://jakarta.apache.org/taglibs/i18n-1.0" prefix="i18n" %>
<i18n:bundle baseName="i18n-test" id="bundle"/>
<%@ page import="java.util.Date" %>
<%@ page import="java.util.Locale" %>
<html>
<head>
<title>Examples of using the Formatting tags in the i18n Tag Library Tag</title>
</head>
<body>
<%
Number n = new Double( 1234567.89 );
Date d = new Date();
%>
<h2>default Locale</h2>
<h3>The time is now:-</h3>
<ul>
<li>
<i18n:formatTime style="medium" /> (medium)
</li>
</ul>
<h3>The date is now:-</h3>
<ul>
<li>
<i18n:formatDate pattern="yyyy MMMMM ddd hh:mm:ss"/> (pattern)
</li>
</ul>
<h3>The datetime is now:-</h3>
<ul>
<li>
<i18n:formatDateTime dateStyle="full" timeStyle="full"/> (full, full)
</li>
</ul>
<h3>The number is:-</h3>
<ul>
<li>
<i18n:formatNumber value="<%= n %>"/> (number)
</li>
<li>
<i18n:formatNumber value="<%= n %>" pattern="##,###,###.##"/> (number with pattern)
</li>
<li>
<i18n:formatCurrency value="<%= n %>"/> (currency)
</li>
<li>
<i18n:formatPercent value="<%= n %>"/> (percent)
</li>
</ul>
<h2>US Locale</h2>
<i18n:locale locale="<%= Locale.US %>">
<h3>The time is now:-</h3>
<ul>
<li>
<i18n:formatTime style="medium" /> (medium)
</li>
</ul>
<h3>The date is now:-</h3>
<ul>
<li>
<i18n:formatDate pattern="yyyy MMMMM ddd hh:mm:ss"/> (pattern)
</li>
</ul>
<h3>The datetime is now:-</h3>
<ul>
<li>
<i18n:formatDateTime dateStyle="full" timeStyle="full"/> (full, full)
</li>
</ul>
<h3>The number is:-</h3>
<ul>
<li>
<i18n:formatNumber value="<%= n %>"/> (number)
</li>
<li>
<i18n:formatNumber value="<%= n %>" pattern="##,###,###.##"/> (number with pattern)
</li>
<li>
<i18n:formatCurrency value="<%= n %>"/> (currency)
</li>
<li>
<i18n:formatPercent value="<%= n %>"/> (percent)
</li>
</ul>
</i18n:locale>
<h2> ifdef </h2>
<i18n:ifdef key="zh_CN_ONLY">
<i18n:message key="zh_CN_ONLY" />
</i18n:ifdef>
<h2> ifndef </h2>
<i18n:ifndef key="zh_CN_ONLY">
Only users specifying something OTHER than zh_CN
as their locale will see this!
</i18n:ifndef>
</body>
</html>
i18n-test.properties
OHTER_ONLY = a test
i18n-test_zh_CN.properties
zh_CN_ONLY = 只有locale是zh_CN时才可以看到我!
注意要把资源文件拷贝到/WEB-INF/classes子目录下
综述
当我们在用JSP设计面对不同国家的站点时,特别是那些在界面之间没有特别大差别的商业站点,我们可以利用JSP的一些机制来支持国际化.
通常有三种方式可以实现国际化.
为每个国家编写一套JSP代码, 可以通过嵌入BEAN和标记处理器的方式重用一些逻辑代码.
维护统一的JSP代码,直接利用JAVA的资源捆绑机制实现国际化.
维护统一的JSP代码,利用通用的或自定义标记库实现国际化.
我们重点讨论第三种方法,因为它有很好的灵活性,可维护性和可扩展性.
其实标记库也是利用JAVA的资源捆绑机制, 只是把国际化常用的方法封装的更容易使用,而且更符合JSP的编程思想, 把表述层和逻辑层分开.通用的标记库比较著名的有JAKARTA的I18N标记库。本文接着上一篇继续讨论i18n标记库的各种标记和使用方法,包括以下内容:
对时间,日期,货币,数字国际化
I18N标记库的一些高级用法
一个简单的例子
对时间,日期,货币,数字国际化
formatString
输出一个字符串,如果value为空则显示defaultText
<i18n:formatString value="<%= s2 %>" defaultText="the String was null"/>
表1:formatString的属性描述
属性名称 描述
id 该formatString的标识变量, 通过它,其他标记和代码可以访问该formatString,
value 输出的字符串
defaultText 默认的输出字符串
formatNumber
根据locale信息国际化数字,它的pattern可以定义为‘##,###.##’。如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatNumber value="<%= n %>" pattern="##,###,###.##"/>
表2:formatNumber的属性描述
属性名称 描述
id 该formatNumber的标识变量, 通过它,其他标记和代码可以访问该formatNumber
value 输出的数字
pattern 输出的模式(##,###.##)
locale locale信息
defaultText 默认的输出数字
formatCurrency
根据locale信息国际化货币。如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatCurrency value="<%= n %>"/>
表3:formatCurrency的属性描述
属性名称 描述
id 该formatCurrency的标识变量, 通过它,其他标记和代码可以访问该formatCurrency
value 输出的货币值
locale locale信息
defaultText 默认的输出货币值
formatPercent
根据locale信息国际化百分数。如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatPercent value="<%= n %>"/>
表4:formatPercent的属性描述
属性名称 描述
id 该formatPercent的标识变量, 通过它,其他标记和代码可以访问该formatPercent
value 输出的百分数
locale locale信息
defaultText 默认的输出百分数
formatDateTime
根据locale信息国际化日期时间。它的dateStyle和timeStyle可以定义为´short/medium/long/full´如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatDateTime dateStyle="medium" timeStyle="medium"/>
表5:formatDateTime的属性描述
属性名称 描述
id 该formatDateTime的标识变量, 通过它,其他标记和代码可以访问该formatDateTime
value 输出的日期时间
locale 指定的locale信息
dateStyle 输出的日期格式
timeStyle 输出的时间格式
defaultText 默认的输出日期和时间
formatDate
根据locale信息国际化日期。它的style可以定义为(short/medium/long/full),pattern可定义为´YYYY MMM ddd´.如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatDate pattern="yyyy MMMMM ddd hh:mm:ss"/>
表6:formatDate的属性描述
属性名称 描述
id 该formatDate的标识变量, 通过它,其他标记和代码可以访问该formatDate
value 输出的日期
locale 指定的locale信息
pattern 日期的模式(YYYY MMM ddd)
Style 日期的格式(short/medium/long/full)
defaultText 默认的输出日期
formatTime
根据locale信息国际化日期。它的style可以定义为(short/medium/long/full).如果value为空则显示defaultText,如果不设locale,则取上一级的<i18n:locale>的设定,如果没有<i18n:locale>,则根据客户端请求的locale,如果还是没有发现,则取本地JVM的locale。
<i18n:formatTime style="full"/>
表7:formatTime的属性描述
属性名称 描述
id 该formatTime的标识变量, 通过它,其他标记和代码可以访问该formatTime
value 输出的时间
locale 指定的locale信息
Style 日期的格式(short/medium/long/full)
defaultText 默认的输出日期
I18N标记库的一些高级用法
ifdef
判断一个key是否存在于指定(或默认)的资源文件中,如果存在则进行该标记中的语句.
<i18n:ifdef key="zh_CN_ONLY">
Only users specifying zh_CN as their locale will see this!
</i18n:ifdef>
表8:ifdef的属性描述
属性名称 描述
key 欲判断是否在资源文件中的key的名字
bundle ResourceBundle的基本名,可以连同locale信息定位所需的ResourceBundle.
bundleRef 一个包含ResourceBundle的属性名,通常为bundle的id
ifndef
判断一个key是否存在于指定(或默认)的资源文件中,如果不存在则进行该标记中的语句.
<i18n:ifndef key="zh_CN_ONLY">
Only users specifying something OTHER than zh_CN
as their locale will see this!
</i18n:ifndef>
表9:ifndef的属性描述
属性名称 描述
key 欲判断是否在资源文件中的key的名字
bundle ResourceBundle的基本名,可以连同locale信息定位所需的ResourceBundle.
bundleRef 一个包含ResourceBundle的属性名,通常为bundle的id
一个简单的例子
<%--
this page contains a variety of demonstrations of the <i18n:formatXXX> tags
--%>
<%@ taglib uri="http://jakarta.apache.org/taglibs/i18n-1.0" prefix="i18n" %>
<i18n:bundle baseName="i18n-test" id="bundle"/>
<%@ page import="java.util.Date" %>
<%@ page import="java.util.Locale" %>
<html>
<head>
<title>Examples of using the Formatting tags in the i18n Tag Library Tag</title>
</head>
<body>
<%
Number n = new Double( 1234567.89 );
Date d = new Date();
%>
<h2>default Locale</h2>
<h3>The time is now:-</h3>
<ul>
<li>
<i18n:formatTime style="medium" /> (medium)
</li>
</ul>
<h3>The date is now:-</h3>
<ul>
<li>
<i18n:formatDate pattern="yyyy MMMMM ddd hh:mm:ss"/> (pattern)
</li>
</ul>
<h3>The datetime is now:-</h3>
<ul>
<li>
<i18n:formatDateTime dateStyle="full" timeStyle="full"/> (full, full)
</li>
</ul>
<h3>The number is:-</h3>
<ul>
<li>
<i18n:formatNumber value="<%= n %>"/> (number)
</li>
<li>
<i18n:formatNumber value="<%= n %>" pattern="##,###,###.##"/> (number with pattern)
</li>
<li>
<i18n:formatCurrency value="<%= n %>"/> (currency)
</li>
<li>
<i18n:formatPercent value="<%= n %>"/> (percent)
</li>
</ul>
<h2>US Locale</h2>
<i18n:locale locale="<%= Locale.US %>">
<h3>The time is now:-</h3>
<ul>
<li>
<i18n:formatTime style="medium" /> (medium)
</li>
</ul>
<h3>The date is now:-</h3>
<ul>
<li>
<i18n:formatDate pattern="yyyy MMMMM ddd hh:mm:ss"/> (pattern)
</li>
</ul>
<h3>The datetime is now:-</h3>
<ul>
<li>
<i18n:formatDateTime dateStyle="full" timeStyle="full"/> (full, full)
</li>
</ul>
<h3>The number is:-</h3>
<ul>
<li>
<i18n:formatNumber value="<%= n %>"/> (number)
</li>
<li>
<i18n:formatNumber value="<%= n %>" pattern="##,###,###.##"/> (number with pattern)
</li>
<li>
<i18n:formatCurrency value="<%= n %>"/> (currency)
</li>
<li>
<i18n:formatPercent value="<%= n %>"/> (percent)
</li>
</ul>
</i18n:locale>
<h2> ifdef </h2>
<i18n:ifdef key="zh_CN_ONLY">
<i18n:message key="zh_CN_ONLY" />
</i18n:ifdef>
<h2> ifndef </h2>
<i18n:ifndef key="zh_CN_ONLY">
Only users specifying something OTHER than zh_CN
as their locale will see this!
</i18n:ifndef>
</body>
</html>
i18n-test.properties
OHTER_ONLY = a test
i18n-test_zh_CN.properties
zh_CN_ONLY = 只有locale是zh_CN时才可以看到我!
注意要把资源文件拷贝到/WEB-INF/classes子目录下
- 上一篇: 使用JAVABEAN高效处理JSP
- 下一篇: JSP常见错误
-= 资 源 教 程 =-
文 章 搜 索