WebLogic Platform 8.1 SP3 简体中文版发行
WebLogic Server 中的 I18n(国际化)问题
WebLogic Server 中的 I18n(国际化)问题
以下各节描述了关于在简体中文环境中使用 WebLogic Server 的注意事项。
国际化概述
WebLogic Server 中 I18n 的主要特性:
- 在 WebLogic Server 中,所有字符都作为 Unicode 进行处理。输入或输出字符数据时,始终会执行代码转换。
- 必须分别为 WebLogic Server、J2EE 组件以及 WebLogic Server 容器上的资源指定相应的编码转换。
- 如果不指定编码转换,系统将应用默认的编码转换。
- 系统提供了多种类型的默认编码转换,但其中的一些编码转换不符合操作系统的区域。
建立分布式系统(使用 WebLogic Server 处理包含多字节字符的数据)之前,您应该了解如何指定特定于 Java 和 J2EE 的相应编码。此外,还应该根据与 WebLogic Server 连接的系统(如操作系统、Internet 及后端系统)的编码处理方式,控制编码转换。
下面简要描述了 WebLogic Server 中的编码处理。
Unicode 的使用
WebLogic Server 是使用 Unicode 进行内部编码的纯 Java 应用服务器程序。
因此,WebLogic Server 可以同时处理所有语言的字符(只要 Unicode 能够处理这些字符)。
编码转换
当 WebLogic Server 与外部系统交换字符数据时,需要进行编码转换。
在普通的操作系统中,几乎没有使用 Unicode(即 Java 的内部编码)的环境。操作系统使用分别针对每种平台定义的“本地编码”。例如,Windows 系统的本地编码是与语言相关的代码页,Unix 系统的本地编码是与区域(由 LANG 环境变量指定)对应的编码,而数据库的本地编码是在创建数据库时指定的字符集或由客户指定的字符集。
因此,在 WebLogic Server 中输入和输出信息时,您需要在本地编码与 Unicode 之间执行编码转换。当 WebLogic Server 与操作系统或外部资源交换字符数据时,始终会执行这种代码转换。
注意:序列化的 Java 类数据流中包含的字符作为 Unicode(UTF-8 编码)存放在类的内部信息中。这意味着您不必考虑序列化数据流的代码转换。例如,您不必考虑 EJB 或 RMI 的编码。
编码转换进程将使用大量的 CPU 资源,因为这种转换是针对每个字符逐一进行的。为了确保更好的系统性能,应在设计应用程序时尽量避免执行代码转换。
WebLogic Server 服务器自身的编码转换与应用程序组件和资源的编码转换是相互独立的
在 WebLogic Server 中,服务器本身的编码转换与 WebLogic Server 上应用程序组件和资源的编码转换是分开的。
在 WebLogic Server 中,服务器日志或管理控制台的编码是由服务器的 Java VM 或浏览器的语言设置的默认编码确定的,而与应用程序组件的编码或 WebLogic Server 提供的内容所用的语言无关。
而且,在配置 WebLogic Server 的行为时,可以不考虑 WebLogic Server 使用的区域或语言设置。
此外,您还可以为在 WebLogic Server 容器中配置的资源分别设置编码转换。
WebLogic Server 本身的编码转换包括:
- WebLogic Server 的系统日志输出
- 管理控制台的页面编码
- WebLogic Server 和本地文件系统之间的文件 I/O
单个应用程序的编码转换包括:
- JSP 文件
- Servlet
- DD 文件
- XML
- Web Service
WebLogic Server 上的资源包括:
在 WebLogic Server 中指定编码时,您需要弄清楚要为哪些类别指定编码。然后,您需要检查是否可以创建有效的字符对象,并且是否可以将 WebLogic Server 中的字符对象正确地转换为所需的编码。
如上所述,您应该了解编码转换的行为以便正确地进行设置。如果不指定编码转换,应用程序将无法正确处理多字节字符。
如果不指定编码,将使用与当前情况对应的默认编码。默认编码可能会根据目标规范或环境的不同而有所不同。
默认编码示例
影响 WebLogic Server 行为的默认编码包括:
- 服务器 VM 的默认编码
- J2EE 的默认编码
- XML 的默认编码
- HTTP 协议的默认编码
- 浏览器的默认编码
- Web Service(如 SOAP、WSDL、UDDI)的默认编码等
典型默认编码的示例
- 在简体中文版的 Windows 中,服务器 VM 的默认编码通常是 MS936。
- J2EE 的默认编码通常是 ISO-8859-1。
- XML 的默认编码通常是 UTF-8。
- HTTP 的默认编码通常是 US-ASCII。
由于不同的默认编码适用于不同的目标(如上所述),因此,如果不指定适当的编码,WebLogic Server 将无法正确处理简体中文。为了能够控制编码转换,您应该了解以下各节内容。
在 Java 语言术语中,编码即表示“字符集”。描述字符集的词很多,但是每个词的定义略有不同。
编码或字符集表示一种定义,根据这种定义,将计算机可读代码分配给特定语言的字符集合,以便计算机可以处理这些字符。该定义在 Java 术语中称为“编码”,在 Internet 术语中称为“字符集”。
Java 语言在其 I/O 部分中吸收了这些差异,因此可以将所有字符作为 Unicode 在内部进行处理。这意味着,只要字符集的编码定义存在,Java 便可以对其进行处理,而且可以吸收各个系统之间存在的所有编码差异。但是,目前尚不存在能够处理现有编码之间所有细微差异的编码转换表。此外,由于与 Unicode 的一致性问题,现有编码表具有一些局限性。
在 Java Web 应用服务器中,Java 编码名与 MIME 字符集之间的差异尤为重要。MIME 字符集是由 IANA 定义的,用于 Internet 和 XML 文件中。WebLogic Server 使用映射表将 Java 编码名与 IANA 字符集名关联起来,从而吸收这种差异。通过该表,WebLogic Server 可以处理在 JSP 中定义为“Shift_JIS”或以 Java 编码名定义为“MS932”的文件。可以修改 WebLogic Server 的映射表,使其将“Shift_JIS”字符集作为“cp943”Java 编码进行处理。
Xerces 是 WebLogic Server 的内置 XML 解析器,具有自己的 IANA - Java 映射表。用户无法自定义该映射。例如,“Shift_JIS”的 IANA 字符集名将映射为 Java 编码名“SJIS”。
一般而言,在 WebLogic Server 中,应使用 Java 编码名指定编码,而在 J2EE、Internet 或 XML 中,则应使用 IANA 字符集名称。如有必要,您可以修改这种映射。
安装
WebLogic Server 提供简体中文版安装程序和英语版安装程序。两者均可从 BEA Systems, Inc. 网站下载。
就影响 WebLogic Server 行为的程序文件而言,这两个安装程序是相同的,您可以将它们看作是包含相同软件的程序。此外,您可以在使用英语版安装程序安装的 WebLogic Server 与使用简体中文版安装程序安装的 WebLogic Server 之间顺利地进行交互。以下是简体中文版安装程序与英语版安装程序之间的差异:
共性:
- 所有的 WebLogic Server 类文件(weblogic.jar 及其他)
- 版本字符串
- 消息目录和管理控制台联机帮助
区别:
- 一些翻译过的文本文件
- about_wls/readme.txt/index.jsp 或 html
简体中文版的 WebLogic Server 8.1 不支持下列功能:
WebLogic Server 系统管理
下列项目使用 WebLogic Server 的 JVM 默认编码:
- WebLogic Server 的错误日志输出
- 与本地文件系统之间的文件输入和输出
下列项目使用浏览器的默认语言:
要更改日志输出等的编码,使其使用服务器的默认编码,请执行下列过程:
WebLogic Server 和 Java Virtual Machine 中的编码
在 WebLogic Server 中,您可以设置具有不同作用域的编码。例如,您可以设置 ContentType/字符集以指定 WebLogic Server 输出到客户端的编码。此外,在使用 WebLogic jDriver 时,您也可以使用 weblogic.codeset 属性指定 JDBC 连接的编码。本文将对上述功能及其他多种功能进行讨论。注意,为特定作用域指定的编码与运行 WebLogic Server 的 Java VM 的默认编码之间没有任何关系。如果 Java VM 在英语区域中运行,使用简体中文 JSP 文件提供服务不会有任何问题。但是,处理下列字符串时将使用 Java VM 默认编码:
- WebLogic Server 的错误日志输出
- 与本地文件系统之间的文件输入和输出
这些字符串使用每种平台的 Java VM 默认编码(由 file.encoding Java 系统属性指定的编码)。例如,WebLogic Server 输出到终端控制台的日志消息的语言和编码取决于在 Java VM 中指定的编码。file.encoding java 系统属性基于平台环境和系统区域。如果希望切换 WebLogic Server 日志消息的语言和编码,则需要切换系统区域。启动 VM 后,您不能动态切换 Java VM 默认编码。重新启动 WebLogic Server 之前,请确保执行了以下设置。
Windows 2000/Windows NT
从“控制面板”的“区域”选项中选择“英语(美国)”或“简体中文”。这样,服务器便使用 CP1252 或 MS936 作为默认编码。
UNIX
在 LANG 环境变量中指定您的平台支持的区域。
下面列出了服务器编码和 LANG 环境变量的设置:
表 2-1 服务器编码和 LANG 环境变量的设置
平台
|
编码
|
LANG 环境变量
|
Solaris
|
GB2312、GBK、GB18030
|
zh_CN、zh_CN.GBK、zh_CN.GB18030
|
HP
|
GB2312
|
zh_CN.hp15CN
|
例如,如果在 Solaris 上指定 GB2312 则 LANG 设置如下所示:
LANG=zh_CN
如何检查服务器编码
Java VM 默认编码将成为 WebLogic Server 的默认编码。通过引用管理控制台中的日志消息,可以检查编码。步骤如下:
- 在管理控制台中,用鼠标右键单击左侧窗格中的服务器名,并选择“查看服务器日志”。
- 单击“自定义此视图”。
- 在“子字符串”文本框中,输入“file.encoding”。
- 单击“应用”按钮。
所显示的编码即为服务器编码。
关于配置管理和受管服务器的说明
对域中所有 WebLogic Server 使用相同的编码。
在 WebLogic Server 中,域中的所有服务器必须具有相同的编码设置。
例如,当域中存在 Windows 平台时,可以统一使用 GB2312 编码类型(例如 MS936)。如果服务器使用不同的编码,则服务器日志将无法正确显示。
关于配置群集的说明
对群集中所有 WebLogic Server 使用相同的编码。
在 WebLogic Server 中,群集中的所有服务器必须具有相同的编码设置。
例如,当群集中存在 Windows 平台时,请统一使用 GB2312 编码类型(例如 MS936)。如果服务器使用不同的编码,则服务器日志将无法正确显示。
config.xml 的编码
config.xml 文件将按 UTF-8 格式输入/输出。如果使用文本编辑器直接编辑该文件,请采用 utf-8 格式阅读和保存。
关于将 WebLogic Server 用作 Web 服务器的说明
下面列出了关于将 WebLogic Server 用作 Web 服务器的说明:
要将 contentType 字符集参数添加到 HTTP 头中以提供 HTML 文件,请在 web.xml 文件中插入下列定义,这些定义可以为 HTML 文件显式指定编码:
<mime-mapping>
<extension>html</extension>
<mime-type>text/html;charset=GB2312</mime-type>
</mime-mapping>
这样,您可以使用如下 META 标记忽略 HTML 文件中的字符集设置:
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=GB2312">
JDBC 连接
创建 JDBC 连接缓冲池时,必须为使用多字节字符的 DB 连接指定相应的编码。您可能需要匹配 Web 层与 DB 层之间的编码转换映射。
有关详细信息,请参阅《WebLogic jDriver for Oracle (Deprecated)》中“WebLogic jDriver Advanced Features”一章中的“Codeset Support”。
部署
在 WebLogic Server 中,J2EE 组件的 DD 文件中的多字节字符编码将按照 XML 声明中指定的方法处理。如果 DD 文件在 XML 声明中没有编码特性或没有 XML 声明,则该文件将作为 UTF-8 进行处理。
在 WebLogic Builder 或管理控制台中编辑 DD 文件并保存所做的更改时,该文件的编码将与初始文件中的相同。
在 WebLogic 生成器或管理控制台中创建的 DD 文件没有 XML 声明。更改这类文件的编码时,请在 XML 声明中设置编码特性,并对文件进行相应的编码转换。
关于使用管理控制台的说明
管理控制台启动时使用的语言
管理控制台首次启动时显示的语言是在 Web 浏览器中指定的首选语言。例如,如果您正在使用简体中文版的 Windows 和 Internet Explorer,则管理控制台首次启动时将以简体中文显示。如果希望最初显示的语言为英语,可以通过在浏览器中将首选语言设置为“英语”实现这种更改。
在 WebLogic Server 8.1 中可以选择的管理控制台语言
- 简体中文/GB2312
- 简体中文/GBK
- 简体中文/GB18030
- 英语
请根据管理控制台所连接到的管理服务器的编码,选择 GB2312、GBK 或 GB18030。
在管理控制台启动之后切换语言
在控制台主页中,从“首选项”页面的“语言”下拉列表中选择所需的语言。
编程
关于使用 Servlet 和 JSP 的说明
编码转换、标准、作用域和首选项
WebLogic Server 是 Java 应用程序。所有字符串都将作为 Unicode 字符串在内部进行处理。另一方面,各种字符集是用于 HTML 页面的。在 WebLogic Server 中处理 HTML 数据时,Unicode 与 HTML 字符集之间的代码转换是通过 Java 编码转换器执行的。因此,使用 Weblogic Server 时,如何在应用程序中执行服务器内部处理的 Unicode 字符串与 HTML 编码之间的转换是非常重要的。
WebLogic Server 提供了多个基于特定作用域设置编码的参数,通过针对所使用的应用程序应用这些参数,您可以成功解决这种问题。
此外,在 WebLogic Server 中,可以分别设置每个模块的编码,而与 JavaVM 默认编码无关。
在 WebLogic Server 中,用来设置编码的一些方法是由 J2EE 规范定义的。其他方法是 WebLogic 的专用规范。您无需全部指定。请阅读以下描述,并将您环境的大多数适当的编码设置组合在一起。
编码设置
与 JSP/Servlet 有关的编码设置包括:
- 从 Servlet 输出的 HTTP 响应中使用的写入器编码
- JSP 文件的编码
- 从 JSP 输出的写入器编码
- HTTP 请求(如 GET/POST)的编码(对于特定的请求 URL)
- 数据(如 GET/POST)的编码(对于特定的 HTTP 请求)
- JSP 容器的编码
- Java 编码和 IANA 字符集之间的映射
一般而言,作用域的定义越明确,优先级越高。例如,如果 UTF-8 设置为 JSP 容器的默认编码,而且在特定 JSP 的 page 标记中指定了 GB2312,则 page 标记中指定的编码优先级更高(即使用 GB2312)。
建议在应用程序中使用相同的特定编码,或者应该设置您首选使用的编码来覆盖 JSP 容器级别的作用域。然后,对于要求特殊编码处理的区域,在更具体的层(如 JSP 或 servlet 本身)上设置编码。
使用简体中文的一般说明
请注意,如果以下内容不针对 HTTP 请求和 HTTP 响应指定任何编码,则使用 ISO-8859-1 编码。
Servlet
- 指定 HTTP 响应的编码 --- response.setContentType()
- 指定浏览器显示的编码 --- Content-Type
- 指定 HTTP 请求的编码 --- request.setCharacterEncoding 或 <input-charset>
JSP
- 指定 JSP 文件的编码 --- page 标记中的 pageEncoding 指令(可选)
- 指定页面输出的编码 --- page 标记中的 contentType 指令
- 指定浏览器显示的编码 --- Content-Type
- 指定 HTTP 请求的编码 --- request.setCharacterEncoding 或 <input-charset>
Servlet 和 JSP
- Java 编码与 IANA 字符集之间的映射(在 weblogic.xml 中设置)
下列部分详细说明了 Servlet 和 JSP 的每个设置。
Servlet
指定 HTTP 响应的编码 - response.setContentType()
要指定 Servlet 生成的 HTML 页的编码,请使用 setContentType() 方法。对 setContentType() 的调用将指定以下信息:
- 用于响应的 HTTP 头中的 ContentType 特性
- 用于输出响应的写入器编码
因此,在获得写入器之前,必须先调用 setContentType()。
res.setContentType("text/html;charset=GB2312");
PrintWriter out = res.getWriter();
该调用指定 HTTP 头中的 contentType。这意味着将同时指定浏览器显示的编码。
指定 HTTP 请求的编码 --- request.setCharacterEncoding 或 <input-charset>
现在,您已经完成了 HTTP 响应的编码设置,这些响应是使用上述方法从 WebLogic Server 发送到客户端的数据。下面描述了在将数据从客户端发送至 WebLogic Server 时如何设置 HTTP 请求的编码。
可通过三种方法指定 HTTP 请求的编码:
- 将字符集写入 HTTP 请求的 contentType 中
这种方法最符合 HTTP 规范。但是,您无法在 Microsoft Internet Explorer 或 Netscape 浏览器中指定该值。
- 在服务器上指定 HTTP 请求的编码
使用 request.setCharacterEncoding() 方法。可以指定每个请求的编码。而且,也可以执行一些更具体的操作,例如动态控制编码。此外,setCharacterEncoding() 符合 Servlet 2.3 规范。因此,应用程序是可移植的。
request.setCharacterEncoding("GB2312");
String pval = request.getParameter(pname);
- 使用 <input-charset> 在 Web 应用程序的部署描述符 (weblogic.xml) 中指定请求 URL 的编码。
在 WebLogic Server 6.1 或更高版本中,此编码是在 weblogic.xml 中设置的。但是,在 WebLogic Server 6.0 中,它是在 web.xml 中设置的。而且元素名等已经更改。因此,从 WebLogic Server 6.0 进行迁移时,需要修改 weblogic.xml 和 web.xml 文件。请参阅迁移指南。
例如,要指定 <input-charset>,可以对其进行设置以便按以下方法获取请求 URL 的编码:
示例
- Obtain http://localhost:7001/webappa/path1/ in UTF-8
- Obtain http://localhost:7001/webappa/path1/ in GB2312
如下所示,在部署描述符 (weblogic.xml) 中写入目标 Web 应用程序的 <input-charset>。
在 <charset-param>(嵌套在 <weblogic-web-app> 中)中,写入要指定其编码的请求 URL 路径,以及希望在 IANA 名称中为 HTTP 请求指定的编码。
有关在 Java 编码名与 IANA 字符集之间进行映射的信息,请参阅“在 Java 编码与 IANA 字符集之间进行映射(weblogic.xml 中的设置)”一节。
下面是一个处理多个编码的 Web 应用程序的示例。
在下面的示例中,“/*”的编码设置为 GB2312,“/rus/jo/*”的编码设置为 ISO-8859-1。
<charset-params>
<input-charset>
<resource-path>/*</resource-path>
<java-charset-name> GB2312</java-charset-name>
</input-charset>
</charset-params>
<charset-params>
<input-charset>
<resource-path>/rus/joe/*</resource-path>
<java-charset-name>ISO-8859-1</java-charset-name>
</input-charset>
</charset-params>
有关此设置的详细信息,请参阅《Developing Web Applications for WebLogic Server》中的“charset-params”一节。
JSP
指定 JSP 文件的编码 - pageEncoding(可选)
要指定 WebLogic Server JSP 容器或 JSP 编译器用来读取 JSP 文件的编码,请在 page 标记中指定 pageEncoding 指令,如下所示:
<%@ page contentType="text/html; charset=GB2312" pageEncoding="GB2312" %>
指定页面输出的编码 --- page 标记中的 contentType 指令
要指定页面输出的编码,请在 page 标记中指定 contentType 指令,如下所示:
<%@ page contentType="text/html; charset=GB2312" %>
此外,当您在页面指令中指定 contentType 时,将在 HTTP 响应的 HTTP 头中指定相同的 contentType。这意味着将同时指定浏览器显示的编码。
如果未设置 pageEncoding 指令,会将 contentType 指令用作读取 JSP 文件的编码。
如果 JSP 容器找到了 contentType 设置,它将停止解析 JSP 文件,将文件读取器切换至新指定的编码,并重新开始从头解析 JSP 页面。如果在一个文件中指定了多个 contentType,将会出现解析错误。因此,当使用静态包含命令将一个文件包含于另一个文件时,如果这两个文件拥有各自的编码规范,将会出现错误。在动态包含中,不会出现错误,但会生成乱码字符。
注意:即使在一个文件中指定了多个 contentType,也可以防止出现解析错误,只要每个文件指定相同的编码即可(请参阅“静态与动态包含以及编码差异”一节)。
<jsp-param>
<param-name>backwardCompatible</param-name>
<param-value>true</param-value>
</jsp-param>
例如,使用静态包含命令(<%@ include)执行包含时,如果“包含来源”和“包含目标”拥有各自的页面指令,而且单个转换单元具有多个页面指令,但是每个页面指令都指定相同的编码,则不会出现任何问题。
指定 HTTP 请求的编码
可以像在 Servlet 中指定编码那样,在 JSP 中指定 HTTP 请求的编码。请参阅“Servlet”一节。
<%
request.setCharacterEncoding("GB2312");
String pval = request.getParameter(pname);
%>request.setCharacterEncoding or <input-charset>
Servlet 和 JSP
Java 编码与 IANA 字符集之间的映射(在 weblogic.xml 中设置)
使用 setContentType() 方法或在 page 标记中使用 contentType 指令指定编码时,请使用 IANA 字符集名称。但是,当在 WebLogic Server(Java 应用程序)中处理编码时,这些值必须是 Java 编码名。WebLogic Server 内部也有默认映射,而且通常都使用这些默认映射。默认映射还包括那些未在 IANA 中定义、但通常在 HTML 的 Content-Type 中使用的映射(请参阅 WebLogic Server 中定义的 MIME-Java 编码映射表)。
示例:x-sjis ----> Shift_JIS
可以根据自己的意愿更改此映射。请如下所示在 Web 应用程序部署描述符中设置映射。
例如,contentType 中的“Shift_JIS”设置在 WebLogic Server 中作为 SJIS 进行处理,这是因为 IANA 字符集“Shift_JIS”映射为 Java 编码“Shift_JIS”(在 JDK1.4 中,Shift_JIS 作为 SJIS 的别名使用)。
注意:在 Java 1.3 中,IANA 字符集 Shift_JIS 作为 MS932 进行处理(从 JDK 1.1.8 至 JDK 1.4.0;在 JDK1.4.1 或更高版本中,Shift_JIS 作为 SJIS 进行处理)。
这样,通过默认设置即可使用 MS932 特定的字符集(@ 等)。
可以通过在 weblogic.xml 中定义 <charset-mapping> 来覆盖默认映射。
在下面的示例中,Shift_JIS 映射为 MS932。
<charset-params>
<charset-mapping>
<iana-charset-name>Shift_JIS</iana-charset-name>
<java-charset-name>MS932</java-charset-name>
</charset-mapping>
</charset-params>
注意,此设置不符合 J2EE 规范。在 WebLogic Server 6.0 中,它是在 web.xml 中设置的。在 WebLogic Server 6.1 或更高版本中,已改在 Web 应用程序部署描述符 weblogic.xml 中进行设置了;而且,元素名等也发生了变化。从 WebLogic Server 6.0 进行迁移时,请注意这些更改。
使用 ISO-8859 编码对 HTTP 请求进行编码的方法
如果在 <input-charset> 中将 iso-8859 指定为 HTTP 请求的编码,仍然可以通过以下方法获取包含不同编码的 HTTP 请求。
示例:
new String(request.getParameter(itemQ[i]).getBytes ("8859_1"), "GB2312")
但是,对于通过以下方法在 HTTP 请求的 HTTP 头中指定 contentType 的 HTTP 客户端,则不能使用此解决方法,因为在 HTTP 头的 contentType 中指定的编码优先于 <input-charset> 中指定的编码。这种情况下,必须修改应用程序代码。
Content-Type:application/x-www-form-urlencoded;charset=gb2312
静态与动态包含以及编码差异
静态包含
<%@ include file="relativeURL" %>
这种情况下,在执行 JSP 编译之前,所有包含文件都将被加载并收集到一个文件中。因此,如果在指定包含的文件中指定了编码,则被包含的文件将作为与包含文件使用相同的编码进行处理,即使它未指定编码。在 WebLogic Server 6.1 或更早的版本中,如果“包含来源”与“包含目标”拥有相同的编码规范,则不会出现编译错误。在 WebLogic Server 8.1 中,如果“包含来源”与“包含目标”拥有各自的页面指令,则将出现编译错误。为避免这种问题,请将 weblogic.xml 中的“backwardCompatible”设置为 True。
即使将 backwardCompatible 设置为 True,如果“包含来源”与“包含目标”之间的编码设置存在差异,也会出现 JSP 编译错误。
动态包含
<jsp:include page="{ relativeURL | <%= expression %>}" flush="true" />
在动态包含中,加载页面时不会包含该页面,而是将其保留在标记状态。页面是在执行 JSP 时实现包含的。因此,执行包含操作的 JSP 中设置的编码不会应用于被包含的文件。
因此,还必须在被包含的文件中指定编码。
CGIServlet
将使用多字节字符的 CGI 服务迁移至 WebLogic Server 上的 CGI servlet 时,您必须在 CGI 程序生成的 HTTP 头中指定相应的 contentType 字符集参数。如果未设置 contentType,则将使用 ISO-8859-1,即 J2EE Servlet 容器的默认编码。
此外,为了从客户端正确接收输入字符串,还必须使用相应的编码。您需要在目标 Web 应用程序的 DD 文件中编写该代码。如果未设置该代码,将会使用 ISO-8859-1。
WebService
SOAP 消息及其编码的处理
接收 SOAP 消息
在 WebLogic Server Web Service 中,编码处理遵从 SOAP1.1 和 SOAP1.2 规范(*注释 1)。基于 SOAP1.1 规范的 HTTP/SOAP 消息包含 text/xml 媒体类型,这些消息的编码将根据 RFC2376 进行处理。以下说明了基于 RFC2376 规范的行为。基于 SOAP 1.2 规范的 HTTP/SOAP 消息包含 application/soap+xml 媒体类型,这些消息的编码将根据 RFC3023 进行处理。以下说明了基于 RFC 规范的行为:
SOAP 1.1:
- HTTP 头中的 ContentType 字符集参数用于确定 HTTP/SOAP 请求的编码。
- 忽略 XML 声明中的编码特性。
- 如果未在 contentType 中指定字符集,则会按照 RFC2376 将消息作为 US-ASCII 进行处理。
SOAP 1.2:
- HTTP 头中的 ContentType 字符集参数用于确定 HTTP/SOAP 请求的编码。
- 忽略 XML 声明中的编码特性。
- 如果未使用 contentType 指定字符集,则使用 XML 声明中的编码特性。
- 如果未指定 contentType 字符集参数和 XML 声明中的编码特性,则消息将作为 utf-8 进行处理。
WebLogic Workshop 以及 WebLogic Sever 8.1 也会根据该规范进行操作。因此,请确保为调用 Web Service(由 WebLogic Workshop 使用 HTTP/SOAP 开发)的客户端正确指定了 contentType 字符集。
发送 SOAP 消息
由 WebLogic Server 生成的所有 HTTP/SOAP 消息都使用 utf-8 进行编码。在生成过程中,“encoding=UTF-8”会添加到 SOAP 消息的 ContentType 头中。
注意:在英语区域(例如,在 UNIX 中指定 LANG=C)中启动 WebLogic Server 时,只能在 SOAP 消息中使用 us-ascii 字符。不允许包含其他字符。在 Web Service 中使用简体中文字符时,请确保 WebLogic Server 是在简体中文区域中启动的。
如果希望在英语区域中启动的 WebLogic Server 中使用 us-ascii 以外的其他字符,请在 WebLogic Server 启动脚本文件中设置以下启动选项。这将生成 utf-8 格式的消息,即使 WebLogic Server 运行在英语区域中。
注意:建议使用 UFT-8 处理 SOAP 消息。
-Iweblogic.webservice.i18n.charset=utf-8
Web Service 主页
Web Service 主页是使用服务器 VM 默认编码生成的。
UDDI 浏览器
UDDI 浏览器仅支持 us-ascii 字符, 无法正常使用多字节字符。
XML -- StreamParser 中的多字节字符处理
在 WebLogic Server 中,要将编码信息添加到使用 XML Streaming API 生成的 XML 头中,请如下使用 ElementFactory 类的 createStartDocument():
XMLOutputStreamFactory factory = XMLOutputStreamFactory.newInstance();
XMLOutputStream output = factory.newOutputStream(new
OutputStreamWriter(new FileOutputStream(fname),"GB2312"));
output.add(ElementFactory.createStartDocument("GB2312","1.0"));
output.flush();
下面是关于使用 XML 流 API 解析包含简体中文字符的 XML 文档的说明。要点与使用 Xerces 解析器的注意事项相同。
通过流为解析器提供输入时将使用字节流。这将启用解析器的 XML 编码自动检测功能,因此解析器可以使用由 XML 声明中的编码特性指定的编码生成字符流,从而确保正确进行解析。
通过 Unicode 字符流进行输入时,解析器将忽略 XML 头中的编码设置。
JDBC
使用 BEA WebLogic Type4 Oracle 驱动程序
在 WebLogic Server8.1 中,将安装每种数据库(如 Oracle、SQL Server、DB2 等)的 BEA Weblogic Type4 驱动程序。作为一个示例,以下内容说明了如何使用 WebLogic Type4 Oracle 驱动程序来创建环境:
设置环境
在 WebLogic Server 8.1 中,BEA WebLogic Type4 驱动程序安装在 WL_HOME\server\lib 目录中。这些文件包含在 weblogic.jar 的清单类路径中,并且自动添加至服务器类路径中。 因此,可以使用 WebLogic Type 4 驱动程序直接从 WebLogic Server 上的 JDBC 客户端(JSP、Servlet 等)连接至数据库。有关对 WeLogic4 中使用的 JDBC 客户端进行编程的详细信息,请参阅 WebLogic Type 4 JDBC Drivers。
连接缓冲池设置
从管理控制台设置连接缓冲池
配置使用 BEA WebLogic Type4 Oracle 驱动程序的连接缓冲池时,请执行以下设置:
有关详细信息,请参阅 WebLogic Type 4 JDBC Drivers。
从管理控制台设置连接缓冲池
- 配置域。
- 使用管理控制台中的“服务”>“JDBC”>“连接缓冲池”选项卡打开“配置新的 JDBC Connection Pool”。
- 在“选择数据库”屏幕中,将数据库类型设置为“Oracle”并将数据库驱动程序设置为“BEA’s Oracle Driver (Type 4) Version8.1.7,9.0.1,9.2.0”。
- 在下一个屏幕中,输入连接缓冲池的名称和属性。
- 在“测试数据库连接”屏幕中测试驱动程序配置。
- 成功连接之后,请执行下一个屏幕中的“创建和部署”。
在配置向导中创建域期间设置连接缓冲池
- 启动配置向导。
- 选择可选模板,然后选择自定义配置。
- 在“数据库 (JDBC) 选项”屏幕中选择“是”。
- 在“配置 JDBC 连接缓冲池”屏幕中执行以下设置:
Vendor : Oracle
Driver : BEA? Oracle Driver(Type 4) Version 8.1.7,9.0.1,9.2.0
(请将所有其他项目设置为与您的环境匹配)
手动设置连接缓冲池
在创建连接缓冲池的域的 config.xm 中添加以下内容:
(更改标有下划线部分的值,使其与您的环境匹配)
<JDBCConnectionPool DriverName=weblogic.jdbc.oracle.OracleDriver"
Name="testpool"
Password="tiger"
Properties="user=scott;portNumber=1521;SID=testdb;serverName=testserver"
Targets="myserver"
TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:bea:oracle://jpw2k17:1521"/>
使用 BEA WebLogic jDriver for Oracle
以下是对 BEA WebLogic jDriver for Oracle 的环境设置的说明:
设置环境
要使用 BEA WebLogic jDriver for Oracle 驱动程序,必须具备 WebLogic OCI 驱动程序本地库。对于 32 位 Windows 系统,WebLogic OCI 驱动程序本地库安装在 WL_HOME\server\bin\ 中。对于 Unix 平台,WebLogic OCI 驱动程序本地库安装在 WL_HOME/server/lib/{OS name}/ 中。 在 WebLogic Server 8.1 中,9.2.0 库是默认设置。要在 Windows 环境中引用不同的库版本,请在 PATH 中添加所需的库路经。要对 UNIX 环境引用不同的库版本,请在 LD_LIBRARY_PATH(对于 HP-UX 而言,为 SHLIB_PATH)中添加所需的库路经。
除了 WebLogic OCI 驱动程序本地库设置以外,以下设置是使用 JDriver for Oracle 所必须具备的:
- 设置 Oracle 库的路径。
在 startWebLogic.cmd(对于 UNIX 环境而言,为 startWebLogic.sh)中添加下一个设置。在 Windows 环境中,将变量环境 PATH 设置为 Oracle 安装目录 bin。
set PATH=%ORACLE_HOME%\bin;%PATH%
在 Unix 环境中,将 D_LIBRARY_PATH 或 SHLIB_PATH 添加到 lib(或 lib32)中。
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib32:$LD_LIBRARY_PATH
有关详细信息,请参阅 Setting Up the Environment for Using WebLogic jDriver for Oracle。
- 指定 Oracle 变量环境 NLS_LANG。
NLS_LANG 和 weblogic.codeset(jDriver for Oracle 的连接属性)始终必须拥有相同的编码。有关详细信息,请参阅《WebLogic jDriver Advanced Features》中的“Codeset support”一节。
借助以上设置,您可以使用 WebLogic jDriver for Oracle 直接从 WebLogic Server 上的 JDBC 客户端(JSP、Servlet 等)连接至数据库。 有关使用 WebLogic jDriver for Oracle 对 JDBC 客户端进行编程的详细信息,请参阅 Using WebLogic jDriver for Oracle。
连接缓冲池设置
为了使用 WebLogic jDriver for Oracle 配置连接缓冲池,请完成以下设置。有关详细信息,请参阅《Configuring WebLogic jDriver for Oracle》中的“Setting Up a Connection Pool”。
从管理控制台设置连接缓冲池
- 配置域。
- 使用管理控制台中的“服务”>“JDBC”>“连接缓冲池”选项卡打开“配置新的 JDBC Connection Pool”。
- 在“选择数据库”屏幕中,将数据库类型设置为“Oracle”并将数据库驱动程序设置为“BEA’s Oracle Driver (Type 2) Version8.1.7,9.0.1,9.2.0”。
- 在下一个屏幕中,输入连接缓冲池的名称和属性。
- 在“测试数据库连接”屏幕中测试驱动程序配置。
- 成功连接之后,请执行下一个屏幕中的“创建和部署”。
在配置向导中创建域期间设置连接缓冲池
- 启动配置向导。
- 选择可选模板,然后选择自定义配置。
- 在“数据库 (JDBC) 选项”屏幕中选择“是”。
- 在“配置 JDBC 连接缓冲池”屏幕中执行以下设置:
Vendor : Oracle
Driver : Oracle's Driver(Type 2) Version 8.1.7,9.0.1,9.2.0
(请将所有其他项目设置为与您的环境匹配)
手动设置连接缓冲池
在创建连接缓冲池的域的 config.xm 中添加以下内容:
(更改标有下划线部分的值,使其与您的环境匹配)
<JDBCConnectionPool DriverName=weblogic.jdbc.oci.Driver"
Name="testpool"
Password="tiger"
Properties="user=scott;server=testdb.testserver"
Targets="myserver"
TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:weblogic:oracle"/>
使用 Oracle OCI 驱动程序
以下说明如何为使用 Oracle OCI 驱动程序进行相应的环境设置:
设置环境
在使用 Oracle OCI 驱动程序的域中,如下设置 startWebLogic.cmd(或 startWebLogic.sh): %ORACLE_HOME% 表示 Oracle 客户端的安装目录。
- 在 CLASSPATH 中添加以下内容:
%ORACLE_HOME%\jdbc\lib\classes12.zip
%ORACLE_HOME%\jdbc\lib\nls_charset12.zip
- 在 PATH 中添加以下内容:
%ORACLE_HOME%
现在,您可以使用 Oracle OCI 驱动程序直接从 WebLogic Server 上的 JDBC 客户端(JSP、Servlet 等)连接至数据库。有关使用 Oracle OCI 驱动程序对 JDBC 客户端进行编程的详细信息,请参阅 Oracle 手册。
连接缓冲池设置
使用 Oracle OCI 驱动程序设置连接缓冲池时,请执行以下设置:
从管理控制台设置连接缓冲池
- 配置域。
- 修改 startWebLogic.cmd(或 startWebLogic.sh)文件,使其与您所使用的 Oracle OCI 驱动程序版本匹配。
*在 CLASSPATH 中添加以下内容:
%ORACLE_HOME%\jdbc\lib\classes12.zip
%ORACLE_HOME%\jdbc\lib\nls_charset12.zip
*在 PATH 中添加以下内容:
%ORACLE_HOME%
- 使用管理控制台中的“服务”>“JDBC”>“连接缓冲池”选项卡打开“配置新的 JDBC Connection Pool”。
- 在“选择数据库”屏幕中,选择“Oracle”作为数据库类型,然后选择“Oracle`s Driver (OC) Version8.1.7,9.0.1,9.2.0”作为数据库驱动程序。
- 在下一个屏幕中,输入连接缓冲池的名称和属性。
- 在“测试数据库连接”屏幕中测试驱动程序配置。
使用 Oracle Client 8 时,请按照上述方法更改 URL。
<修改前> jdbc:oracle:oci:@[数据库名].[数据库服务器名]
<修改后> jdbc:oracle:oci8:@[数据库名].[数据库服务器名]
成功连接之后,请执行下一个屏幕中的“创建和部署”。
在配置向导中创建域期间设置连接缓冲池
- 启动配置向导。
- 选择可选模板,然后选择自定义配置。
- 在“数据库 (JDBC) 选项”屏幕中选择“是”。
- 在“配置 JDBC 连接缓冲池”屏幕中执行以下设置:
Vendor : Oracle
Driver : Oracle? Driver(OCI) Version 8.1.7,9.0.1,9.2.0
(请将所有其他项目设置为与您的环境匹配)
- 修改 startWebLogic.cmd(或 startWebLogic.sh)文件,使其与您所使用的 Oracle OCI 驱动程序版本匹配。
*在 CLASSPATH 中添加以下内容:
%ORACLE_HOME%\jdbc\lib\classes12.zip
%ORACLE_HOME%\jdbc\lib\nls_charset12.zip
*在 PATH 中添加以下内容:
%ORACLE_HOME%
- 使用 Oracle Client 8 时,请在已创建域的 config.xml 中更新连接缓冲池设置,如下所示:
<修改前> URL="jdbc:oracle:oci:@[数据库名].[数据库服务器名]
<修改后> URL="jdbc:oracle:oci8:@[数据库名].[数据库服务器名]
手动设置连接缓冲池
- 修改创建连接缓冲池的域的 startWebLogic.cmd(或 startWebLogic.sh)文件,使其与您所使用的 Oracle OCI 驱动程序版本匹配。
*在 CLASSPATH 中添加以下内容:
%ORACLE_HOME%\jdbc\lib\classes12.zip
%ORACLE_HOME%\jdbc\lib\nls_charset12.zip
*在 PATH 中添加以下内容:
%ORACLE_HOME%
- 在创建连接缓冲池的域的 config.xm 中添加以下内容:
(更改标有下划线部分的值,使其与您的环境匹配)
<JDBCConnectionPool DriverName=oracle.jdbc.driver.OracleDriver"
Name="testpool"
Password="tiger"
Properties="user=scott"
Targets="myserver"
TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:oracle:oci:@testdb.testserver"/>
使用 Oracle Client 8 时的状态 URL,如下所示。
URL="jdbc:oracle:oci8:@testdb.testserver"
使用 Oracle Thin 驱动程序
Oracle Thin 9.2.0 驱动程序与 WebLogic Server 8.1 一同安装。下面描述如何设置 Orcale Thin 驱动程序。
设置环境
在 WebLogic Server 8.1 中,Oracle Thin 9.2.0 安装在 WL_HOME\server\lib 目录中。该文件包含于 weblogic.jar 的清单类路径中,并且自动添加至服务器类路径中。 因此,您可以使用 Oracle Thin 驱动程序从 WebLogic Server 中的 JDBC 客户端(JSP、Servlet 等)直接连接至数据库。 有关使用其他版本的 Oracle Thin 驱动程序的详细信息,请参阅《Programming WebLogic JDBC》中的 Using Third-Party Drivers with WebLogic Server。 有关使用 Oracle Thin 驱动程序对 JDBC 客户端进行编程的信息,请参阅 Oracle 手册。
nls_charset12.zip 支持的字符集
Oracle Thin 驱动程序在 CHAR 和 VARCHAR 类型中支持 US7ASCII、WE8DEC、ISO-LATIN-1、UTF-8 字符集。如果使用其他的字符集,请将 nls_charset12.zip 添加到 CLASSPATH 中。nls_charset12.zip 将安装在 WL_HOME\ext\lib 中。 将 WL_HOME\ext\jdbc\oracle\920\nls_charset12.zip 添加到您所使用的域的 startWebLogic.cmd(或 startWebLogic.sh)的 CLASSPATH 中。 有关详细信息,请参阅 Using the Oracle Thin Driver。
连接缓冲池设置
使用 Oracle Thin 驱动程序配置连接缓冲池时,请执行以下操作。 有关详细信息,请参阅《Programming WebLogic JDBC》中的 Configuring and Using WebLogic JDBC。
从管理控制台设置连接缓冲池
a) 配置域。
b) 使用管理控制台中的“服务”>“JDBC”>“连接缓冲池”选项卡打开“配置新的 JDBC Connection Pool”。
c) 在“选择数据库”屏幕中,选择“Oracle”作为数据库类型,然后选择“Oracle`s Driver (Thin) Version8.1.7,9.0.1,9.2.0”作为数据库驱动程序。
在下一个屏幕中,设置连接缓冲池的名称和属性。
e) 在“测试数据库连接”屏幕中测试驱动程序配置。
f) 成功连接之后,请执行下一个屏幕中的“创建和部署”。
在配置向导中创建域期间设置连接缓冲池
a) 启动配置向导。
b) 选择可选模板,然后选择自定义配置。
c) 在“数据库 (JDBC) 选项”屏幕中选择“是”。
d) 在“配置 JDBC 连接缓冲池”屏幕中执行以下设置:
Vendor : Oracle
Driver : Oracle? Driver(Thin) Version 8.1.7,9.0.1,9.2.0
(请将所有其他项目设置为与您的环境匹配)
手动设置连接缓冲池
在创建连接缓冲池的域的 config.xm 中添加以下内容:
(更改标有下划线部分的值,使其与您的环境匹配)
<JDBCConnectionPool DriverName="oracle.jdbc.driver.OracleDriver"
Name="testpool"
Password="tiger"
Properties="user=scott"
Targets="myserver"
TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:oracle:thin:@testserver:1521:testdb/">
同时连接至编码不同的数据库时的限制
使用 OCI 驱动程序时,您必须为 NLS_LANG 和 weblogic.codeset 指定相同的编码。如果将这些参数设置为相同的值,将会在 Oracle 端执行编码转换,因为您已作为客户端连接至 Oracle,且您具有特定的 NLS_LANG。 例如,如果 NLS_LANG 和 weblogic.codeset 的编码都是 SJIS,将会在 Oracle 端上执行相应的编码转换,即使 Oracle DB 的编码为 EUC-JP。如果这两个参数相同,则无论 DB 的编码如何,都会成功进行连接。
有关使用 DB 执行编码转换的注意事项
如果您使用不同的转换器在平台本地编码与 Java 编码之间进行转换,字符可能无法正确处理。这是由 Unicode 和 JIS 的定义造成的。
例如,如果使用以下转换器在平台本地编码与 Java 编码之间进行转换。
DB -------------> WebLogic Server -------------> Web 浏览器
SJIS Windows-31J
以下代码无法正确处理:
SJIS 代码
|
"~" (0x8160)
|
"∥" (0x8161)
|
"¢" (0x817C)
|
"-" (0x8191)
|
"£" (0x8192)
|
"¬" (0x81CA)
|
这种情况下,您必须专门使用 SJIS 来处理从 WebLogic Server 输出到 Web 浏览器的内容。例如,如果在 JSP 的 page 标记中指定了以下编码:
<%@ page contentType="text/html; charset=Windows-31J" %>
必须将“Windows-31J”设置更改为将从 Unicode 转换为本地平台编码的“Shift_JIS”。
因此,在这种情况下,要更改 WebLogic Server 内部包含的默认编码映射表,则必须在 Web 应用程序的部署描述符 (weblogic.xml) 中写入以下定义。
<charset-params>
<charset-mapping>
<iana-charset-name>Shift_JIS</iana-charset-name>
<java-charset-name>SJIS</java-charset-name>
</charset-mapping>
</charset-params>
其他
使用 iMode 字符时
Java 的 MS932 编码表支持转换为外部字符区域。通过使用 MS932,您可以提供使用 iMode 外部字符的内容。 |