`
stevezheng
  • 浏览: 78041 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

构建富 Internet 应用程序(5)

阅读更多

将 Web 服务和客户机绑定在一起

既然已经完成了 Web 服务,并布局了富客户机,就必须将它们绑定在一起。本节中有两个例子,展示如何从 OpenLaszlo 客户机调用 Web 服务。

简单的 Web 服务调用

在前一个例子中,楼宇和楼层组合框的内容是从静态位置数据集构建的。尽管这对于布局应用程序来说没有问题,但是它对于长期的维护来说不是一个好主 意。您不想在每次添加一个新的楼宇时都必须更新代码。这可以形象化为一个从 Web 容器加载的 .xml 文件,但是这也似乎有太多的工作需要维护。相反,该列表和其他选择列表有可能来自 Web 服务和数据库。因此,Web 服务具有一个 getBuildings() 操作。

清单 9 是一个调用 getBuildings() 操作的例子。





清单 9. getBuildings() 操作

<dataset name="location" />

<soap name="WorkOrderService"
   wsdl="http://localhost:8080/fms/wsdl/WorkOrderService.wsdl" 
   autoload="true">

  <remotecall name="getBuildings" 
              funcname="getBuildings" dataobject="location">
    <method event="ondata" args="value">
      debug.write(location.serialize());
    </method>
  </remotecall>
  
  <method event="onload">
    WorkOrderService.getBuildings.invoke();
  </method>

  <method event="onerror" args="error">
    debug.write('error:', error);
  </method>      

</soap>

 

XML 已经从位置数据集删除掉了。这现在动态地由来自 getBuildings() 操作调用的 XML 所填充。

接下来,使用 soap 元素定义 SOAP 服务器。这里,您需要给它一个名称和一个到利用 Web 服务生成的 WSDL 的 URL。对于本例来说,自动加载 Web 服务,因为您想要用户一查看页面就填充组合框。

在 SOAP 定义中,也需要在您将要使用 remotecall 元素调用的 Web 服务上声明远程操作。这里,您定义了 getBuildings 操作。name 属性是在执行操作时 JavaScript 引用的本地名称,而 funcname 属性必须匹配 WSDL 中的名称,这与 Web 服务 Java 类一样。dataobject 属性指出将用结果填充哪个数据集。指定前面使用过的位置数据集。

remotecall 中,您可以指定一个 ondata 事件。该事件在 Web 服务返回结果后将被调用。在本例中,您只是将结果写到调试器窗口。这也已经用于填充字段或其他东西。即使写到调试器的这一实现很简单,它仍然很有价值,因 为它是一个强大的工具。有时,Web 服务产生不像 XML 的 XML,最初用于设计用户界面。也很难确定 OpenLaszlo 平台如何解释 XML。这个例子展示了,您如何可以在数据集上调用 serialize 方法,以将 XML 分成良好的 XML 格式。清单 10 是来自 Web 服务调用的例子,这不同于最初用于设计的 XML。


清单 10. 在数据集上调用 serialize 方法以将 XML 分成良好的 XML 格式

<location>
  <getBuildingsReturn>
    <floors>
      <floors>
        <name>Floor 1</name>
        <id>1</id>
      </floors>
      <floors>
        <name>Floor 2</name>
        <id>2</id>
      </floors>
    </floors>
    <name>HQ</name>
    <id>1</id>
  </getBuildingsReturn>
  <getBuildingsReturn>
    <floors>
      <floors>
        <name>Trump 1</name>
        <id>1</id>
      </floors>
      <floors>
        <name>Trump 2</name>
        <id>2</id>
      </floors>
    </floors>
    <name>Trump Tower</name>
    <id>2</id>
  </getBuildingsReturn>
</location>

 

注意几件事情。首先,Web 服务不使用任何属性。每个数据项都是一个元素。其次,location ,即数据集的名称,是最外边的 XML 元素。第三,buildingsgetBuildingsReturn 所取代,后者是用附加到它的单词 Return 所调用的方法的名称。

还有两个其余事件应用于 SOAP 定义而非远程调用。它们是 onloadonerroronload 只是一个调用方法的方便方式,以便在最初查看页面时填充复选框。当然,要让这件事在查看时立即发生,您还需要在 soap 元素上将 autoload 设置为 true 。在 onload 中,在 WorkOrderService 上显式地调用了 getBuildings() 操作。在 onerror 事件中,只将错误消息写到调试器窗口,以便可以看到错误。

 



参数化 Web 服务调用

第二个 Web 服务提交一个新的工作单。这里,调用 createWorkOrder 操作。清单 11 是包含在前一节的 WorkOrderService soap 定义中的定义。


清单 11. 包含在 WorkOrderService soap 定义中的定义

<remotecall name="createWorkOrder" funcname="createWorkOrder">

  <param value="${contact.text}" />
  <param value="${phone.text}" />
  <param value="${email.text}" />
  <param value="${description.text}" />
  <param value="${bl.text}" />
  <param value="${fl.text}" />
  <param value="${severity.value}" />

  <method event="ondata" args="value">
    debug.write('New Work Order ID = ' + value);
  </method>

</remotecall>

 

在本例中,您也在 Web 服务类中用等于 WSDL 和方法中的操作名的 namefuncname 声明了一个远程调用。因为该操作接受参数,所以您应该包含 param 元素。参数的顺序与 Web 服务类 createWorkOrder() 方法签名相同。这里,值引用 edittext 组件和其他组件中的文本。这个 remotecall 也有一个 ondata 事件,用于将新工作单 ID 的返回值绑定到调试窗口。

警告:OpenLaszlo 要求 Web 服务至少返回一个值。它不能只是返回一个 void,或者所调用的 onerror 事件。

要发起对 createWorkOrder 的调用,请添加一个 onclick 事件到按钮,并在 createWorkOrder 远程调用上调用 invoke 方法:

<button isdefault="true" text="Submit" x="350"
onclick="WorkOrderService.createWorkOrder.invoke()"/>




部署到 Apache Tomcat

在完成 Web 服务和 OpenLaszlo 客户机之后,就应该部署应用程序了。

因为 Web 服务 (fms) 和 OpenLaszlo 客户机 (fm) 的输出都是 .war 文件,所以您应该能够将它们部署在任何兼容的 Web 容器或 J2EE 应用服务器上。因为部署是特定于容器的,所以请参考您的容器文档,了解部署应用程序的指令。Apache Tomcat 是一种流行的 Web 容器,所以本节介绍如何将应用程序部署到这一类型的容器。

要在 Windows 中部署到 Apache Tomcat 服务器,请执行以下步骤:

  1. 将导出的 fm.war 和 fms.war 文件复制到 <jakarta-tomcat>/webapps 目录。
  2. 通过执行 <jakarta-tomcat>/bin/startup.bat 脚本启动 Apache Tomcat。

就是这些内容。要测试应用程序,请使用 Web 浏览器导航到 http://localhost:8080/fm/index.lzx。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics