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" %>
另外,当您在 page 指令中指定 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) 执行包含操作时,如果“包含源”和“包含目标”都有各自的 page 指令,并且一个转换单元有多个 page 指令,则只要每个 page 指令都指定相同的编码,就不会发生任何问题。指定 HTTP 请求的编码可以像在 Servlet 中一样,在 JSP 中指定 HTTP 请求的编码。有关详细信息,请参阅 Servlet 部分。<%
             request.setCharacterEncoding("GB2312");
             String pval = request.getParameter(pname);
         %>request.setCharacterEncoding or <input-charset>
Servlet 和 JSPJava 编码与 IANA 字符集之间的映射(在 weblogic.xml 中设置)在 page 标记中使用 setContentType() 方法或 contentType 指令指定编码时,请使用 IANA 字符集名称。但是,在 Java 应用程序 WebLogic Server 中处理这些编码时,这些值必须是 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 字符集 GB2312 作为 MS936 处理(从 JDK 1.1.8 到 JDK 1.4.0。在 JDK1.4.1 或更高版本中,Shift_JIS 作为 SJIS 处理)。这样通过默认设置即可使用 MS932 特定的字符集(@ 等)。为了分配和使用与默认映射不同的编码,请使用下列步骤覆盖默认映射。在 Web 应用程序的部署描述符 (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 迁移,需要修改 weblogic.xml 和 web.xml 文件。使用 ISO-8859-1 编码对 HTTP 请求进行编码的方法如果在 <input-charset> 中将 ISO-8859-1 指定为 HTTP 请求的编码,您仍可以使用下列方法获取具有另一编码的 HTTP 请求。示例:new String(request.getParameter(itemQ[i]).getBytes ("8859_1"), "GB2312")
但是,如果 HTTP 客户端用于 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 中,如果它们有各自的 page 指令,则会出现编译错误。要避免此问题,请将 weblogic.xml 中的“backwardCompatible”设置为 True。如果“包含源”与“包含目标”的编码设置不同,则会出现 JSP 编译错误。动态包含<jsp:include page="{ relativeURL | <%= expression %>}" flush="true" />
如果使用 jsp:include,加载页面时不会包含此页面,而是留在标记状态中。当执行 JSP 时将包含此页面。因此,执行包含操作的 JSP 中设置的编码不会应用于被包含的文件。因此,还必须在被包含的文件中指定编码。CGIServlet将使用多字节字符的 CGI 服务迁移到 WebLogic Server 中的 CGI Servlet 时,必须在 CGI 程序生成的 HTTP 头中指定适当的 contentType 字符集参数。如果未设置 contentType,则使用 ISO-8859-1,它是 J2EE Servlet 容器的默认编码。还必须使用 input-charset 参数,以便从客户端正确接收输入字符串。您需要将它写入到目标 Web 应用程序的 DD 文件中。如果未设置它,则使用 ISO-8859-1。

解决方案 »

  1.   

    WebServiceSOAP 消息及其编码的处理接收 SOAP 消息在 WebLogic Server Web Service 中,编码处理符合 SOAP1.1 和 SOAP1.2 规范(*注释 1)。SOAP 1.1 HTTP/SOAP 消息的媒体类型是“text/xml”,其编码处理在 RFC2376 中定义。对于 SOAP 1.2 HTTP/SOAP 消息,媒体类型是“application/soap+xml”,其编码处理在 RFC3023 中定义。这些 RFC 规范定义下列行为:SOAP 1.1HTTP 头中的 ContentType 字符集参数用于确定 HTTP/SOAP 请求的编码。 
    忽略 XML 声明中的编码特性。 
    如果未使用 contentType 指定字符集,则此消息将作为 US-ASCII 进行处理。 
    SOAP 1.2HTTP 头中的 ContentType 字符集参数用于确定 HTTP/SOAP 请求的编码。 
    忽略 XML 声明中的编码特性。 
    如果未使用 contentType 指定字符集,则使用 XML 声明中的编码特性。 
    如果未指定 XML 声明中的 contentType 字符集参数或编码特性,则此消息将作为 UTF-8 进行处理。 
    与 WebLogic Server 一样,WebLogic Workshop 也根据此规范进行操作。因此,对于使用 HTTP/SOAP 来调用 WebLogic Workshop 开发的 Web Service 的客户端,请确保指定了正确的 contentType 字符集。发送 SOAP 消息WebLogic Server 生成的所有 HTTP/SOAP 消息都以 UTF-8 编码。在生成过程中,会将“encoding=UTF-8”添加到 SOAP 消息的 HTTP 头中。注意:以英语区域(locale)设置(例如在 UNIX 中指定 LANG=C)启动 WebLogic Server 时,在 SOAP 消息中只能使用 us-ascii 字符,不支持其他字符。如果要在 Web Service 中使用简体中文字符,请使用简体中文区域(locale)设置启动 WebLogic Server。如果要在以英语区域设置启动的 WebLogic Server 上使用 us-ascii 之外的其他字符,请在 WebLogic Server 启动脚本文件中设置下列启动选项。这甚至可以使 WebLogic Server 在英语区域设置环境中以 UTF-8 生成消息。注意:对于 SOAP 消息,强烈建议使用 UTF-8。-Iweblogic.webservice.i18n.charset=utf-8
    Web Service 主页Web Service 主页是以服务器 VM 默认编码生成的。UDDI 浏览器UDDI 浏览器只支持 us-ascii 字符。它不能正确处理多字节字符。XML --- StreamParser 中的多字节字符处理要将编码信息添加到使用 XML 流 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 文档的说明。当通过流为解析器提供输入时,请使用字节流。这可以启用解析器的 XML 编码自动检测。解析器可以生成字符流,该字符流使用由 XML 声明中的编码特性指定的编码,从而确保能够进行正确的解析。当通过 Unicode 字符流提供输入时,解析器将忽略 XML 头中的编码设置。在这种情况下,用户负责提供适当的字符流。JDBC设置 WebLogic jDriver for Oracle 的使用环境要使用 weblogic.jdbc.oci.Driver,请按如下所示设置环境。请注意,需要设置 jDriver 许可证。将下列更改添加到 startWebLogic.cmd 文件。
    指定 Oracle 的 bin 目录的路径和 WebLogic Oracle Oci 驱动程序本地库的 bin 目录的路径。请根据 Oracle 版本使用相应的 Oci 驱动程序。对于 Oracle 8.1.7:%WL_HOME%\bin\oci817_8;d:\oracle\ora81\bin对于 Oracle 9.0.1:%WL_HOME%\bin\oci901_8;d:\oracle\ora90\bin指定 Oracle 环境变量 NLS_LANG。
    NLS_LANG 的编码与 weblogic.codeset(jDriver for Oracle 的连接属性)的编码必须始终相同。NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    有关 NLS_LANG 与 weblogic.codeset 之间的关系的信息,请参阅“Configuring and Using WebLogic jDriver for Oracle”中的 Advanced Oracle Features。如果可以指定下列编码:为 Oracle 数据库指定 ZHS16GBK、为 NLS_LANG 指定 SIMPLIFIED CHINESE_CHINA.ZHS16GBK 以及为 weblogic.codeset 指定 MS936,则 Windows 平台上使用的字符集可以存储在 Oracle 数据库中。现在,无需使用 WebLogic Server 的连接池,即可使用 WebLogic Server jDriver for Oracle。例如,可以直接从 JDBC 客户端(如 JSP 或 Servlet)连接到数据库。有关当 JDBC 客户端使用 WebLogic Server jDriver for Oracle 时的编程信息,请参阅“Configuring and Using WebLogic jDriver for Oracle”中的 Connecting to an Oracle DBMS。如果使用连接池,需要在管理控制台中进行下列设置。有关如何设置连接池的详细信息,请参阅“Installing and Using WebLogic jDriver for Oracle”中“Installing WebLogic jDriver for Oracle”一章的 Setting Up a Connection Pools 部分。下面是设置样例。管理控制台
    设置连接属性。URL:
    jdbc:weblogic:oracle
    Driver Class Name:
    weblogic.jdbc.oci.Driver
    Properties:
    user=scott
    password=tiger
    server=ora81
    weblogic.codeset=MS936
    选择要在目标中使用的服务器或群集。 重新启动 WebLogic Server。 
    现在即可使用 WebLogic Server jDriver for Oracle。设置 Oracle Oci 驱动程序的使用环境将下列更改添加到 startWebLogic.cmd 文件。
    将下列内容添加到 CLASSPATH 环境变量:d:\oracle\ora81\jdbc\lib\classes12.zip;d:\oracle\ora81\jdbc\lib\nls_charset12.zip
    将下列目录添加到 PATH 环境变量:c:\oracle\ora81\bin
    现在,无需使用 WebLogic Server 的连接池,即可使用 Oracle Oci 驱动程序。例如,可以直接从 JDBC 客户端(如 JSP 或 Servlet)连接到数据库。有关当 JDBC 客户端使用 Oracle Oci 驱动程序时的编程信息,请参阅 Oracle 文档。如果使用连接池,需要在管理控制台中进行下列设置。下面是设置样例。在管理控制台中设置下列内容:
    设置连接属性。URL:
    jdbc:oracle:oci8:@ora81
    Driver Class Name:
    oracle.jdbc.driver.OracleDriver
    Properties:
    user=scott
    password=tiger
    选择要在目标中使用的服务器或群集。 重新启动 WebLogic Server。 
    现在即可使用 Oracle Oci 驱动程序。设置 Oracle 瘦驱动程序的使用环境对于瘦驱动程序,不需要指定 NLS_LANG 环境变量。将下列更改添加到 startWebLogic.cmd 文件。
    将下列内容添加到 CLASSPATH 环境变量:d:\oracle\ora81\jdbc\lib\classes12.zip;d:\oracle\ora81\jdbc\lib\nls_charset12.zip
    将下列目录添加到 PATH 环境变量:c:\oracle\ora81\bin
    现在,无需使用 WebLogic Server 的连接池,即可使用 Oracle 瘦驱动程序。例如,可以直接从 JDBC 客户端(如 JSP 或 Servlet)连接到数据库。有关当 JDBC 客户端使用 Oracle 瘦驱动程序时的编程信息,请参阅 Oracle 文档。如果使用连接池,需要在管理控制台中进行下列设置。下面是设置样例。在管理控制台中设置下列内容:
    设置连接属性。URL:
    jdbc:oracle:thin:@jpsol1:1521:ora81
    Driver Class Name:
    oracle.jdbc.driver.OracleDriver
    Properties:
    user=scott
    password=tiger
    选择要在目标中使用的服务器或群集。 重新启动 WebLogic Server。 
    现在即可使用 Oracle 瘦驱动程序。同时连接到编码不同的数据库时的限制使用 OCI 驱动程序时,必须为 NLS_LANG 和 weblogic.codeset 指定相同的编码。如果这些参数设置为相同的值,将在 Oracle 端执行编码转换,因为您是作为具有特定 NLS_LANG 的客户端连接到 Oracle 端的。如果两个参数相同,则无论数据库的编码如何,都能成功进行连接。
      

  2.   

    国际化概述WebLogic Server 中 I18n 的主要特性:在 WebLogic Server 内部,所有字符都按 Unicode 进行处理。只要输入或输出字符数据,就执行代码转换。 
    必须分别为 WebLogic Server、J2EE 组件和 WebLogic Server 容器上的资源指定适当的编码转换。 
    如果不指定编码转换,系统将应用默认的编码转换。 
    存在各种类型的默认编码转换,其中的一些编码转换不符合操作系统的区域设置。 
    在使用 WebLogic Server 生成用于处理多字节字符数据的分布式系统之前,应该了解如何指定有关 Java 和 J2EE 的适当编码。而且,在控制编码转换时,应该适当考虑连接到 WebLogic Server 的系统(例如,操作系统、Internet、后端系统)的编码处理。下面简要描述了 WebLogic Server 中的编码处理。Unicode 的使用WebLogic Server 是一种 100% 纯 Java 应用服务器程序,它使用 Unicode 进行服务器内部编码。这样 WebLogic Server 就能同时处理所有语言的字符(只要 Unicode 能够处理这些字符)。编码转换当 WebLogic Server 与外部交换字符数据时,需要进行编码转换。Unicode 是 Java 的内部编码,而在普通的操作系统中,几乎没有任何环境使用 Unicode,它们使用的是为每个平台单独定义的称为“本地编码”的编码。例如,Windows 系统的本地编码是一个与语言有关的代码页,Unix 系统的本地编码是与用 LANG 环境变量指定的区域设置相对应的编码,数据库的本地编码是在创建数据库时指定的字符集或者由客户端指定的字符集。因此,在 WebLogic Server 中进行输入和输出时,需要进行本地编码与 Unicode 之间的编码转换。当 WebLogic Server 与操作系统或外部资源交换字符数据时,总会发生这种编码转换。注意:序列化的 Java 类流中包含的字符作为(UTF-8 编码的)Unicode 保存在该类的内部信息中。这意味着无需考虑序列化流的代码转换。例如,对于 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 上的资源包括:JDBC 连接 
    WTC 连接等 
    为 WebLogic Server 指定编码时,需要弄清楚要为哪些类别指定编码,然后需要查看是否可以创建有效的 Character 对象,以及 WebLogic Server 中的 Character 对象是否可以正确地转换为所需的编码。如上所述,您应该了解编码转换行为,以便进行正确的设置。如果不指定编码转换,应用程序将无法正确处理多字节字符。如果不指定编码,将使用适合情况的默认编码。默认编码可能因目标的规范或环境而异。默认编码示例影响 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 语言在其 I/O 部分中包括了这些差异,以便可以在其内部以 Unicode 形式处理所有字符。这意味着对于任何字符集来说,只要它的编码定义存在,Java 就可以处理它。Java 基本上可以包括各种系统之间存在的任何编码差异。但是,目前还没有一个编码转换表可以处理目前全部现有编码之间的所有细微差异。同样,现有的编码表存在一些限制,这些限制源自与 Unicode 的一致性问题。在 Java Web 应用程序服务器中,Java 编码名称和 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 映射表。用户不能对这种映射进行自定义。WebLogic Server 主要使用 Java 编码名称来指定编码。J2EE、Internet 或 XML 主要使用 IANA 字符集名称,您可以根据需要修改这种映射。 
    --------------------------------------------------------------------------------安装WebLogic Server 提供简体中文版安装程序和英语版安装程序。两者均可从 BEA Systems, Inc. 网站下载。简体中文版安装程序和英语版安装程序之间的区别在于:就影响 WebLogic Server 行为的程序文件而言,这两个安装程序是相同的,您可以将它们视为具有相同的软件。而且,从英语版安装程序启动的 WebLogic Server 实例和从简体中文版安装程序启动的另一个实例之间没有任何互操作性问题。共性:所有的 WebLogic Server 类文件(weblogic.jar 和其他文件) 
    版本字符串 
    消息目录和管理控制台联机帮助中的语言 
    区别:一些经过翻译的文本文件 
    about_wls/readme.txt/index.jsp 或 html 
    WebLogic Builder 联机帮助 
    简体中文版的 WebLogic Server 8.1 不支持下列功能:智能更新 
    网络安装程序