使用 Rational Application Developer 来创建和测试 IBM iWidget

Rational Application Developer 现在包含了创建,编辑,部署和测试 iWidget 的工具

Comments

基于浏览器组件模型的窗口小部件(widget)

术语“窗口小部件(widget)”可以指不同的事情,但是在软件开发的背景下其最常见的定义,widget 是一种可重用的构件。尽管我们可以从 Dojo Toolkit、Swing Set、Standard Widget Toolkit 或者 Abstract Window Toolkit(AWT)中创建窗口小部件,但是这些窗口小部件需要一个可以让它们运行的框架。例如,Dojo widget 必须依赖于核心 Dojo 库才能运行。

还有另外一种类型的窗口小部件可以部署、嵌入到任意的 Web 应用程序中,并在不同的浏览器中运行。这些基于浏览器的构件模型封装了 Web 内容,并且可以在内容展现框架中使用。它们还可以在构建情境应用程序或者典型的混搭环境中进行重用。

这些构件可以作为您所创建的 Web 内容的集合体。任何产生 Web 内容的技术,例如 servlets、JavaServer™ Pages(JSP)、HTML、PHP、CGI 等等都可以得到集成到一起。构件只提供了一个规范,而描述器则会依据该规范。描述器包含了 Web 内容,并允许它位于另一个可以展现 Web 内容的程序之中。

尽管可重用的本质在这些窗口小部件构件之间是共同的,但是实际上它们还提供了其他特性的丰富集合,这些特性对于它们自身来说可能是独一无二的。因此只有当用于运行这些窗口小部件的容器被部署到应用程序当中时,才可以使用这些特性。

有三种这种类型的构件模型,下面按照其流行的程度进行降级排列,但是这不涉及到该特性的丰富性及其技术的先进性问题:

  • OpenSocial gadget
  • IBM® iWidget
  • OpenAjax mashable widget

在所有这些窗口小部件的核心部分其实就只是一个 XML 文件。JavaScript、CSS、JSP 等等都支持这些窗口小部件的规范。例如,这些文件(widget)可以作为一个 WAR(网络档案)文件部署到服务器 A 上。XML的 URL 地址(位于服务器 A 上)随着服务器 B 上的窗口小部件容器一起注册。服务器 C 上的另一个应用程序现在就可以使用 <script> 标签来在其应用中嵌入这些 widget。

OpenSocial gadget

OpenSocial gadget 与 Google gadget 之间有渊源关系。Google Maps gadget 是目前最流行的窗口小部件之一,无所不在。这就是一个部署在 Web 应用程序上,但是其窗口小部件却由其他程序嵌入或再重用的一个很好的范例。Google gadget 最初的一个规范现在已经落伍了。于是 Google 联合其他公司组成了 OpenSocial Foundation(IBM 也是该协会的一个成员),它拥有一个新的核心窗口小部件规范。OpenSocial gadget API 是对既有核心 gadget API 的一种扩展。

Gadget 在一个 gadget 容器内部运行。Apache Shindig 是一个 OpenSocial 容器,这意味着它可以运行 OpenSocial gadget,以及核心 gadget。许多开放社区网站,例如 Orkut 和 hi5,都有它们专属的 OpenSocial 容器。与旧有的 Google 容器相类似,许多的 OpenSocial 窗口小部件(gadget)也是自由开发的,是全世界用户心血的结晶。代码清单 1 显示了一个简单的 Hello World gadget 范例。

清单 1. Hello World gadget
<?xml version="1.0" encoding="UTF-8" ?> 
<Module> <ModulePrefs title="hello world example" /> <Content type="html"> <![CDATA[ <script type="text/javascript" src="optional.js" /> <script type="text/javascript> function dummy() { }; </script> Hello, world! ]]> </Content> </Module>

IBM iWidget

IBM iWidget 是一个企业级的跨浏览器构件模型,提供了丰富的特性集合。它们遵从 IBM iWidget 规范。iWidget 需在一个 iWidget 容器内运行。IBM® Lotus® Mashup Center 可以用于创建混搭(mash-up)的情境性程序(页面组合了两个或更多的程序或者窗口小部件)。混搭页面可以使用 iWidget 和 OpenSocial gadget 来创建。iWidget 可以联接到一起,这样它们之间就可以交换数据了。代码清单 2 显示了一个简单的 Hello World iWidget 的范例。

清单 2. Hello World iWidget
<?xml version="1.0" encoding="UTF-8" ?>
<iw:iwidget id="helloWorld" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:iw="http://www.ibm.com/xmlns/prod/iWidget" 
supportedModes="view" mode="view" lang="en">
  <iw:resource src="optional.js" id="jsId" />
  <iw:content mode="view">
    <![CDATA[
      <div>Hello World</div>
    ]]>
  </iw:content>
</iw:iwidget>

许多的 IBM 产品,例如 WebSphere® Application Server Business Process Monitor 和 Lotus® ConnectionPlace,包含了一个 widget 容器。这使得 iWidget 可以在这些产品内部使用。

Lotus 已经发布了 Mashup Builder 2.2 版本,它可以运行基于 iWidget v2.0 规范的 iWidget。

目前只有很少的开发工具可以用来开发 iWidget,复杂的程度与特性都有所不同,例如以下这些工具:

  • Lotus iWidget Factory
  • sMash from Project Zero
  • Domino Designer V8.1 版本
  • IBM® Rational® Application Developer V7.5.4 版本或者后续版本

Rational Application Developer 的 iWidget 工具与该软件中的其他工具可以集成到一起,以开发 JavaScript、JSP 等等。一个 iwidget 入门开发人员可以使用该工具中的 iWidget 编辑器,来帮助确认和校正错误,而一个高级的开发人员可以发现工具为 JavaScript 文件所提供的 Dojo 和 iWidget API 辅助内容提示(content-assist )和预输入(type-ahead)特性十分的有用。同样,高级的开发人员会发现对所生成的 iWidget 文件的粒度控制和调整功能使用起来很方便。

在 Rational Application Developer 中创建和编辑 iWidget 之后,开发人员可以使用集成的 iWidget 客户端来测试 iWidget。该测试客户端消除了对一些产品的需要,例如 Lotus Mashup Builder、WebSphere Application Server Business Process Monitor 或其他包含有 widget 容器的软件。开发人员可以快速和轻松地处理所测试的 iWidget,然后在任意产品中使用它们。测试客户端可以用于在不同规模不同模式下测试 iWidget 标记和展现形式,测试 iWidget 联接,以及 iWidget 的事件处理器。

OpenAjax mashable widget

OpenAjax Alliance 想要将 Ajax 开发过程标准化。IBM 就是该协会同盟的基础成员。OpenAjax Metadata 1.0 的最终规范已经得到了通过和发布。协会维护了一个与 OpenAjax Metadata 1.0 相关的开放源码参考实现和为多种实现技术准备的测试套件。在这个版本里,这一开放源码项目提供了:

  • 一个规范的语言方案,以 RELAX NG 压缩语法表达
  • OpenAjax Widget 载入器的一个客户端的 JavaScript 实现方案
  • 范例 OpenAjax widget
  • 一个混搭编写的环境,它包含了 OpenAjax Widget 载入器,并使用 OpenAjax Hub 2.0 作为安全的混搭框架,在这里 widget 都被隔离在独立的沙箱中
  • API 元数据转化器,例如将带有 JSDoc 评论的 JavaScript 文件转化为 OpenAjax API 元数据

在 IBM Mashup Center 的 iWidget 容器中使用了 OpenAjax Hub 2.0。

创建一个 iWidget

在本文前面的章节之中,您已经学到了不同类型的窗口小部件,例如 Dojo widget、OpenSocial gadget、IBM iWidget 以及 OpenAjax widget。在这一节中,您将会使用 Rational Application Developer 中的工具来创建一个 iWidget。

从 Rational Application Developer V7.5.4 版本开始,提供了工具来创建,编辑和测试 iWidget。

创建一个带有 iWidget facet 的 Web 项目

您可以在一个静态的 Web 项目中,也可以在一个动态的 Web 项目之中创建一个 iWidget。

  1. 在 Rational Application Developer 中,选择 File > New > Project,并开始创建一个项目。
  2. 填入项目名称,并将项目定位到一个您想使用的合适的服务器运行时。
  3. 接下来,选择您想要的任意配置,或者只是简单地使用默认配置。
  4. 点击 Modify 按钮来添加或者删除 facet。该按钮位于 Configurations 下拉菜单的右边(参见图 1)。
图 1. 创建新的动态 Web 项目
New Dynamic Web Project 向导
New Dynamic Web Project 向导
  1. 在列表之中找到 iWidget facet,并选择它旁边的复选框(参见图 2)。
  2. 点击 OK 以返回到项目创建向导。
  3. 然后点击 Finish 以退出项目创建过程。
图 2. 添加 iWidget 面
Project Facets 视图
Project Facets 视图

图 2 的大图

在您的项目之中创建一个 iWidget

  1. 在 Enterprise Explorer 中选择您的项目并右击选择的项目。
  2. 从下列菜单中,选择 New > iWidget (图 3)。
图 3. 启动 iWidget 向导
显示下列菜单之上的选择
显示下列菜单之上的选择

图 3 的大图

New iWidget 向导将会打开,如图 4 所示。

图 4. 向导之中的“Create a new iWidget”视图
为 Simple widget 选择 widget 类型
为 Simple widget 选择 widget 类型

所建议的默认 iWidget 名就是项目的名称加上一个自动递增的数字。您可以将其更改为任意您所喜欢的值。您还可以对您的 widget 名添加文件的类型,如 .xml;或者不,根据您的习惯爱好进行设置。

源文件夹就是创建 iwidget 的文件夹。该区域的默认值就是您在 Enterprise Explorer 中所选择的文件夹的名字,您右击它就可以启动该向导,但是只是当该文件夹是项目网络根源下有效的文件夹时,上述才会发生作用。如果它不是一个有效的文件夹,那么项目的 Web 根文件夹就是预定义的。通常条件下,默认值就是“WebContent”。

注意:
您可以更改源文件夹的名字,并使用它旁边的 Browse 按钮,来浏览源文件夹。您不能够在 WEB-INF 或者 META-INF 目录中创建一个 widget。验证检查将会找到并标记这样的错误。

iWidget 类型的下拉菜单向您提供了四个模板的选择,以选择开始创建 iWidget。模板使您得到了 iWidget XML 以及 JavaScript 的拷贝。您可以从这个版本中得到四个模板:

  • 简单的 iWidget:一个没有任何 JavaScript 的 Hello World iWidget
  • 事件发布 iWidget:一个发送数据事件的 iWidget
  • 事件订阅 iWidget:一个带有接受数据事件的 iWidget
  • 带有 JSP 内容的 iWidget:一个在外部性 JSP 文件中所定义的 iWidget。JSP 文件是由 Ajax 插入到 iWidget 中去的。该类型并没有显示在一个静态的 Web 项目之中。

Edit 复选框向您所创建的 iwidget 添加了一个称为“edit(可编辑)”的模式。而所谓的 模式(mode) 就是 iWidget 在运行时所渲染的一段标记。当 iWidget 正在运行时,您可以在模式之间进行切换以显示不同的标记。有些模式并没有什么标记(或者被隐藏了),然而它可能还会处理背景中的一些内容。一个 iWidget 拥有很多种的模式。“view”视图是默认的,也是唯一需要的模式。“edit”模式是另一种常见的模式。您可以在创建 iWidget 之后,定义任意数量的通用模式。

  1. 现在您可以点击 Finish 以让 Rational Application Developer 创建您自己的 widget。

以下的工件会得到创建:

  • iWidget XML 文件:这就是 widget 定义文件。
  • JavaScript 文件:该文件 dojo 声明了您的 iWidget 对象位于 iContext 的范围之中。它包含了 widget 预定义事件的存根。它不是为向导中的简单 iWidget 类型而创建的。
  • JSP 文件:它只是为向导中的“iWidget with JSP content”模板类型创建。它用于显示 JavaScript 是怎样引用其他资源的。
  • catalog.xml 文件:该文件是首次创建,然后为每次 iWidget 而更新的。它包含了每一个 iWidget 的条目。当 iWidget 被部署到一个 Mashup Center 中时会使用到它。
  • mashup.properties 文件:这定义了 iWidget 的背景来源以及构件名。Mashup Center 会使用到它。

编辑一个 iWidget

您从模板所创建的 iWidget 只是一个存根。本章节将会向您介绍 iWidget 编辑器。它提供了一种编辑 iWidget 描述 XML 的简易方式,并由此来添加,删除,或者更改它的功能。编辑器会执行一些源代码(Source)视图项所不能执行的确认操作。

使用 iWidget 编辑器

iWidget 一旦得到创建,那么 XML 就会在 iWidget 编辑器中得到创建。默认条件下,iWidget XML 文件总是会在该编辑器中打开(参见图 5)。

图 5. iWidget Editor 视图
编辑 iWidget 定义的表格
编辑 iWidget 定义的表格

图 5 的大图

i18n 警告

该编辑器中的标签对应于 iWidget XML 之中的元素与属性名。因此,该编辑器中没有标签会被转化。

编辑器左边的树显示了 iWidget XML 内部的 DOM 元素。右边的输入框显示了树中所选择的元素的属性。

需要区域的标签被标记上了一个星号。您可以点击 Add 按钮打开 Add Item 选择窗口来向树添加元素(图 6)。

图 6. Add Item 视图
选项的列表,选择的 Content
选项的列表,选择的 Content

非常重要:
至少需要一个 Content 元素,同时还需要一个 View 视图。

iWidget 规范需要 iWidget 至少拥有一个 Content 元素,而该元素必须将其模式属性设置为 View。简单来说就是,一个 iWidget 必须拥有 View 模式。如果 View 模式被删除了,那么编辑器就会标记上一个错误(参见图 7)。

图 7. 当所有 Content 元素都被删除时出现的错误(View 模式是必须的)
错误信息的范例
错误信息的范例

图 7 的大图

模式必须是独一无二的

模式用于指定不同的标记。不同的模式可以通过添加更多的内容元素来进行创建。当您添加一个新的内容元素时,在树中将其选择,然后您就会在右边看到它的属性了。您可以为模式属性输入名字,或者使用 Set mode 帮助文件。对于这里的范例,您可以点击 Set mode 帮助器。

图 8. Set Mode 视图
设置一个新模式,iWidget Editor 窗口
设置一个新模式,iWidget Editor 窗口

图 8 的大图

模式在 XML 文件中必须是独一的。如果这条限制规则受到破坏,那么就会出现一个错误。

图 9. 如果模式不唯一的话会出现的错误
小错误提示框
小错误提示框

图 9 的大图

所有定义的模式必须列在 supportedModes 属性之中

  1. iWidget 定义 XML 中所有的模式应该列作一个字符串,由一个空格隔开,列在根元素的 supportedModes 属性中(参见 图 5 中标为“Supported Modes”的区域)。

一旦创建了一个新的模式,那么编辑器就会提醒您去同步化 Supported Modes 区域了(图 10)。

图 10. 同步化 Supported 模式提醒信息
Supported Modes 必须列出所有定义的模式
Supported Modes 必须列出所有定义的模式

图 10 的大图

  1. 点击 Supported Modes 旁边的 Update 按钮,来查看列表中显示的新模式。
  2. Mode 区域就是一个下拉菜单,显示了 iWidget XML 中所定义的所有模式。选择您想要让 iWidget 使用的模式。默认条件下,该模式就是 View 模式。

测试一个 iWidget

在这一部分中,您要导入一个包含在 Rational Application Developer 之中的示例 iWidget,并在 Rational Application Developer Universal Test Client for iWidget 上运行它。iWidget 实际上是要在含有 iWidget 容器的 IBM Mashup Center 或者 IBM 产品中运行。但是测试客户端提供了一种与之类似的环境,iWidget 可以在此环境下运行。

测试客户端可以用于测试 iWidget 的以下特性:

  • 标识与渲染
  • 模式切换
  • 事件处理
  • 事件发布
  • 事件订阅

注意:
我们为该例部署 StockWidgetSample 应用程序的原因在于,它拥有一个完整的 iWidget 范例。Universal Test Client 所有的特性,通过一个完整的 iWidget 来可以得到更好地研究和理解。

设置

导入程序

将 StockWidgetSample.zip 文件导入到 Rational Application Developer (查看 下载部分)。

创建一个服务器

如果您没有用于部署所创建的服务器实例,那么现在您就必须创建一个实例。

  1. 点击 Servers 项并切换至 Servers 视图。
  2. 右击视图内并选择 New
  3. 在弹出的向导之中,展开 IBM 组,并选择 Ajax Test Server(ATS)。
  4. 然后点击 Finish

注意:
Ajax Test Server 只能从 Rational Application Developer V8.0 版本或者后续的版本中获得。对于 Rational Application Developer V7.5 版本,您可以使用 Basic 类别或者其他您喜好的“J2EEPreview Server”。

部署范例程序

  1. 对您在前面步骤中所创建的服务器事例部署 StockWidgetSample 应用程序。
  2. 右击服务器并选中 Add and Remove
  3. 在弹出的向导之中,添加 StockWidgetSample 应用程序并点击 Finish
  4. 启动服务器:右击您所创建的服务器实例,并选中 Start。

启动 Universal Test Client for iWidget 之中的 iWidget

  1. 在 Enterprise Explorer 中,展开范例程序的 WebContent 目录。
  2. 右击 stock.xml 文件并选中 Run As > Run on Server
  3. 在打开的向导页面中,选择 Ajax Test Server 或者您部署范例的其他服务器。
  4. 点击 Finish

这将会启动 Universal Test Client for iWidget 之中的 stock.xml iWidget。

测试客户端特性

让我们查看一下测试客户端的各种特性。

widget 名

在 widget 顶部的工具栏之中(图 11),widget 名显示时带有一个超链接。该名字就是 iWidget 独一 ID。

图 11. 测试中 widget 的名字
带有 iWidget 名字的工具栏片段

点击链接以打开部署在服务器之上的 widget。您可以使用它来确认来自工作区的 widget 得到了部署,并且与服务器保持了同步化。

显示 URL

该图标(图 12),位于 widget 顶部的工具栏之中,可以用于显示测试客户端的 URL。点击图标就可以在弹出的窗口中查看 URL。您可以复制并粘贴该 URL 到您的爱好浏览器中,以作调试之类的应用。

图 12. 显示 URL 图标
Globe 图标

刷新 iWidget

图 13 中的图标,您可以从顶部的工具栏中找到,可以用于刷新 iWidget,而不用重新加载整个测试客户端。

图 13. Refresh Widget 图标
刷新标志,带有两个箭头

显示模式

该图标(图 14)只是当 iWidget 拥有不止一个模式时才会看得见。点击该图标,则会出现一个模型的下拉列表。使用它可以在不同的模式之间进行切换。

图 14. 显示模式列表图标
纸上的笔图标,得到列表

重新设定 iWidget 的大小

您可以重新设定 iWidget 窗口的大小,并使用 iWidget 窗格中右下角的“handle”(图 15)将其进行移动。当 iWidget 的大小发送变化,或者当它达到最终的运行时设置时(例如,在 Mashup Center 中),这一点对于查看 iWidget 中的内容是如何实现的非常有用。

图 15. 设定 Handle 图标的大小
右下角的三角形符号

现在您要测试一个范例 iWidget,测试存储 iWidget。

实施标记操作

iWidget 是在测试客户端的顶级窗口中,使用 stock.xml 文件中的 DOM 标记操作以及来自 stock.css 文件的形式操作的。

  1. 调整形式单的形式属性或者 stock.xml 文件中的标记操作。
  2. 等待,直到服务器自动同步化,或者重新发布它为止。
  3. 使用(内部性)浏览器的 Reload 图标来重新载入测试客户端,或者使用测试客户端的 Refresh 图标来刷新 iWidget。

您将会您所做的更改显示了出来。

切换模式

使用 Modes 图标,在不同的模式之间进行切换。查看不同模式下的内容,将会产生一个特定规模的 iWidget。对于该范例存储 widget,您可以切换到 Edit 模式,并更改经纪人爱好。当您提交您的偏好时,widget 会使用来自新经纪人的数据来重新载入 View 模式。

处理事件

除了 iWidget 发送和接受事件,稍后您将会看到这些内容,iWidget 可以处理各种不同的标准事件,例如 onLoad、onUnload、onView,等等。对于所有这种类型的事件 stock.js 文件都有相应的事件处理方式。将它们与事件处理器混淆在一起。在其中放一条警告信息或者一个 console.debug(字符串)声明。将您所做的更改与服务器同步化起来,并重载或者刷新 iWidget。当这些事件最终被激发时,您就可以测试您的处理器了。

事件联接

在一个典型的标记环境下,一个 widget 与其他的 widget 通常会联系起来,这样它们就可以通过发布或者相互之间订阅事件来进行交流。iWidget 所交换的数据叫做 净荷。净荷可以是标准类型的,例如字符串、日期或者时间,或者它可以是一个定制的数据结构。您可以从测试客户端那里模拟发布和订阅事件。事件只能在以下的情况下进行联系。

  • 如果它们的净荷类型相匹配
  • 如果至少有一种 widget 参与到“任意的”净荷类型(一个 任意的 净荷类型就像是通配符,可以映射至任意其他的净荷类型)

事件浏览器

测试客户端提供了一个 Event Explorer iWidget(图 16)。这是测试客户端中底行三个 widget 中最右边的一个。该 widget 只是当 iWidget 拥有事件要发布时才会得到最大化。来自测试中 widget 的所有发布事件都将与 Event Explorer widget 联系起来。Event Explorer widget 将会接受任意净荷类型的事件。它搜索并使用到来数据的 toString() 函数。

存储 widget 会发送存储数据通用净荷类型。但是 stockData 拥有一个 Event Explorer 可以使用到的 toString() 函数。

图 16. Event Explorer
Event Explorer widget 接受数据
Event Explorer widget 接受数据

事件生成器

测试客户端可以用于模拟事件发生时,测试 widget 所处理的数据。如果测试下的 widget 拥有处理数据的事件,那么 Event Generator widget 与 Event Log widget 就会在测试客户端的底端得到最大化,如图 17 所示。否则,它们仍然会保持最小化窗口。

图 17. Event Generator 与 Event Log widget
Helper widget 为 widget 生成的测试数据
Helper widget 为 widget 生成的测试数据

图 17 的大图

Event Generator widget 在左边,并向测试 widget 发送事件。右边的 Event Log widget 会记录发送至测试 widget 的事件。

对于测试 widget 所处理的每一个事件,Event Generator widget 都会有一个相同净荷类型的相应事件。这些事件都会联系到一起。同样,Event Generator widget 拥有另一种净荷类型的事件,它会与测试 widget 中的所有事件联系起来。

图 18. 来自生成器 widget 所发送的事件
测试 widget 中特定事件可以得到定位
测试 widget 中特定事件可以得到定位

当您从 Event Target 列中选择每一个事件时,事件的净荷类型就会显示在 Data Type 列中。在 Data 列中,输入区域会发生适当的变化。例如,如果净荷类型是 Time 的话,那么输入区域就会变化为一个时间选择器控件 Dojo dijit。如果净荷类型是 Date 的话,那么输入区域就会变成一个日历 dijit。所以一个适当的净荷类型会通过联系渠道,从生成器 widget 发送至测试 widget 处。

在事件联接部分,预先地,会给出两种事件可以联接起来的条件。只要遇到这种情况,那么 widget 容器就会允许联接操作的发生。但是,它本身并不说明通过联系所发送的数据就是有效的了。接受事件的 widget 中的事件处理器,在接受到数据时就必须马上确认数据的有效性。

例如:

  1. 在 Event Target 列的下拉菜单之中选择 Time 事件,而 Data 列中的输入区域将会更改为一个时间选择器控件。
  2. 选择一个时间以让其出现在输入区域之中。
  3. 现在向其添加 alpha 字符来将其弄乱。

dijit 将会警告您说区域内的值是无效的。当事件被发送至测试 widget 时,测试 widget 将会知道怎样去认识和处理这样的无效数据,但是 widget 则不会意识和处理这样的无效数据,只是证明了这一点。

  1. 使用 Add Event 按钮来添加另一个相似的行。

现在多个事件目标可以在同一时间定位。当您在点击 Send Events 按钮时,数据将会发送至在每一行中所选择的事件目标。

您可以使用行开始处的复选框来激活或者关闭行。当您在点击 Send Events 按钮时,来自关闭行的数据将会立即得到发送。

行末端的垃圾桶图标可以用于删除行。

时间日志 widget

Event Log widget 保存了发送自 Event Generator 所有事件的日志。表格中的许多行都可以被选中。当您点击 Resend 按钮时,那些事件会再次发送至测试 widget。而 Clear 按钮则会清空表格。查看 图 17

如果您想要得到关于这些问题的更多有用信息,那么您可以查看参考资料)部分,在这里您可以找到一些链接,以学习使用 Rational Application Developer 的更多方式。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=605224
ArticleTitle=使用 Rational Application Developer 来创建和测试 IBM iWidget
publish-date=12272010