当前页面: 开发资料首页 → JSP 专题 → 创建国际化的 JSP 应用程序
摘要: 创建国际化的 JSP 应用程序
注意,清单 1 中使用了来自 JSP 标准标签库(JSTL)的
标签来创建链接 URL。这可以确保会话管理得到恰当的处理。(请参阅参考资料,以了解关于 JSTL 和
标签的更多信息。)
每组 login.jsp 和 confirm.jsp 都用特定于地区的语言编写代码。清单 2 显示了 ja_JP 地区的 login.jsp(与 图 4 对应):
清单 2. ja_JP 地区的登录页面(login.jsp)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<head>
developerWorks 電子メール
</head>
<body>
<form action="${actionURL}" method="post">
<table>
<tr>
<td colspan=2 bgcolor="black">
developerWorks 電子メール
</td>
</tr>
<tr>
<td>ユーザ ID</td>
<td><input type="text" name="userid" size="40"/></td>
</tr>
<tr>
<td>パスワード</td>
<td><input type="password" name="pass" size="40"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="ログイン"/></td>
</tr>
</table>
</form>
</body>
</td></tr></table>与此类似,对于 zh_CN 地区,confirm.jsp(与 图 6 对应)是用中文编码的,如清单 3 所示:
清单 3. zh_CN 地区的数据确认页面(confirm.jsp)
<head>
developerWorks 电邮
</head>
<body>
<table border="1">
<tr>
<td colspan=2 bgcolor="black">
developerWorks 电邮
</td>
</tr>
<tr>
<td>用户帐号</td>
<td>${param.userid}</td>
</tr>
<tr>
<td>密码</td>
<td>${param.pass}</td>
</tr>
</table>
</body>
</td></tr></table>前面介绍的多冗余集(multiple-redundant-set)方法对于以下这类应用程序是一种可行的解决方案:
使用 J2SE 资源绑定
前面一节 Using multiple redundant sets of language-specific JSPs 中的解决方案的最大不足在于:当需要更新特定于语言的 JSP 集时,所有冗余编码的 JSP 集都必须同时更新。对于一个中等规模的项目而言,这会造成冗长的、容易出错的更新。
而现在要介绍的解决方案的外观和作用都与前一个类似,但是在这个案例中,只有一套 login.jsp 和 confirm.jsp。这个解决方案利用了 J2SE 在资源绑定中对地区的支持,只在需要的时候才采用特定于地区的文本字符串(请参阅参考资料,以了解更多关于 J2SE 资源绑定的信息)。这个解决方案的示例代码位于 webapps\dwi18n\javares 目录中。如果部署了示例代码,那么请使用 http://
图 7 显示了运行在同一台客户端机器上的 4 个浏览器会话,每个会话请求的都是不同的地区。
图 7. 同一台机器上的 4 个不同地区
在图 7 中,可以清楚地看到国际化的 JSP 应用程序可以同时处理多个地区。
编写 JSP 代码
在这个案例中,index.jsp 略有不同,因为它现在链接到单独的 login.jsp。清单 4 显示了这个版本的 index.jsp 的代码:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<head>
Select Language
</head>
<body>
<table>
<tr>
<td colspan=4 bgcolor="black">
developerWorks Email
</td>
</tr>
<tr><td>
</td>
<td>
</td>
<td>
</td>
<td>
</td>
</tr>
</table>
</body>
</td></tr></table>注意,在清单 4 中,使用 JSTL 的
标签设置了一个叫做 locale
的 URL 请求参数。当用户单击语言选择时,这个参数被传递给 login.jsp。清单 5 显示了 login.jsp 的代码:
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<head>
developerWorks
</head>
<body>
<form action="${formActionURL}" method="post">
<table>
<tr>
<td colspan=2 bgcolor="black">
developerWorks
</td>
</tr>
<tr>
<td> </td>
<td>
<input type="hidden" name="locale" value="${loc}"/>
<input type="text" name="userid" size="40"/></td>
</tr>
<tr>
<td> </td>
<td><input type="text" name="pass" size="40"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value=" </td>
</tr>
</table>
</form>
</body>
</td></tr></table>清单 5 使用了 JSTL 国际化辅助标签库(请参阅 参考资料)。如果传入的 param.locale
为空,那么在默认情况下,地区设置为 en_US。在使用资源绑定的时候,可以用
标签设置地区。
完成地区设置之后,
就会从处于绑定状态的属性文件中提取文本,该文本对应于指定的关键字。用
JSTL 标签把绑定的基本名称设为 app
。如果查看 dwi18n/WEB-INF/classes 目录,可以看到资源绑定中的所有文件都在那里。表 1 描述了这些文件。请参阅参考资料,以获得使用 J2SE 资源绑定的更多信息。
表 1. 资源绑定中的文件
<table cellspacing="1" cellpadding="3" width="60%" border="0">
作为示例,清单 6 显示了app_ko.properties
文件的内容:
email=\uc774\uba54\uc77c
userid=\uc544\uc774\ub514
password=\ube44\ubc00\ubc88\ud638
login=\ub85c\uadf8\uc778
</td></tr></table>注意,在清单 6 中,所有的 Unicode 字符均被转义。必须这么做,因为 Java 的资源绑定机制只接受用 ASCII 编码的属性文件。要创建这个文件,既可以使用 IDE 中的字符串资源编辑器,也可以使用 Unicode 编辑器创建一个 Unicode 文件,然后用 JDK 的 nativetoascii
工具转换它。在该例中,convascii.bat
文件负责进行转换。
结束语
在设置国际化 JSP 应用程序时,需要了解它的独特需求。应用程序必须做好准备,支持具有不同地区需求的用户的多个并发访问。本文介绍了用特定于地区的语言文本显示国际化应用程序这个问题的两个解决方案。但我也仅仅是触及到创建国际化服务器端应用程序的迷人艺术的表面。其他重要的问题包括处理不同的日期和货币格式、管理 GUI 布局和使用专门的输入法编辑器(IME,输入外国字符的实用软件)。请参阅参考资料,以获得有助于进一步了解国际化的信息。
参考资料
java.util.ResourceBundle
类的 Javadoc,发现更多关于 J2SE 资源绑定、如何创建它们和在哪儿放置它们的消息。也可以阅读 javadoc 的在线文章 here。