65.9K
CodeProject 正在变化。 阅读更多。
Home

第 2 章:理解通用接口体系结构

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2009年3月9日

CPOL

20分钟阅读

viewsIcon

28273

本章提供了TIBCO通用接口及其框架组件的高级架构,并描述了通用接口应用程序在浏览器中如何工作。

ShowCover.asp.jpg 作者:Anil Gurnani
由 Addison-Wesley Professional 出版
ISBN-10: 0-321-56329-8
ISBN-13: 978-0-321-56329-3

本章摘自《使用TIBCO通用接口进行Web开发:为企业SOA构建AJAX客户端》,作者Anil Gurnani,由Addison-Wesley Professional Developer’s Library出版,ISBN 0321563298,2009年2月,版权所有2009 Pearson Education, Inc. 更多信息请访问 informIT,Safari Books Online的订阅者可以在此访问本书:http://techbus.safaribooksonline.com/9780321563293.

本章提供了TIBCO通用接口及其框架组件的高级架构,并描述了通用接口应用程序在浏览器中如何工作。

通用接口的优势之一是其处理XML和XSL的能力。所有控件都使用XML/XSL在屏幕上渲染组件。JavaScript用于处理用户操作。这种策略有助于通用接口应用程序比浏览器中的JavaScript代码运行得更快,因为浏览器使用的XSL处理器运行速度很快,而JavaScript处理器运行在浏览器外部,并且每次都必须先编译然后执行。此外,GI Builder——TIBCO通用接口附带的集成开发环境(IDE)——可以通过使用组件面板中100多个即用型控件来快速可视化构建原型。

使用通用接口构建的应用程序应利用通用接口的架构以获得最佳性能。虽然可以使用框架API完全用JavaScript构建应用程序,但JavaScript的性能大约比XML/XSL处理慢10倍。因此,了解通用接口的工作原理并利用它来构建应用程序以获得最高性能水平非常重要。通用接口的架构包括多种利用XSL处理来提高性能的方法。TIBCO通用接口的JavaScript框架包含许多类和方法,用于在运行时加载、缓存和解析XML文档,以及使用XSL样式表转换文档。

模型-视图-控制器架构

自Smalltalk-80以来,模型-视图-控制器(MVC)就是构建图形用户界面的成熟模式。GUI框架,例如Microsoft Foundation Classes (MFC)、Java Swing、WinForms以及Java Web应用程序的Struts,都使用MVC模式。这种模式为GUI开发人员提供了关键优势:首先,它使代码模块化,并将一个大问题分解成许多小问题,从而实现更快的团队开发。它还使代码更易于维护,因为代码的每个部分都处理自己的变量和行为集。使用MVC进行GUI框架最重要的优点之一是它使框架易于扩展和定制。例如,可以扩展View类来创建自定义视图。如有需要,可以将多个视图附加到单个模型。视图还可以使用观察者模式在模型更改时自行更新。

在MVC模式中,涉及三个主要类:Model类,它拥有驱动视图的数据的内部状态;View类,它拥有屏幕上显示的内容,并可以直接修改它;以及Controller类,它协调用户操作。当用户单击按钮时,它首先由相应的View类感知。然后,它立即将此按钮连同任何必要的参数一起传递给Controller类。处理此单击的逻辑在Controller类中,它执行必要的步骤并在必要时更新Model类。然后,Model类会通知View类某项已更改,View类随后获取新数据并相应地更新显示。

这种架构使得来自任何地方的操作成为可能——例如,后端进程可以调用Controller中的一个操作来传递需要显示给用户的消息。可以将多个不同的View类与同一个模型关联起来,以不同的表示形式显示数据。例如,一个代表表格数据的Model类可以通过两个独立的视图显示——一个在屏幕上显示网格,另一个显示同一数据的图表。图2.1展示了MVC模式使用的高级表示。

02fig01.jpg
图 2.1
MVC的高级表示。

通用接口中的所有控件和组件都使用XML作为数据,并由XSL样式表和JavaScript代码的组合驱动。通用接口定义了一种称为“通用数据格式”或CDF的格式,它是一种XML。通用接口还包含大量XSL样式表,这些样式表将底层CDF转换为HTML元素,如网格、列表和菜单。用于协调组件行为的JavaScript代码以包、类和接口的形式进行组织。通用接口遵循类似于Prototype框架的风格来定义JavaScript代码,以支持面向对象的继承、多态和封装概念的类和接口。这种风格使JavaScript代码看起来几乎像Java代码。但是,请记住JavaScript不是一门真正的面向对象语言,因此Java或C#等现代语言的全部功能并非都可供开发人员使用。

通用接口应用程序生命周期

通用接口应用程序通过执行一些可以称为引导加载程序的JavaScript代码开始。在通用接口包中有一个JavaScript文件,即JSX30.js,其中包含引导通用接口应用程序并开始运行它的函数。部署实用程序生成代码,使用HTTP协议和应用程序的适当参数来加载此文件。当包含通用接口应用程序的HTML页面由浏览器加载时,会调用JSX30.js,它开始加载应用程序。

任何应用程序加载的第一个文件是config.xml文件,它定义了应用程序文件和各种属性。除其他外,config.xml列出了开始加载到浏览器内存中的JavaScript文件。在config.xml文件中有一个指向定义启动屏幕的文件的引用。启动屏幕定义也是一个XML文件,其中包含通用接口应用程序的布局以及其中的控件、组件和/或子组件。

此时,将创建一个全局应用程序控制器实例,它是正在加载的应用程序的主要协调器。它充当全局上下文,并包含应用程序的所有其他组件和控件。图2.2展示了通用接口应用程序的典型生命周期。

02fig02small.JPG
图 2.2
通用接口应用程序生命周期。

通用接口支持动态类加载器,该加载器仅加载所需的JavaScript和XML文件。这允许您模块化应用程序,以确保其响应迅速,并且不必下载大文件。仅加载打开屏幕所需的文件,然后创建并渲染启动屏幕及其内部控件的实例;接下来,执行控制权传递给用户,然后由用户驱动应用程序。根据需要加载和处理其他JavaScript和XML/XSL文件。

对话框等组件以及这些对话框中包含的其他控件不需要初始加载。通用接口框架提供了方法,可在需要时将这些组件动态插入应用程序对象模型。例如,当用户单击“保存”按钮时,应用程序可以调用一个方法来显示“保存”对话框,该对话框定义在一个单独的XML文件中。通用接口将此组件XML文件加载到内存中。文件加载后,通用接口将实例化该文件中引用的JavaScript类,然后将其新组件插入应用程序对象模型层次结构并进行屏幕渲染。关闭对话框后,将其从应用程序对象模型中删除。下载后,可以将组件缓存到浏览器内存中,这样当再次需要该组件时就不需要再次获取了。

通用接口还包括一个压缩和混淆JavaScript文件的实用程序。简而言之,此实用程序接收多个JavaScript文件并将其合并为一个JavaScript文件。它还更改变量和方法的名称,以使用最少的字符来减小生成JavaScript文件的大小。这与动态类加载的概念直接相反。应用程序开发人员必须分析和理解每种策略的影响,并采用一种适合其需求和环境的策略。对于非常大的应用程序,可以使用混合方法,其中类被分组到几个关键组中,并使用合并实用程序压缩成几个单独的文件,这些文件会按需动态加载。

应用程序对象模型

通用接口定义的屏幕和控件的抽象级别高于HTML文档对象模型。这个模型称为应用程序对象模型(AOM),它映射到本机浏览器的DOM。这使得通用接口应用程序可以在任何通用接口AOM已实现的浏览器中运行。图2.3展示了TIBCO通用接口中示例应用程序的应用程序画布的设计器视图,图2.4展示了同一个appCanvas的XML定义。

02fig03.jpg
图 2.3
设计视图中的应用程序画布。
02fig04small.JPG
图 2.4
XML视图中的应用程序画布。

正如您所见,每个元素的属性都在XML中定义,并且它与一个JavaScript类相关联。当通用接口控制器加载组件时,它会创建一个关联的JavaScript类的实例来处理组件的事件和行为。这为主类和组件提供了高度的封装性。可以使用熟悉的面向对象编程概念来扩展内置控件(或创建新控件)。当您在GI Builder中构建画布时,它会构建此文件,您可以在GI Builder的组件层次结构象限中查看此文件的用户友好表示。

通用数据格式

如前所述,所有使用数据的通用接口控件和组件都由后备XML模型驱动。数据必须采用称为“通用数据格式”或CDF的格式。CDF是一种非常简单的格式,它定义了几个关键元素并将属性空间开放。属性映射到控件中的数据元素。CDF的主要优点是可以驱动TIBCO通用接口中的任何控件,这使得可以拥有相同的后备CDF来用于网格和图表。通用接口中的MVC模式的Model部分可以被认为是TIBCO通用接口中的CDF。

JavaScript对象表示法(JSON)是一种用于访问和操作对象属性的简单格式。它基于JavaScript编程语言标准的一个子集,但它是文本化的,因此与语言无关。由于它基于JavaScript标准,因此TIBCO通用接口对其有固有支持。

CDF格式还使得使用JSON范例非常容易地操作相关对象。CDF中的每个节点都可以看作是一个JSON对象,其中XML属性映射到JSON属性。因此,在使用XSL样式表处理CDF时,可以使用XSL/XPATH来操作此CDF,同时,可以使用JSON语法更新字段(例如,obj.property = x)。由于TIBCO通用接口结合了JavaScript和XML,因此在处理TIBCO通用接口应用程序中的数据结构时,这成为一个关键的便利。

JavaScript框架

Prototype框架1.5版于2007年1月发布,它将面向对象编程的概念引入了JavaScript。Prototype框架最初是JavaScript中一小组函数,旨在让开发人员轻松编写模块化的JavaScript代码。

面向对象编程在开发界的其他领域取得了巨大成功,但JavaScript语言本身并不支持类、接口、继承和多态的概念。然而,JavaScript能够创建具有属性的对象,并且它支持函数指针的概念。因此,一群聪明的人利用这些特性作为构建块,在JavaScript中创建了一个框架,允许开发人员使用面向对象概念编写JavaScript代码。例如,您可以创建一个名为Button的类,并在其中有一个名为click()的方法,然后扩展该类来创建其他类型的按钮,例如ImageButtonRollOverImageButton等。

Prototype框架包含一个JavaScript文件,其中定义了各种函数,可用于定义自定义类。Prototype框架现在通过提供一些类来封装AJAX请求和响应对象,从而支持AJAX。图2.5展示了通用接口JavaScript框架的文档页面,该框架大致基于Prototype框架。

02fig05.jpg
图 2.5
通用接口框架API文档。

TIBCO通用接口的JavaScript框架增加了类似Java的包结构,并将代码组织在类文件、接口和包中。这在很大程度上使得JavaScript看起来和感觉上都像Java。TIBCO通用接口中甚至还有一个动态类加载器,可以按需下载类。通用接口框架增加了函数,以便在需要另一个类时通知通用接口类加载器。所有JavaScript代码都编写在较小的类中。虽然单个源文件可以包含多个类定义,但建议保持文件较小,并在单个源文件中只定义一个类。这也有助于动态类加载,因为每个类都可以按需快速加载。请记住,类是JavaScript文件,它们位于服务器上但在客户端使用,因此类加载是通过HTTP请求完成的。加载到客户端后,JavaScript文件会被浏览器缓存。如果这是编译后的代码并在客户端执行的速度比JavaScript快得多,那就好了。此外,编译器在开发时也会有所帮助。通用接口提供的IDE在这方面提供了一些帮助,但它并非真正的编译器。

有关如何利用通用接口框架中的面向对象方法的更多详细信息,请参阅第7章,“面向对象的JavaScript——扩展通用接口控件”。

JavaScript API

TIBCO通用接口的JavaScript API的组织方式与Java开发工具包类似。所有JavaScript类的根包名是jsx3。用于管理类和包定义的基框架类位于jsx3.lang包中。这里需要提醒的是,包的概念与Java中的包有些相似,但如果使用jsx3.lang.package定义一个包,它就不能被通用接口的类加载器动态加载。TIBCO通用接口的包允许将几个类组合到一个包中,并允许JavaScript程序发现包中的类、方法和属性。虽然这是一个好功能,但也有可能,甚至建议不使用包。包也可以通过在类名中使用适当的命名空间来创建。以下子包可用

  • Jsx3.app——包含通用接口应用程序的最高级类;例如,应用程序控制器和通用接口全局缓存等。
  • jsx3.chart——包含与通用接口图表相关的类。
  • jsx3.gui——包含GUI控件类以及事件和通知相关的类。
  • jsx3.html——包含与通用接口渲染的HTML相关的少数类。
  • jsx3.ide——包含与GI Builder IDE相关的类。
  • jsx3.lang——包含通用接口类框架,可以在没有通用接口其余部分的情况下使用,以在JavaScript中构建可重用组件。
  • jsx3.net——包含允许应用程序与后端服务通信的类。
  • jsx3.util——类似于java.util包;包含简单的实用程序类,如ListIterator等。
  • jsx3.vector——包含与通用接口中的矢量图形相关的类。仅在图表使用时可用。
  • jsx3.xml——包含通用接口的XML文档和CDF的抽象层。
  • window——允许访问浏览器级别的JavaScript函数,如window.alert()

常用类

TIBCO通用接口具有非常丰富的功能集,其框架包含大量的类和方法。产品文档包含一个完整的API参考文档,类似于Java可用的文档。本节将介绍一些更常用的类和API,并提供具体的用例和示例代码片段。

应用程序控制器

通用接口有一个高级应用程序控制器,它协调通用接口应用程序中的各种功能。每个应用程序都为此控制器创建单个实例。此全局控制器类在通用接口中的名称是jsx3.app.Server。它经常在自定义代码中使用,因为它允许访问同一应用程序的其他部分。例如,从Select组件的事件处理代码中,如果您需要调用同一应用程序的Grid组件的方法,可以使用以下代码:

this.getServer().findJSXByName('mygrid').getSelection();

在此语句中,this指的是正在进行调用的Select控件的实例。如果您是Java或C++开发人员,它与用于引用类的当前实例的this指针相同。有关在通用接口中编写自定义类的详细信息,请参阅第7章。

缓存

Cache是应用程序可用的全局内存空间,具有类似于Java的垃圾回收的智能管理。在此类中,通用接口提供了一种非常智能的机制,用于在浏览器中存储数据,以便任何其他函数都可以访问或稍后访问。此类还用于保留某些控件的关键数据。例如,Grid控件将其后备数据保存在jsx3.app.Cache类的实例中。应用程序可以使用它在客户端内存中本地存储较大的结果集。但是,必须注意不要加载过多的内容到客户端浏览器,并避免IE(或Firefox)的内存过载。

通用接口的JavaScript自定义类

通用接口框架中提供的详尽函数集使得可以用很少的JavaScript代码编写复杂的逻辑,这些代码还可以嵌入到控件的属性中,类似于HTML元素中的onClick等事件处理程序。伴随任何通用接口应用程序的JavaScript可以按常规方式编写,保存在.js扩展名的文件中。当您在通用接口中开始一个新项目时,它会在工作区中打开一个文件logic.js,其中可以放置用于处理事件处理或验证逻辑的小段JavaScript脚本。但是,为通用接口编写JavaScript的最佳实践是开发类似于Java类的JavaScript类。每个.js文件应该只包含一个类。在通用接口中定义类的方法是使用jsx3.lang包中的defineClass()函数。列表2.1显示了使用TIBCO通用接口框架编写的类部分源代码

列表2.1 通用接口中定义的自定义类

/* File: CommandHandler.js
 * Description: Implements a command handler for online
 *       equity trading application
 *
 *       This class follows Command pattern to implement
 *       a generic handler for all menu items from
 *       the main trading window
 */
jsx3.lang.Class.defineClass (
"com.tibcobooks.gi.chapter2.CommandHandler", // name of class
com.tibcobooks.gi.chapter2.BaseHandler, // similar to "extends"
                  part of Java class definition
[], // Similar to "implements" part of Java class definition
function ( CommandHandler ) {
    CommandHandler.prototype.buyURL =
      'http://www.anilgrnani.com/gibook/chapter2/by';
    CommandHandler.prototype.sellURL =
      'http://www.anilgrnani.com/gibook/chapter2/sell';
    CommandHandler.prototype.init = function()
    {
      // this is the constructor in General Interface framework
    };
}
);

通过简单地包含通用接口发行版中的一些JavaScript文件,就可以独立于通用接口使用此框架。通用接口框架是开源的,因此以这种方式使用它没有许可或成本问题。它肯定使JavaScript代码更具模块化,因此易于维护。

加载类的过程本质上是下载JavaScript源文件,并使用JavaScript方法evaluate()执行它,以将其动态插入到当前可用的JavaScript文件集中。类加载后,程序的其他部分可以创建类的实例,或者可以通过完全限定的类名直接引用来调用任何静态方法或访问静态属性——例如

com.tibcobooks.gi.chapter2.CommandHandler.sellURL =
 'http://www.anilgrnani.com/gibook/chapter2/newSellURL'

XSL样式表

为了实现高性能,TIBCO通用接口严重依赖XML/XSL引擎来渲染HTML,而不是使用JavaScript进行DOM操作。它在发行版中包含了大量的XSL样式表。框架的XSL样式表存储在通用接口安装目录内的JSX\xsl文件夹中。快速查看该目录会显示以下xsl文件:

cf_creator.xsl
cf_resolver.xsl
jsxlib.xsl
jsxmatrix.xsl
jsxmen.xsl
jsxselect.xsl
jsxtable.xsl
jsxtree.xsl
xml.xsl

此外,还有两个子文件夹:iefx。它们包含已弃用的List和Grid类的XSL样式表,并向后兼容通用接口的早期版本。

通用接口中的控件屏幕渲染始终使用这些XSL样式表完成。CDF格式的XML数据与其中一个XSL样式表合并,以渲染浏览器的HTML。通常不建议编辑这些样式表,因为它们是通用接口产品的一部分,并且可能随版本而变化。

通用接口在这些样式表中提供了一些钩子以允许自定义。这项技术以另一种方式帮助开发人员——开发人员不必编写冗长而复杂的样式表来完成完全渲染;相反,他们只需要编写称为“值模板”的小片段,这些片段会在与这些预构建样式表之一进行合并运行之前由通用接口运行时插入。

值模板

显示大量数据列表时的一个常见需求是能够根据单元格的内容应用样式。在Microsoft Excel中,此功能作为条件格式在Office 97至2003的“工具”菜单中,以及在Office 2007的“样式”调色板的“开始”选项卡中显示。

在通用接口应用程序中,这种数据格式化或着色是通过称为“值模板”的XSL样式表片段实现的。Matrix组件的列有一个名为“value template”的属性字段,可以在其中放置XSL,以在运行时影响输出。值模板在第8章“Matrix的高级功能”中有详细讨论。

XML转换器

后端系统并非总是生成CDF。也不应该期望它们这样做。因此,通用接口会运行XML通过一个可以由开发人员提供的中间样式表。XML Transformer是数据驱动的通用接口控件的一个属性,它可以包含对样式表的引用,该样式表将用于在通用接口控件的样式表进行屏幕渲染之前转换XML数据。这使得应用程序设计非常优雅,后端可以提供标准XML格式的数据,而像通用接口这样的客户端可以将其数据转换为它们可以使用的格式。XML Transformer还可以用于在屏幕渲染数据之前对其进行操作;例如,可以在通用接口提供的单个列排序之前,按多个键对数据进行排序。通用接口允许将字段指定为排序键。但是,XML Transformer可以用于在应用通用接口提供的单列排序之前,使用固定的XPath表达式对数据进行排序。

请注意,当您完全控制后端XML生成,以及/或生成的XML的唯一目的是将其提供给TIBCO通用接口前端时,最好直接生成CDF,因为它省去了通用接口处理中的一个步骤。转换器是一种快速有效的方法,可以转换由某些后端应用程序已生成的XML,或当有其他客户端应用程序需要XML的全部功能时。

本书的第4章“使用XML和XSL”以及第8章将更详细地讨论XML Transformer,并提供在通用接口应用程序中使用XML Transformer的完整示例。

© . All rights reserved.