生成面向 DB2 9 pureXML 的 Web 服务

采用自下而上方法生成面向 XML 数据的 Web 服务的概念验证

Web 服务是实现面向服务架构的重要构建块。随着越来越多的应用程序转向面向服务架构,经常需要将应用程序的功能公开为 Web 服务。本文的目的是展示如何使用一个简单的 Java™ 类生成 Web 服务,该 Web 服务使用 pureXML™ 特性向 DB2® 9 插入和检索 XML 数据。生成 Web 服务并将其部署到 WebSphere® Application Server 上之后,就可以使用 Rational Application Developer (RAD) 内置的 Web services Explorer 或者 XForms 作为 Web 服务客户机来测试 Web 服务。任何可以通过 HTTP Web 服务调用实现 SOAP 的 Web 服务客户机都可以使用这个 Web 服务。

Vijay Bommireddipalli (vijayrb@us.ibm.com), 数据服务器解决方案专家, IBM

Vijay Bommireddipalli 在加利福尼亚州圣何塞市 IBM 硅谷实验室的数据服务器解决方案团队工作,帮助客户和合作伙伴开发 DB2 解决方案。在加入这个团队之前,Vijay 是 Warehouse Manager 开发团队的一名开发人员。他在获得马萨诸塞州立大学达特茅斯分校计算机电子与工程硕士学位后于 2000 年 7 月加入 IBM。



2007 年 11 月 26 日

背景

现在,Web 服务是 SOA 的一个重要组成部分,支持高度解耦的灵活的解决方案。Web 服务可以使用自上而下或者自下而上的方法构建。在自上而下方法中,首先从一个服务规范(例如一个 WSDL 文件)开始,然后实现底层代码以匹配规范。在自下而上方法中,先从一个 Java bean 开始,然后将功能公开为 Web 服务。

IBM 在 DB2 9 中引入了 pureXML 特性,该特性允许在数据库中原生存储 XML 数据。它使得 XML 成为 DB2 中的一级数据类型,XML 类型的列可以在数据库中以原生分层格式存储任何格式良好的 XML。在数据库中以 XML 格式存储数据之后,可以非常高效地查询该数据,因为在运行时无需执行 XML 解析来实现查询计算。然后,可以使用 XQuery、SQL 或者 DB2 提供的任何应用程序开发接口访问和操纵 XML 数据。

XForms 是一种基于 XML 的电子表单技术,它可以将表单数据提交为 XML 数据实例。它是一项 W3C 推荐标准,并且独立于平台和设备。XForms 将数据模型与表示分开,从而允许将用户数据提交为 XML。然后,数据的接收者可以以 XML 实例的形式存储和操纵用户提交的数据。有很多方法可以使用 XForms 提交数据。在这个例子中,我们使用 Web 服务。

使用 XForms 作为终端用户表单,使用 Web 服务作为传输机制,使用 DB2 9 进行存储,这将创建一个真正的端对端 XML 解决方案,这种解决方案可以灵活更改,并且极大减少了开发时间。

请参阅 参考资料 小节,了解有关 DB2 9、XForms 和 Web 服务的更详细信息。

先决条件

为了更好地理解本文中的信息,需要具备以下先决条件:

  • 熟悉 DB2 9 和 pureXML 特性。请参阅本文 参考资料 小节,熟悉 DB2 9 的 pureXML 特性。
  • 具备 RAD 使用知识以及能够使用测试 WebSphere Application Server 环境部署和移除应用程序
  • 熟悉 Web 服务开发的概念

系统需求

服务器端开发

  1. 具有 pureXML 特性的 DB2 9

    也可以使用免费的 DB2 Express-C。DB2 Express-C 可以在至多两个双核 CPU 服务器上运行,服务器上最大内存为 4 GB,任何存储系统设置,没有数据库大小或者任何其它人为限制。参考资料小节提供了 Express-C 的下载链接。

  2. RAD Version: 7.0.0 (或更高版本)

    注意:这个例子详细列出了使用 RAD 附带的内置测试 WebSphere Application Server Version 6.1.0.2 测试输出的步骤。可以选择导出 WAR 文件并部署到一个独立的 WebSphere Application Server (6.1.0.2 版或更高版本)上。这个例子不适用于更低版本的 WebSphere Application Server。

客户端

  • 带 XForms 插件的 Mozilla Firefox 1.5.x 或更高版本(最好是 Firefox 2.0.x)。

    可以从 Firefox Add-ons 页面安装 XForms 插件。 要安装 XForms 插件,使用 Firefox 2.0.x 打开这个 url ,并选择 Install now


过程

总结

这个例子展示如何使用自下而上的方法生成面向 XML 数据的 Web 服务。首先提供一个 Java bean(FormServices.java)的实现。这个 Java bean 包含的数据访问和操纵方法可以操纵 DB2 9 示例数据库的 XML 列中的数据。请参阅标题为 “FormServices.java 解释” 的侧栏,获得对 Java bean 内容的详细解释。然后,使用 RAD 工具将 Java bean 中的那些方法公开为 Web 服务。最后使用提供的 Xforms 测试这些 Web 服务。

我们来逐步讲解这个例子

  1. 创建示例数据库和 xmlcustomer 表
    1. 创建一个代码页为 UTF8 的示例数据库(如果不存在该数据库的话),例如:
       db2 create db sample using codeset UTF8 territory US

      DB2 9 使用 UTF8 数据库代码页,以便创建 XML 数据类型列。

    2. 在 DB2 命令提示符下,使用以下命令创建 xmlcustomer 表:
      connect to sample
      CREATE TABLE XMLCUSTOMER( CID  INT NOT NULL PRIMARY KEY, INFO  XML )

      XML 列 INFO 可以存储任何格式良好的 XML。

      可以在 DB2 命令提示符下输入以下命令,试着插入 test:

      insert into xmlcustomer values ( 9999, '<test/>');
  2. 启动 RAD 并创建一个 “Dynamic Web Project”。
    1. 确认在 Web 透视图中执行操作。(否则,请选择 Window > Open Perspective > Web 以打开 Web 透视图。)
    2. 输入 “XForm” 作为项目名称(大小写敏感)。
    3. 使用默认设置,单击 Finish
图 1. 创建一个 Web 项目
Web 项目设置
  1. 导入本文提供的 Java 源代码文件,并进行必要的更改
    1. 展开前面创建的 XForm 项目,直到看到 Java Resources 文件夹。
    2. 单击右键并选择 New > package。 指定 "com.ibm.test" 作为包名,然后单击 Finish
图 2. 创建包
如何创建包
  1. 在刚才创建的包上单击右键,选择 Import > File System,导入 FormServices.java (本文提供的 Java 源代码)。

FormServices.java 解释:

Java 源代码 FormServices.java 由两个类组成:

  • DB

    这个类处理数据库连接。注意,为了让这个类顺利运行,必须针对自身的环境对它作出适当更改。

  • 方法:

    connect:允许应用程序代码连接到 DB2 数据库。connect 方法使用 type 4 Java Database Connectivity (JDBC) 通用驱动器。

    disconnect:断开应用程序与数据库的连接,并释放 JDBC 资源。

  • FormServices

    这个类包含用于操纵数据库中的数据以及检索将在表单中显示的数据的方法。这些方法被公开为 Web 服务。有 3 个基本方法可用于操纵 XML 数据。这 3 个方法还可以用于将 XML 数据当作字符串来处理。这些方法是:

  • 方法:

    insertFormData:该方法获取输入的 XML 数据,并将 XML 数据存储在 DB2 数据库的 XML 列中。注意,XML 输入应该是 XML 数据(例如像 &lt; 这样的未转义的字符串)。

    retrieveFormData:该方法根据一个惟一键检索 XML 列中存储的表单数据。

    retrieveFormIDs:该方法检索表单 id,并以符合 XML 格式的方式返回给 XForm。可以使用该方法生成表单中的下拉菜单。

    还有 3 个 *AsString() 方法实际上与前面 3 个方法相同,但是这 3 个方法并没有在线路上传输 XML,而是将 XML 转换为字符串。所以 <hello/> 就变成 “&lt;hello/&gt;”。这里提供了这些便利方法,您可以使用内置的 Web service explorer 进行测试。

    genSOAPElement:这是一个辅助方法,用于将 payload 从字符串转换为 SOAPElement。

    genStringfromSOAP:这是一个辅助方法,用于将 payload 从 SOAPElement 转换为字符串。

图 3. 导入示例代码 FormServices.java
导入 Java 源代码
    1. 搜索模式 //Change,必要时根据自身环境作出更改。代码中的注释可以指导您进行更改。
    2. 如果您遵循了前面的步骤,那么在 Database 类中惟一需要更改的是 userid 和 password,同样由模式 //Change 标出。
    3. 确保整齐地编译代码,并且解析所有导入。这需要将 db2jcc.jar 添加到 XForm 项目的 Java Build Path 中。
    4. 要添加外部 jar db2jcc.jar,在项目上单击右键,选择 Properties > Java Build Path > Add External Jars >,然后从 DB2 installation (\sqllib\java) 中选择 db2jcc.jar
    将编译后的 Java 代码公开为 Web 服务
    1. FormServices.java 上单击右键,然后单击 Web Services > Create Web Service。如果没有看到 Web Services 菜单,请继续阅读下面的内容,了解如何启用该菜单。
    2. 如果没有看到 Web Services 菜单。可能需要启用工作台的 Web 服务功能。为此,单击 Windows > Preferences > Workbench > Capabilities,确保 Web Service Developer 被启用。
图 4. 根据 Java 源代码生成 Web 服务
根据 java bean 生成 Web 服务
  1. 确认设置如下图所示。在弹出的警告窗口中单击 OK

    注意:服务生成之后,RAD 工具将不同的 Java 数据类型映射为 JAX-RPC 规范中定义的相应的 XSD 类型。IBM WebSphere SOAP 引擎将 Java bean 中的 javax.xml.soap.SOAPElement 数据类型映射为 WSDL 中的 XML 模式 xsd:anyType。但是,JAX-RPC 规范目前还没有定义针对 xsd:anyType 的标准 Java 映射。JAX-RPC 实现并不是支持 xsd:anyType 所必需的。这个例子在其它 SOAP 引擎上可能不能运行,而且也没有在其它 SOAP 引擎上测试过。

图 5. 检查 Web 服务设置
检查 Web 服务设置
  1. 单击 Next,直到看到一个可选择需要启用的服务的菜单。确保所有服务都被选中以公开为 Web 服务,然后单击 Finish

    注意:单击弹出的警告窗口上的 OK 按钮(相关解释见前面的注意事项)。

故障检修技巧

XForms:

如果单击 “Submit” 后没有反应:

  • 在 Firefox 上,选择 Tools > Java script console,看看是否有样式表错误以外的错误。
  • 如果看到 XForms Error (14): Security check failed! Trying to submit data to a different domain than document 错误:

    默认情况下,Mozilla 的 XForms 扩展不允许跨域提交。请访问此 url ,了解更多细节。为启用跨域提交,找到一个名为 “hostperm.1” 的文件,将 "host xforms-xd 3 scheme:file" 这一行添加到该文件中。(应该可以看到与这一行类似的其它行。)我的 hostperm.1 是在 C:\Documents and administrator\Application Data\Mozilla\ Firefox\Profiles\m6g6ho0d.default 目录下,但是您的路径可能有所不同。然后重新启动浏览器。

WebSphere Application Server

如果 XForm.war 应用程序还没有启动,请检查系统日志。在 Microsoft® Windows 系统上,默认位置为 C:\Program Files\IBM\SDP70\runtimes\base_v61\profiles\AppSrv01\logs\server1。

高级故障检修:

判别服务器问题还是客户机问题的一个好方法是查看从 xform 发送到 WebSphere Application Server 的内容。这可以使用一个像 https://tcpmon.dev.java.net/ 这样的 TCP 监视器来完成。

将 XForms 提交操作重定向到一个新的、运行 TCP 监视器的端口号,令 TCP 监视器将传入的消息定向到服务器。

例如:

将服务器指向 localhost:9081,在 localhost:8080 上运行 TCP 监视器。将示例 xform 中出现的所有 localhost:9081 改为 localhost:8080。这样一来,所有提交将通过 TCP 监视器来发送,这个监视器将显示所发送的内容。

确保防火墙没有阻塞任何通信。

图 6. 选择要公开为 Web 服务的方法
选择要公开为 Web 服务的方法
  1. 如果看到提示,则单击 Start Server。生成的服务将被发布在内置的 WebSphere Application Server 测试服务器上。
  1. 在内置的测试 WebSphere Application Server 上运行 XForms
    1. 在测试 XForms 应用程序之前,应确保正确安装了必要的 JAR 文件,以便使用 JDBC type 4 驱动器连接到 DB2。
      1. 进入 WebSphere Application Server 的安装目录,检查是否存在以下文件:db2jcc.jar,db2jcc_license_cu.jar。 (例如,在这个例子中,我必须在 “C:\Program Files\IBM\SDP70\runtimes\base_v61\lib'” 目录下安装这些 JAR 文件。)
      2. 如果该目录下没有这些 JAR 文件,则复制这些 JAR 文件到该目录,并重新启动 WebSphere Application Server 系统服务器。
    2. 在使用前面步骤创建的 Web 服务运行 XForms 之前,还需要在同一个 WebSphere Application Server 上安装 SOAPForwarding servlet。本文的 下载 小节中提供了这个文件(SOAPResolution.war)。

      这个步骤只是一个弥补措施,因为 Mozilla 的 XForms Add-on 目前不能进行有效的 SOAP 调用。如果 Mozilla XForms Add-on 以后的版本修复了这个缺陷,那么就不需要这个步骤。在撰写本文之际,使用 Firefox Xforms Version 0.7.0.1 的 Web 服务调用会丢失 SOAPAction 报头。SOAPForwarding servlet 只是添加这个必需的 SOAPAction 报头。

      1. XformEAR 上单击右键,选择 Import > war file
      2. 浏览文件系统,选择 SOAPResolution.war 文件。Web 项目的名称应该会自动填充,如下图所示。确认它被添加到已有的 XFormEAR 项目中。
图 7. SOAPResolution WAR
导入 SOAPForwarding Servlet
  1. 单击 Finish 导入该 servlet。
  1. 使用 RAD 内置的 Web Services explorer 测试 Web 服务
    1. 至此,您已经成功地部署并启动了应用程序,现在可以测试所部署的服务了。
    2. 在 RAD 中,在生成的 FormServices.wsdl 上单击右键,选择 Test with Web services explorer
  1. 如下图所示,指定端点和正确的端口号,测试任何以 *AsString 结尾的方法。 。 在这个例子中,有 3 个以 *AsString 结尾的方法,这 3 个方法以转义字符串的形式返回 XML。大多数浏览器都偏爱转义字符串形式的 XML(&lt; 而不是 “<” )。 但是,XForms 则偏爱实际的 XML 值。其它 3 个方法(没有 *AsString)在功能上与以 *AsString 结尾的方法相同,只不过这 3 个方法返回实际的 XML 数据。
图 8. 使用 Web services explorer 测试 *AsString 服务
使用 Web services explorer 测试 *AsString 服务
  1. 使用 XForms 测试 XML Web 服务
    1. 启动 demo 附带的 XForms。

      xmlcustomer.xhtml 文件上单击右键,选择 Open with Firefox。这个步骤假设您已经按照本文 先决条件 小节的要求安装了 XForms 插件。这时应该可以看到下面的屏幕截图所示的 XForm。

    2. 完成一些必要的工作,例如指定惟一的 “Id Val”,输入/修改名称,等等。
    3. 使用 xmlcustomer Form,在 Id Val 字段中指定一个惟一的 ID,并单击 Submit

      这里指定的 Id Val 在 DB2 中的 XMLCUSTOMER 表的 CID 列中应该是惟一的。

    4. 当单击 Submit 时,XForm 对 insertFormData 服务进行 Web 服务调用,将表单的用户数据以 XML 实例的形式插入到 DB2 中。

      如果发生错误,或者没有反应,请参阅 “故障检修技巧” 小节,查找可能的原因和相应的建议。

图 9. 使用 xform 测试插入服务
使用 xform 测试插入服务
  1. 如果没有发生错误,应该可以看到检索表单。指定 insert 语句中指定的 ID,单击 Retrieve
  2. 这时,该 xform 对 retrieveFormData 服务进行 Web 服务调用,从 DB2 检索 XML 实例形式的用户数据,并将其映射到 xform。
图 10. 使用 xform 测试检索服务
使用 xform 测试 Web 服务

结束语

您看到了如何在 DB2 pureXML 中按照自下而上的方法生成面向 XML 数据的 Web 服务。通过 HTTP Web 服务实现 SOAP,这些服务可以向 DB2 9 存储和检索 XML 数据。这些服务可以以转义字符串或实际 XML 的形式在线路上插入和检索 XML。可以根据特定需要修改 Java 源代码,任何方法都可以公开为 Web 服务。这些 Web 服务可以作为任何通过 HTTP 调用实现 SOAP 的客户机的端点,实现向数据库检索和存储数据。


致谢

感谢 Michael Schenker、Keith Wells、Jan Kratky、Cindy Saracco、Sal Ledezma 和 Matthias Nicola 为本文提供的帮助和对本文的审校。

参考资料

学习

获得产品和技术

  • 下载 DB2 Express-C:免费构建、部署、分发……实现所有功能。
  • 下载 DB2 Enterprise 9 的免费试用版。
  • 下载 IBM 产品评估版,获得来自 DB2、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, XML, SOA and web services
ArticleID=271100
ArticleTitle=生成面向 DB2 9 pureXML 的 Web 服务
publish-date=11262007