使用全球化开发工具包 (GDK) 构建全球化应用程序
本课程使用 Oracle 全球化开发工具包 (GDK) 中的 API,演示如何将现有的英语单语种 J2EE 应用程序移植到全球化多语种应用程序。该应用程序包含一个指向基于 oe 示例模式 (Schema) 的简单客户订单检索应用程序(Oracle 商店)的 JSP 前端,并包含使用 GDK 维护常规 Java 对象的 servlet。
本模块将讨论以下主题:
将光标置于该图标上,以显示所有屏幕截图。您也可以将光标置于每个图标上,只查看与之关联的屏幕截图。
返回主题列表
针对 Java 的全球化开发工具包 (GDK) 提供了 J2EE 应用程序框架和 Java API,使您能够使用 Oracle 设计的最佳全球化应用和功能开发全球化互连网应用程序。GDK 通过将 Oracle 全球化支持功能扩展到应用服务器,对 Java 中的现有全球化功能进行了补充。现在可以在中间层中使用全球化逻辑(如 Oracle 日期/数字/货币格式以及 Oracle 二进制排序与语言排序)。GDK 提供 Oracle 本地化信息与 Java 本地化信息之间的映射、Oracle 字符集与 Java 字符集之间的转换,并返回本地化信息相关的数据集,如常用语言、常用语言排序以及给定地区所支持的本地时区等。它提供可以封装全球化编程的复杂部分(如本地化信息确定以及本地化信息的缓存和处理)的 API。它支持对用户首选本地化信息的检测、重新编写 URL 以为不同的本地化信息定位内容,并提供了单个应用程序配置文件来控制用户应用程序的全球化行为。
注意:本地化信息是指国家语言以及使用该语言的地区。例如,美国和英国的主要语言是英语,但这两个地区具有不同的货币和不同的日期格式惯例。因此,美国和英国被视为是两种不同的本地化信息。
返回主题列表
在开始本模块的学习之前,您应该已经:
返回主题列表
该应用程序包含以下文件:
Java 源文件
src/oracle/i18n/demo/obe/gdkshop
AuthFilter.java
认证过滤器
MyAccountAction.java
我的帐户 servlet
OrderInformationAction.java
订单信息 servlet
ShopAction.java
商店操作
src/oracle/i18n/demo/obe/gdkshop/bean
Customer.java
客户 bean
Order.java
订单 bean
OrderItem.java
订单项 bean
src/oracle/i18n/demo/obe/gdkshop/gdk
DBLocaleSource.java
数据库中用户模式的本地化信息源
Translations.java
英语 UI 翻译(将在本课程中加)
Translations_de.java
德语 UI 翻译(将在本课程中添加)
Translations_es.java
西班牙语 UI 翻译(将在本课程中添加)
Translations _zh_cn.java
简体中文 UI 翻译(将在本课程中添加)
JSP 和静态内容
public_html/
index.jsp
索引 JSP 页面
myaccount.jsp
我的帐户 JSP 页面
orderinformation.jsp
订单信息 JSP 页面
feedback.jsp
反馈 JSP 页面
store_logo_new.gif
英语商店徽标图像
US.gif
美国国旗图像(将在本课程中添加)
CN.gif
中国国旗图像(将在本课程中添加)
DE.gif
德国国旗图像(将在本课程中添加)
ES.gif
西班牙国旗图像(将在本课程中添加)
IN.gif
印度国旗图像(将在本课程中添加)
public_html/de/
store_logo_new.gif
德语 Oracle 商店徽标(将在本课程中添加)
public_html/es/
store_logo_new.gif
西班牙语 Oracle 商店徽标(将在本课程中添加)
public_html/zh_cn/
store_logo_new.gif
简体中文 Oracle 商店徽标(将在本课程中添加)
public_html/WEB-INF/
web.xml
Web 部署描述符
gdkapp.xml
GDK/OGS 应用程序配置文件(将在本课程中添加)
public_html/WEB-INF/lib/
orai18n-lcsd.jar
GDK LCSD(语言和字符集检测)扩展(将在本课程中添加
orai18n.jar
GDK 主库(将在本课程中添加)
返回主题列表
为使 Oracle 商店应用程序正常工作,您需要使用新示例数据填充示例模式。执行以下操作:
1.
将 gdk.zip 解压到工作目录。将 /home/oracle/wkdir 设为工作目录。
2.
创建用于存储货币汇率和时区信息的表。打开终端窗口,执行以下命令:
cd /home/oracle/wkdir/gdk/step0
sqlplus oe/oe
@obeGdkSetup
注意 :obeGdkSetup.sql 是一个脚本文件,用于填充 OE 模式的 CUSTOMERS 、ORDERS 和 ORDER_ITEMS 等表。该目录还包含一个名为 obeGdkRevert.sql 的脚本,用于卸载为本课程创建的所有对象。
返回主题列表
您将把该应用程序作为英语单语种应用程序运行并观察它的行为。然后,您将更改其源文件,把该应用程序改为多语种应用程序。请注意,修改后的文件已经提供,您不必更改源文件。但是,在此课程中将明示对文件的更改。
执行以下操作,运行单语种应用程序:
1.
启动 Oracle9i JDeveloper。
2.
将 Mozilla 设置为 Jdeveloper 中的默认浏览器。 Tools --> Preferences --> Web Browser/Proxy 。在 Browser Command Line 域中输入 /usr/bin/mozilla -remote openURL(${URL}) || /usr/bin/mozilla ${URL} 。
3.
在 System-Navigator 窗口中单击并高亮显示 Workspaces 。单击 Add to Workspaces... 左上角的 + 图标
4.
选择并打开文件 /home/oracle/wkdir/gdk/obe_gdk.jws 。注意: 如果询问您是否要移植这些文件,请单击 Yes
5.
展开该树型结构,确保包含了项目 gdkshop.jpr 。
6.
您将需要验证 JDBC 数据库连接字符串。展开 gdkshop.jpr 的项目树。右键单击 web.xml 并选择 Open 。
7.
它应包含以下信息:
<context-param>
<param-name>gdkdemo.jdbccon</param-name>
<param-value>jdbc:oracle:thin:@localhost:1521:orcl</param-value>
</context-param>
当前设置使用端口 1521 连接到本地计算机上 SID 为 orcl 的数据库。如有必要,将其替换为您的连接字符串 并保存该文件 。
8.
单击并高亮显示项目 gdkshop.jpr 。选择 Menu 选项 Run -> Run gdkshop.jpr 。
注意: 您可能需要打开一个浏览器实例才能查看该应用程序
9.
第一个页面是 Oracle 商店应用程序的登录画面,其中的下拉式列表框显示可用的客户及其所在国家。单击 Submit 按钮,查看帐户配置文件以及选定客户的订单历史记录。
10.
查客户详细信息。注意,日期将显示在浏览器的右上角。单击 Back 。
11.
查看另一位客户 Daniel Zhang 的详细信息。从下拉式列表框中选择 Daniel Zhang 并单击 Submit 。
12.
请注意,Daniel 的地区首选项是中国 (China),但由于该应用程序尚未全球化,因此所有文本均以英文显示;信用额度 (credit limit) 以美元计算;订单的日期时间戳根据数据库时间戳而非客户时区而定。从数据库获得的日期使用 Oracle 的日期惯例格式化,而为应用程序生成的日期基于 Java 的惯例格式化。单击订单链接查看订单的详细信息。
13.
与上一画面相似,包括产品名称和说明在内的所有文本均以英文显示;货币值使用基于美元和美国借方符号的美国货币惯例格式化。订单项基于英文产品名称的二进制值进行排序。单击商店徽标 将返回客户登录页面。
返回主题列表
此时,您将把单语种应用程序移植到全球化多语种 Oracle 商店。您将添加对以下语言的支持:分别服务于中国、西班牙和印度的 Oracle 商店客户的简体中文、西班牙语和英语。
注意: 您不必在现有应用程序中键入所有代码更改,所有更新已经准备好并随演示多语种 Oracle 商店应用程序的压缩文件一起提供。
注意: 某些语言可能在某些浏览器中不受支持。建议在本课程中使用 Internet Explorer 6.0 或更高版本。
执行以下操作:
返回主题列表
每种语言可以有不同的徽标。您现在可以添加商店徽标。执行以下操作:
1.
从终端窗口中,执行以下命令:
cd /home/oracle/wkdir/gdk/gdkshop/public_html
mkdir es
cd es
cp /home/oracle/wkdir/gdk/step2/es/store_logo_new.gif store_logo_new.gif
cd ..
mkdir zh_CN
cd zh_CN
cp /home/oracle/wkdir/gdk/step2/zh_CN/store_logo_new.gif store_logo_new.gif
目录“es”和“zh_cn”存储西班牙语和中文 Oracle 商店徽标。
2.
将 JSP 文件 index.jsp、myaccount.jsp 和 orderinformation.jsp 复制到相应的目录。从终端窗口中,执行以下命令:
cd ..
cp /home/oracle/wkdir/gdk/step2/index.jsp index.jsp
cp /home/oracle/wkdir/gdk/step2/myaccount.jsp myaccount.jsp
cp /home/oracle/wkdir/gdk/step2/orderinformation.jsp orderinformation.jsp
cp /home/oracle/wkdir/gdk/step2/feedback.jsp feedback.jsp
注意: 该文件夹已经包含这三个用于单语种应用程序的文件。用修改后的文件覆盖旧文件。
打开每个文件可以看到,servlet 包和 util 包中的类用如下方式导入:
<%@ page import="oracle.i18n.servlet.*, oracle.i18n.util.*" %>
并将 JSP 文件中的商店登录徽标由 store_logo_new.gif 替换为
<%= ServletHelper.rewriteURL("./store_logo_new.gif", request) %>
3.
现在即可在 JDeveloper 内运行该应用程序。首先,需要确定已经终止 OC4J 服务器。选择 Run -> Terminate -> Embedded OC4J Server
4.
重建项目 gdkshop.jpr 。选择 Project -> Rebuild gdkshop.jpr 。
5.
选择 Run -> Run gdkshop.jpr 。
6.
如果看到如下所示的英文 Oracle 商店徽标,则应设置浏览器的语言首选项。
7.
在本课程中假设您使用 Mozilla 浏览器。选择 Edit --> Preferences 。然后,选择导航器下的 Languages 。单击 Add 按钮。
8.
在 Others 域中输入 es 并按回车键 。
9.
请注意,西班牙语已经添加到了列表中。再次单击 Add 按钮添加 Chinese。
10.
在 Others 域中输入 zh-CN 并按回车键 。
11.
从列表中选择 Spanish 并单击 Move Up 按钮,直到 Spanish 显示在列表顶部。然后单击 OK 。
12.
切换回网页并刷新屏幕。您将看到现在显示西班牙语商店徽标。确保所有 3 个 JSP 页面上均如此显示。
返回主题列表
为了将应用程序翻译到不同语言,应将所有硬编码的文本字符串导出到资源文件,随后即可将这些文件交付翻译。资源包是 Java 本地化应用程序的基本机制。将三个 JSP 文件中的所有 UI 文本导出到 Java 资源包中。执行以下操作:
1.
您需要将这三个翻译文件复制到您的项目目录。从终端窗口中,执行以下命令:
cd /home/oracle/wkdir/gdk/gdkshop/src/oracle/i18n/demo/obe/gdkshop
mkdir gdk
cd gdk
cp /home/oracle/wkdir/gdk/step3/Translations.java Translations.java
cp /home/oracle/wkdir/gdk/step3/Translations_es.java Translations_es.java
cp /home/oracle/wkdir/gdk/step3/Translations_zh_CN.java Translations_zh_CN.java
以下是西班牙语翻译文件 Translations_es.java 的内容:
package oracle.i18n.demo.obe.gdkshop.gdk; import java.util.ListResourceBundle; public class Translations_es extends ListResourceBundle { static final Object[][] contents = { { "RETURNING_CUSTOMERS", "Clientes que vuelven..."}, { "SUBMIT", "Env\u00ede" }, { "MY_ACCOUNT", "Mi cuenta " }, { "ACCOUNT_PROFILE", "Infomaci\u00f3n de cuenta" }, { "FIRST_NAME", "Nombre" }, { "LAST_NAME", "Apellido" }, { "EMAIL", "Correo electr\u00f3nico" }, { "LANGUAGE", "Idioma" }, { "TERRITORY", "Territorio" }, { "REGISTERED_DATE", "Fecha de registraci\u00f3n" }, { "CREDIT_LIMIT", "Limite de credito" }, { "ORDER_TRACKING_AND_HISTORY", "Seguimiento del pedido e historial" }, { "GRAND_TOTAL", "El gran total" }, { "TOTAL", "Total" }, { "DISCOUNT", "Descuento" }, { "PRODUCT_NAME", "Nombre del producto" }, { "PRODUCT_DESCRIPTION", "Descripci\u00f3n del producto" }, { "ITEM_NUMBER", "N\u00famero de parte" }, { "QUANTITY", "Cantidad" }, { "SUB_TOTAL", "Subtotal" }, { "ORDER_INFORMATION", "Informaci\u00f3n de orden" }, { "ORDER_NUMBER", "N\u00famero de orden" }, { "ORDER_DATE", "Fecha de orden" }, { "YOUR_ORDER_PLACED", "Su orden procesada {0}" }, { "FEEDBACK", "Comentarios" }, { "YOUR_MESSAGE", "Su comentario ha sido enviado" } }; public Object[][] getContents() { return contents; } }
2.
您必须注册“Translations”类。从终端窗口中,执行以下命令:
cd /home/oracle/wkdir/gdk/gdkshop/public_html/WEB-INF
cp /home/oracle/wkdir/gdk/step3/gdkapp.xml gdkapp.xml
如果查看文件内容,则可以看到 标记的详细信息。
<message-bundles>
<resource-bundle name="default">oracle.i18n.demo.obe.gdkshop.gdk.Translations
</resource-bundle>
</message-bundles>
3.
处理翻译所必须的代码已经添加到了 JSP 文件中。从终端窗口中,执行以下命令:
cd .. (注意:您的目标目录为 /home/oracle/wkdir/gdk/gdkshop/public_html )
cp /home/oracle/wkdir/gdk/step3/index.jsp index.jsp
cp /home/oracle/wkdir/gdk/step3/myaccount.jsp myaccount.jsp
cp /home/oracle/wkdir/gdk/step3/orderinformation.jsp orderinformation.jsp
cp /home/oracle/wkdir/gdk/step3/feedback.jsp feedback.jsp
如果查看每个文件的内容,则将看到 Localizer 对象已经通过以下代码在每个 JSP 页面的顶部进行了实例化:
<% Localizer localizer = ServletHelper.getLocalizerInstance(request); %>
此外,所有可翻译的文本已经为 localizer.getMessage API 调用所替换。例如,“Returning Customers...”应替换为
<%= localizer.getMessage("RETURNING_CUSTOMERS") %>
4.
处理翻译所必须的代码已经添加到 java 文件中。从终端窗口中,执行以下命令:
cd /home/oracle/wkdir/gdk/gdkshop/src/oracle/i18n/demo/obe/gdkshop
cp /home/oracle/wkdir/gdk/step3/MyAccountAction.java MyAccountAction.java
cp /home/oracle/wkdir/gdk/step3/OrderInformationAction.java
OrderInformationAction.java
如果查看每个文件的内容,则将看到 Localizer 对象已经使用以下代码进行了实例化:
<% Localizer localizer = ServletHelper.getLocalizerInstance (request); %>
此外,所有可翻译的文本已经为 localizer.getMessage API 调用所替换。例如,“Returning Customers...”应替换为
import oracle.i18n.servlet.ServletHelper; import oracle.i18n.servlet.Localizer;
Localizer localizer = ServletHelper.getLocalizerInstance(request);
request.setAttribute("localizer",localizer);
5.
要使应用程序可以识别西班牙语和简体中文翻译文件,应将资源包包含在项目中。在 JDeveloper 中的 System-Navigator 窗口中,单击并高亮显示 gdkshop.jpr 。单击左上角的 + 图标。
6.
选择并打开目录 home/oracle/wkdir/gdk/gdkshop/src 。从“File type”下拉式列表框中选择 Java 源文件 (*.java)。单击 Open 。
7.
单击 OK 。
8.
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器 、重建 gdkshop.jpr 并运行 gdkshop.jpr 。
9.
您将看到该窗口中的域和按钮已经翻译为西班牙语。单击 Envie 按钮。
10.
您将看到各域已被翻译为西班牙语。
返回主题列表
现在,您可以格式化日期和数字以查看它对应用程序的影响。执行以下操作:
返回主题列表
GDK 中提供了 Oracle 支持的所有地区、语言、语言排序、时区、货币和字符集等名称的翻译。可以通过调用相应的类在应用程序内直接使用这些翻译。要使用预定义的 Oracle 本地化信息翻译,请进行以下更改:
1.
针对名称翻译,已对 myaccount.jsp 进行了更改。从终端窗口中,执行以下命令:
cd /home/oracle/wkdir/gdk/gdkshop/public_html
cp /home/oracle/wkdir/gdk/step5/myaccount.jsp myaccount.jsp
Account Profile(帐户信息)中的 Territory(地区)已经更改为相应的翻译名称。
<%= localizer.getDisplayTerritory(customer.nlsTerritory)%>
该语言名称已更改为相应的已翻译语言名称。
<%=
localizer.getDisplayLanguage
(LocaleMapper.getOraLanguageFromShortName(customer.nlsLanguage))
%>
存储在 OE.CUSTOMER 表中的语言 ID 使用 Oracle 短语言名称。要获取完整的翻译名称,需要调用 LocaleMapper.getOraLanguageFromShortName 将其转换为完整语言名称。
2.
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器 、重建 gdkshop.jpr 并运行 gdkshop.jpr 。
3.
当显示第一个画面时,单击 Submit 。请注意,Account Profile(帐户信息)页面中的语言和地区名称已翻译为浏览器中的语言集。
返回主题列表
客户的帐户信息已经包含客户的语言和地区信息,该信息可用于在客户登录到应用程序后建立客户首选的本地化信息。OBE 设置脚本 obeGdkSetup.sq l 创建了存储客户时区信息的表,该信息将用于将数据库内存储的系统时间转换为用户当前时区对应的时间。
SQL> desc ext_user_profile
Name Type
----------------------------------------- -----------------------
CUSTOMER_ID NUMBER(6)
TIMEZONE VARCHAR2(50)
REG_DATE DATE
SQL> select * from ext_user_profile;
CUSTOMER_ID TIMEZONE REG_DATE
----------- -------------------------------------------------- ---------
9000 America/Los_Angeles 30-SEP-02
9001 Europe/Madrid 05-MAR-01
9002 Asia/Shanghai 12-JUN-99
9003 Asia/Calcutta 23-NOV-00
9004 Europe/Berlin 20-NOV-02
执行以下操作:
返回主题列表
您将注意到,虽然该页中的某些文本为西班牙语,但是产品名称和说明仍为英语。
您现在将看到如何翻译产品名称和说明以及如何支持汇率。
上一步为 localizer 对象提供了客户本地化信息。使用该信息可以进一步将以用户本地语言表示的产品名称和说明纳入订单中。可以将汇率应用于订单,把美元转换为客户的本地货币。
SQL> desc exchange_rates;
Name Type
----------------------------------------- -----------------------
NLS_TERRITORY VARCHAR2(50)
RATES NUMBER(8,4)
SQL> select * from exchange_rates;
NLS_TERRITORY RATES
-------------------------------------------- ----------
AMERICA 1
CHINA 8.2768
INDIA 47.175
GERMANY .8705
JAPAN 117.168
SPAIN .8705
执行以下操作
1.
从终端窗口中,执行以下命令:
cd /home/oracle/wkdir/gdk/gdkshop/src/oracle/i18n/demo/obe/gdkshop
cp /home/oracle/wkdir/gdk/step7/ShopAction.java ShopAction.java
cp /home/oracle/wkdir/gdk/step7/MyAccountAction.java MyAccountAction.java
cp /home/oracle/wkdir/gdk/step7/OrderInformationAction.java
OrderInformationAction.java
对 ShopAction.java 文件的修改包括:
导入 ShopAction.java 中的全球化类
import java.util.Locale;
import oracle.i18n.servlet.Localizer;
import oracle.i18n.util.OraLocaleInfo;
import oracle.i18n.util.LocaleMapper;
import oracle.i18n.text.OraCollator;
向 getOrders 中添加一个 Localizer 参数
public static List /* Order */ getOrders(String
userid, Localizer localizer ) throws Exception
增强 SQL 以包含 order_total 的汇率
ps = cn.prepareStatement(
"SELECT o.order_id, o.order_date, o.order_mode, o.customer_id, "
+ "o.order_status, o.order_total * e.rates, "
+ "TO_CHAR(o.order_date, 'DD-MON-RR HH12:MI:SS AM') "
+ "FROM orders o, customers c, exchange_rates e "
+ "WHERE o.customer_id = c.customer_id AND "
+ "e.nls_territory =?AND "
+ "LOWER(c.cust_email) = LOWER(?) ORDER BY order_date DESC" );
ps.setString(1, localizer.getOraTerritory().toUpperCase(Locale.US));
ps.setString(2, userid);
向 getOrders 中添加一个 Localizer 参数
public static Order getOrder(long orderid, Localizer localizer ) throws Exception
增强 SQL 以包含 order_total 的汇率
ps = cn.prepareStatement(
"SELECT o.order_id, o.order_date, o.order_mode, o.customer_id, "
+ "o.order_status, o.order_total * e.rates, "
+ "TO_CHAR(o.order_date, 'DD-MON-RR HH12:MI:SS AM') "
+"FROM orders o, exchange_rates e "
+ "WHERE o.order_id = ?AND e.nls_territory = ? " );
ps.setLong(1, orderid);
ps.setString(2, localizer.getOraTerritory().toUpperCase(Locale.US));
:
:
public static Customer getCustomer(String userid) throws Exception
增强 SQL 以包含 credit_limit 的汇率
ps = cn.prepareStatement(
"SELECT c.cust_first_name, c.cust_last_name, c.nls_language, "
+ "c.nls_territory, c.cust_email, c.credit_limit * ex.rates , "
+ "e.reg_date, TO_CHAR(e.reg_date) "
+ "FROM customers c, ext_user_profile e, exchange_rates ex "
+ "WHERE c.customer_id = e.customer_id "
+ "AND ex.nls_territory = c.nls_territory "
+ "AND LOWER(c.cust_email) = LOWER(?)" );
向 getOrderItems 中添加一个 Localizer 参数
public static List /* OrderItem */ getOrderItems(long orderId, Comparator
sortComp, Localizer localizer ) throws Exception
更改 SQL,以获取已翻译的产品名称和说明
ResultSet rs = null;
ps = cn.prepareStatement("SELECT oi.order_id, oi.product_id,"
+ "pd.translated_name, pd.translated_description,"
+ "oi.unit_price * e.rates, oi.quantity FROM order_items oi, "
+ "product_information p, product_descriptions pd,exchange_rates e "
+ "WHERE oi.order_id = ?AND p.product_id = oi.product_id AND "
+ "pd.product_id = p.product_id AND pd.language_id = ?AND "
+ "e.nls_territory = ?"
);
ps.setLong(1, orderId);
String lang = localizer.getOraShortLanguage().toUpperCase(Locale.US);
String terr = localizer.getOraTerritory().toUpperCase(Locale.US);
ps.setString(2, lang);
ps.setString(3, terr);
对 MyAccountAction.java 文件的修改包括:
向 getOrder 、getOrders 和 getOrderItems 中添加了一个新的 Localizer 参数。
List orderLst = ShopAction.getOrders(userid, localizer );
对 OrderInformationAction.java 文件的修改包括:
List orderItemList = ShopAction.getOrderItems(orderId, sortDir, localizer );
Order od = ShopAction.getOrder(orderId, localizer );
2.
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器 、重建 gdkshop.jpr 并运行 gdkshop.jpr 。
3.
再次察看 Colin.Olin 的订单。产品名称和产品说明现在应基于该客户的语言设置显示了。所有货币值从美元转换为客户的本地货币。
返回主题列表
在到目前为止,您所开发和运行的应用程序中还没有排序选项。您现在将学习添加语言排序功能。执行以下步骤来使用语言排序:
1.
从终端窗口中,执行以下命令:
cd /home/oracle/wkdir/gdk/gdkshop/src/oracle/i18n/demo/obe/gdkshop/bean
cp /home/oracle/wkdir/gdk/step8/OrderItem.java OrderItem.java
cd ..
cp /home/oracle/wkdir/gdk/step8/ShopAction.java ShopAction.java
cp /home/oracle/wkdir/gdk/step8/OrderInformationAction.java
OrderInformationAction.java
对 OrderItem.java 文件的修改包括: 导入 OraCollationKey
import oracle.i18n.text.OraCollationKey;
向 OrderItem 中添加一个 OraCollationKey 类型的变量
public OraCollationKey ocolkey;
更改 Comparator 对象以比较对照键 (collation key) 而非产品名称
从 return s.productName.compareTo(d.productName);
更改为 return s.ocolkey.compareTo(d.ocolkey);
从 return d.productName.compareTo(s.productName);
更改为 return d.ocolkey.compareTo(s.ocolkey);
对 ShopAction.java 文件的修改包括:
导入 OraCollator
import oracle.i18n.text.OraCollator;
添加一个新 URL 参数来保存语言排序的名称
public static String PARAM_SORT_NAME = "sortname";
添加一个取得语言排序名称的方法
public static String getSortingName(HttpServletRequest request)
{
String sortname = request.getParameter(PARAM_SORT_NAME);
if (sortname != null)
{
return sortname;
}
Localizer localizer = (Localizer)request.getAttribute("localizer");
return localizer.getLocalLinguisticSorts()[0];
}
向方法 getOrderItems 中添加一个排序名称参数
public static List /* OrderItem */ getOrderItems (long orderId, String
sortName, Comparator sortComp, Localizer localizer ) throws Exception
添加代码,为每个 OrderItem 对象生对照键
OraCollator ocol = OraCollator.getInstance(sortName);
...
odit.ocolkey = ocol.getCollationKey(odit.productName);
对 ShopAction.java 文件的修改包括:
向 getOrderItems 中添加语言排序名称:
String sortName = ShopAction.getSortingName(request);
request.setAttribute("sortname", sortName);
List orderItemList = ShopAction.getOrderItems(orderId, sortName, sortDir,
localizer);
2.
从终端窗口中,执行以下命令:
cd /home/oracle/wkdir/gdk/gdkshop/public_html
cp /home/oracle/wkdir/gdk/step8/orderinformation.jsp orderinformation.jsp
对 OrderItem.java 文件的修改包括: 添加一个 JavaScript,用于当您选择一个下拉菜单时提交语言排序名称。
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_jumpMenu(targ,selObj, restore, orderid){ //v3.0
eval(targ+".location='orderinformation?orderid="+ orderid +
"&sortname=" + selObj.options[selObj.selectedIndex].value+"'");
if (restore) selObj.selectedIndex=0;
}
//-->
</script>
为下拉菜单添加一个表单。
<td width="750" colspan="4">
<select name="sortings" onChange="MM_jumpMenu(
'parent',this,0,'<%= order.orderId %>','asc')">
<%
String[] lingsorts = localizer.getLocalLinguisticSorts();
String sortname = (String) request.getAttribute("sortname");
for (int i=0; i<lingsorts.length; ++i)
{
%>
<option value="<%= lingsorts[i] %>"
<%=lingsorts[i].equals(sortname) ?"selected" : "" %>>
<%=localizer.getDisplayLinguisticSort(lingsorts[i]) %>
</option>
<%
}
%>
</select>
</td>
3.
现在即可再次运行该应用程序。终止嵌入式 OC4J 服务器 、重建 gdkshop.jpr 并运行 gdkshop.jpr 。
4.
在 Order Information 页面中,您现在可以看到语言排序下拉式列表框出现在产品 名称之上,它允许客户从 与其所选语言相匹配的 Oracle 语言排序列表中选择排序方式来对记录进行重新排序。从列表中选择 Binary Sort 。
5.
使用二进制排序的问题是,大写字母始终排在所有小写 字母之前。选择 OracleStore 徽标并选择 Colin.Olin (Spanish) 以查看西班牙语的排序选项。
6.
选择 Espanol Multilingue 会发现,为了按传统西班牙语排序,ch 被视为单个字符 c 和 d 。