技术开发 频道

Lotus访问Web服务的实践应用

【IT168 技术文档】 Service Platform 简介

     Forms Services Platform 可以使开发人员方便地将 Lotus Forms 产品与其他系统进行集成或扩展产品的功能。比如,您可以用 Forms Services Platform 把 Lotus Forms Designer 和 WebSphere Portal 结合起来,提供从表格的设计到检查到发布的一整套流程。

     Forms Services Platform 提供了一种架构方式和工具包让您定义 moudles 来快速方便地与其他后台的应用程序结合到一起。这些 moudles 是 OSGI bundles,每个 OSGI bundle 包括一些 Pipes(Java 代码)和配置数据(Pipelines)。每个 Pipe 完成一项特定的任务,将这些 Pipes 装配到 Pipeline 中,按照 Pipeline 定义的规则顺序执行每个 Pipe 来完成整个 bundle 的功能。这些 Pipe 可以是 Services Platform 提供好的一些 Pipe,比如将 XFDL 格式的 form 以特定的对象形式读取并保存到内存中等等,也可以是开发人员自定义的一些 Pipe 来完成其他功能,比如用来从互联网上抓取一些新闻信息、发送邮件、调用 Web 服务等等。本文中通过一个例子来演示如何自定义一个 Pipe 实现调用 Web 服务的功能。

环境准备

     对于本文例子需要准备以下环境:

  • Lotus Forms Server API 3.0
  • Louts Forms Services Platform 3.0
  • Louts Forms Services Platform SDK 3.0
  • WebSphere Application Server 6.1
  • Eclipse-3.3.2
  • Axis2_Codegen_Wizard_1.3.0(用来根据 WSDL 生成 Web 服务客户端代码的 Eclipse 插件)

     安装 API 的时候可以选择自动部署 API 到 WebSphere Application Server 的一个 Profile 中,也可以手动部署。此外,还要在 WebSphere Application Server 部署 Services Platform 的应用模块程序(lfsp-3.0.0.X.ear),设置 Services Platform 的 extensions 目录等,详细可以参考产品手册。

实现调用 Web 服务的客户端代码

     本例中我们使用的是一个免费的在线查询国内航班时刻表的 Web 服务,通过输入航班的始发地、目的地和航班时间就可以查询出所有相关的航班信息。下面是访问该 Web 服务的地址:

http://www.webxml.com.cn/webservices/DomesticAirline.asmx?op=getDomesticAirlinesTime

图 1. DomesticAirline Web 服务
图 1. DomesticAirline Web 服务

     该 Web 服务的 WSDL 可以从这个地址获得:http://www.webxml.com.cn/webservices/DomesticAirline.asmx?wsdl

     将它保存到本地文件,命名为 DomesticAirline.wsdl,我们就可以根据这个 WSDL 文件来生成调用该 Web 服务的客户端代码。这里我们使用 AXIS2 提供的 Codegen Eclipse 插件来产生客户端代码。这个插件(Code Generator Wizard - Eclipse Plug-in)可以从http://ws.apache.org/axis2/tools/index.html获得,解压后直接拷贝到 Eclipse 安装目录下的 plugins 目录下,重启 Eclipse 即可。

     以下是详细的操作步骤:

  • 在 Eclipse 中建一个新的 Java 工程,命名 DomesticAirlinePipe,将 DomesticAirline.wsdl 文件保存到工程根目录下。
  • 用快捷键 Ctrl+N,在弹出的窗口中选择 Axis2 Code Generator。如图:

  • 点击 Next,在下一个窗口中选择 Generate Java source code from a WSDL file


  • 点击 Next,在下一个窗口中点击 browser 选择工程中的 DomesticAirline.wsdl 文件。

    图 4. 选择 WSDL 文件
    图 4. 选择 WSDL 文件

  • 点击 Next,在下一个窗口中保留默认设置,直接点击 Next
  • 在下一个窗口中选中 Browse and select a project on current eclipse workspace;然后在 output path 处点 Browse 按钮选择客户端代码保存的工程;选中 Add Axis2 codegen jars to the codegen result project 如图:


  • 点击 Finish,完成客户端代码的生成。
  • 将工程 lib 目录下的 jar 包导入到工程的 build path 中。
  • 右键选中工程,用 F5 刷新就可以看到根据 WSDL 生成的客户端代码,如图:


定义 Pipe

     Pipe 用来完成特定的任务,每个任务都是完成一次请求的小的组成部分。比如,您想将一个 form 中的信息保存到数据库中,您可能需要将这个请求分成几个小任务来完成,包括:将 form 加载到内存中、获取数据库相关信息、完成 form 中的数据和数据库表中的映射,这些小任务都可以由一个 Pipe 来单独完成。

     实现一个 Pipe 需要以下三步:

定义 Pipe 源文件

     定义的 Pipe 源文件(Java 文件)必须继承 PipeImpl 类,类中最重要的方法是 performWork 方法,这个方法中实现了这个 Pipe 完成的具体功能,是最重要的一个文件。

     本例中,我们实现一个名叫 AirlinePipe 的 Pipe 源文件,在 performWork 方法中实现调用航线时刻表的 Web 服务。其中,Web 服务的地址,航班的始发地、目的地、航班日期我们都定义在 Pipeline 的配置文件中,AirlinePipe 中通过 evaluateGet 方法从 dataBucket 中获得这些信息,然后调用 Web 服务,将返回的结果通过 evaluateSet 方法保存到 dataBucket 中,然后由用来显示的 Pipe 从 dataBucket 中获得结果显示给用户。

定义 Pipe activator 文件

     Pipe 的 activator 文件也是 Java 文件,用来在 bundle 启动加载的时候注册 Pipe。该文件必须命名为 Activator.java,需要继承 PipeActivator 类。类中只要实现一个 start 方法来完成 Pipe 的注册,比如注册名为“ibm.samplePipe.AirlinePipe”的 Pipe:

public void start() {
            this.register(AirlinePipe.class,"ibm.samplePipe.AirlinePipe");
            }
            

定义 Pipe manifest 文件

     Pipe manifest 文件用来描述 Pipe 相关信息的,包括 bundle 的名字、Classpath、Activator 文件、Pipe 源文件中需要引入其他类文件的包名等信息。

     经过上面三个步,一个 Pipe 需要的相关文件都准备好了,下面我们就可以用 Ant 将这些文件打成 jar 包,拷贝到 Services Platform 的 extensions 目录下使用。定义好了 Pipe 以后,就要定义 Pipeline,将这个 Pipe 加入到 Pipeline 中。

定义 Pipeline

     Pipeline 是由一系列的 Pipes 组成,它将配置好的 Pipe 实例组装到一个完整的请求处理中。我们需要定义一个 bundle.properties 文件来配置 Pipeline,触发 Headpipe,定义每个 Pipe 执行的顺序等。一个 Pipeline 通常要包括三个分支,分别是 Action Branch、View Branch 和 Error Branch,功能分别是:执行任务完成相应请求、将结果更新给用户显示、仅当某个 Pipe 无法正确执行完毕时触发。

     本例中,我们定义了一个 fsp.sample.airline.properties 文件,Pipeline 的名字定义为 airlinePipeline;这里由 HeadPipe 的 action 指定了首先被触发自定义的调用 Web 服务的 AirlinePipe,该 Pipe 的配置如下:

ibm.samplePipe.AirlinePipe.airlinePipeline.serviceAddr=
            string:http://www.webxml.com.cn/webservices/DomesticAirline.asmx
            ibm.samplePipe.AirlinePipe.airlinePipeline.startCity=string: 北京
            ibm.samplePipe.AirlinePipe.airlinePipeline.lastCity=string: 广州
            ibm.samplePipe.AirlinePipe.airlinePipeline.theDate=string:2007-10-30
            ibm.samplePipe.AirlinePipe.airlinePipeline.output=key:returnValue
            ibm.samplePipe.AirlinePipe.airlinePipeline.pidOutputs.main =
            pipe:ibm.PreserveMapPipe.airlinePipeline
            ibm.PreserveMapPipe.airlinePipeline.keys = string:returnValue
            

     serviceAddrstarCitylastCitytheDate 分别是配置 Web 服务调用的地址,航班的始发站,目的站和航班时间,这些配置信息会由 AirlinePipe 从 dataBucket 中获取。这里的配置表示要查询从北京到广州 10 月 30 日都有哪些航班。查询结果保存到“returnValue”中,再由 View Branch 中的 RestoreMapPipe 负责将查询结果以 xml 格式显示在浏览器中。

实例使用及演示

  • 将压缩包中的工程导入到 Eclipse 中,将工程 lib 目录下的 jar 文件和 Services Platform 安装路径 \redist\development\plugins 下的 jar 文件加入到工程的 build Path 中。工程目录结构如下图:


    注意:工程中已经包含了调用 Web 服务生成的客户端代码,您可以将整个 cn.com.webxml 包下面的文件删除,重新根据上面的介绍生产相应代码,同时在 lib 下面会产生相应的 jar 文件。

  • 编辑 build.xml 文件,根据您的系统 Services Platform 安装路径和设置的 extensions 目录的路径更新“fsp.install.dir”和“fsp.extensions.dir”两个属性。
  • 右键单击 build.xml 文件,选择 Run As >Ant Build。Build 成功完成后会在工程 deployables\extensiosns 目录下生成一个 AirlinePipe.jar 文件。如果您打包的时候选中了 depoly target 那么会自动将 jar 文件拷贝到 Services Platform 设置的 extensions 目录下,否则您需要手动拷贝。
  • 将 Pipeline 的配置文件 fsp.sample.airline.properties 也拷贝到同一个 extensions 目录下。可以手工修改要查询的航班的始发地、目的地和航班时间。
  • 启动部署了 Services Platform 应用模块程序(lfsp-3.0.0.X.ear)的 WebSphere Application Server profile,如果原来是启动的,则只需要重启这个应用模块程序即可。
  • 在浏览器中输入 http://server:port/wfsp/wfsp/airlinePipeline,(server 为机器地址,port 为 WebSphere Application Server 程序访问端口)回车即可看到调用在线航班时刻表查询后返回的结果,如下图:

    图 8. 在线航班时刻表查询返回结果 
    图 8. 在线航班时刻表查询返回结果

        上图中显示了查询 2007-10-30 号从北京到广州的所有航班时刻表,共有 24 个航班,详细显示出了每个航班的所属公司、航班号、出发机场、到达机场、机型、经停和飞行周期(星期)信息。

总结

     本文根据一个具体的例子介绍了如果将 Forms Services Platform 与 Web 服务相结合来扩展 Louts Forms 产品的功能。这里只是简单演示了一下如果 Services Platform 如果调用 Web 服务。当然可以用 Form Designer 设计一个漂亮的表单,里面由用户输入查询信息,稍微修改一下原来的 Pipe,将原来在配置文件中指定查询信息改为从用户提交的表单中获取,查询结果也可以用更友好的方式呈现给用户。

0
相关文章