[返回]
计算机世界1999年第49期

用Delphi开发基于Web的多层应用

南京理工大学 胡 静 李蔚清

  多层体系结构最大的优势可以概括为两点,一是集中化的商业逻辑,另一个是客户程序可以做得很“瘦”。

  一、多层体系结构概述

  多层结构其实是对传统Client/Server 结构的扩展。三层模式是最典型的多层结构。一般来讲,三层结构可作如下定义:表达逻辑层(即客户端的界面部分),业务逻辑层(即业务处理部分),数据逻辑层(即数据库部分)。相对于传统的Client/Server 结构来讲,表达逻辑层+业务逻辑层= 传统的客户端。
  1. 数据逻辑层由对数据进行物理创建、更新、删除和检索的组件构成。这些组件负责与存储介质的交互,使得物理数据对其他组件透明。

  2. 业务逻辑层由实现业务规则的组件构成。业务规则只存在于这一层上。这些规则作为服务提供给其他组件。这一中间层服务器是多线程的,可以提供多用户访问,并能由多个独立的应用平等共享。三层结构大部分处理(逻辑和计算)由中间层服务器控制,中间层代码可供多个客户端访问和使用。

  3. 客户结点由负责系统界面的组件构成。这些组件可运行于不同的设备上,从ASCII 终端到Windows 界面,Internet 浏览器和网络计算机(NC)。当表达逻辑层的客户需要计算或进行数据存取的时候,便产生一个调用传给中间层服务器。
de069_1.jpg (28738 字节)
  二、MIDAS 技术

  1. MIDAS 构件类型
  MIDAS(Multi -tier Distributed Application Services)即多层分布式应用程序服务器。它提供了一整套中间层应用服务,扩展了操作系统标准,这些服务用于解决各种具体的分布式计算问题,从用于网络定位的目录服务到数据库集成和业务规则处理。它主要基于Borland 的分布式数据集技术,至少包括两方面的内容:

  * 内置在Delphi 组件中;
  * OLEnterprise 产品对分布式计算和负载平衡提供的超强支持。

  MIDAS 技术是多层体系结构的关键。无论是应用服务器端还是客户端,MIDAS 技术需要有DBCLIENT.DLL 的支持,这个动态链接库用于管理数据包。基于MIDAS 的多层应用程序需要用到一些特殊的构件,这些构件分为四大种类:
  (1) 对象库中的远程数据模块(Remote Data Module)。远程数据模块与普通的数据模块有些相似,不同的是,远程数据模块可以作为COM 服务器或CORBA 服务器让客户程序访问它的接口。

  (2)TDataSetProvider 和TProvider 构件。这两个构件用在应用服务器端,主要作用是提供IProvider 接口,客户程序通过IProvider 接口获得数据和更新数据集。

  (3)TClientDataSet 构件。客户数据集构件,这是一个从TDataset 继承下来的但不需要BDE 的构件。

  (4)MIDAS 连接构件。Delphi3 中提供TMIDASConnection 和TRemoteServer,Delphi4 在此基础上又增加了TDCOMConnection、TSocketConnection、TCorbaConnection TOLEnterpriseConnection,MIDAS 连接构件的作用是为客户程序定位服务器和IProvider 接口。每个MIDAS 连接构件都以一种特定的通信协议工作:

  2. MIDAS 结构的程序实现

  在多层的数据库应用程序中,客户程序、应用服务器和远程服务器分布在不同的机器上。其中,客户程序主要提供用户界面,它能够向应用服务器请求数据和申请更新数据。再由应用服务器( 又叫Remote Data Broker) 向远程数据库服务器请求数据和申请更新数据。在Delphi 中的实现如图2:
de069_2.jpg (32744 字节)
  应用服务器端的Remote Data Module 从概念上与一般的Data Module 相对应,但在实现时,一旦创建了Remote Data Module,Delphi 即把此应用程序看作是应用服务器,实现为OLE 自动化服务器。Provider 构件从概念上类似于两层结构中的数据源构件,每一个Provider 都有一个TTable,Tquery 这样的数据集构件相连,通过它们与数据库交互。

  客户端的MIDAS 连接构件的主要作用是定位远程的应用服务器,并从应用服务器取得Iprovider 接口提供给ClientDataSet,本身不参与数据库操作。而ClientDataSet 构件在概念上与TTable、TQuery 等数据集构件相似,可对用户界面中的可视数据构件提供数据,每一个ClientDataSet 必须与应用服务器端的一个Provider 相连,因此ClientDataSet 中的数据实际上是Provider 对应的数据集构件中数据。

  3. MIDAS 应用程序的工作流程

  一个简单的查询——更新操作的流程如下:

  (1) 首先要启动客户程序,客户程序将试图连接应用服务器,如果应用服务器还没有运行,客户程序将激活应用服务器,并从中获得IProvider 接口。

  (2) 客户程序向应用服务器请求数据。如果TClientDataSet 的FetchOnDemand 属性设为True,客户程序会根据需要自动检索附加的数据包如BLOB 字段的值或嵌套表的内容。否则,客户程序需要显式地调用GetNextPacket 才能获得这些附加的数据包。

  (3 )应用服务器收到客户程序的请求后,就从远程数据库服务器检索数据,并打包返回给客户程序。

  (4) 客户程序收到数据包后把包打开,然后显示或进行处理。

  (5) 用户对数据进行编辑修改,然后向应用服务器申请更新数据,实际上也要打包。

  (6) 应用服务器收到客户程序的申请后,就向远程数据库服务器申请更新数据。如果出错,应用服务器就把出错的记录返回给客户程序去核对。

  (7) 客户程序核对并修改了数据后,既可以放弃此次更新,也可以继续此次更新。

  在多层模式下,几个客户有可能同时与一个应用服务器通讯,应用服务器实际上充当了一个网关的作用。对于最终用户来说,多层体系结构中的客户程序与两层体系结构中的应用程序没有什么区别。

  三、基于Web 的多层体系结构

  为了将分布式的数据库结构引申到Internet/Intranet 上,可以将客户端制作为一个ActiveX 控件嵌入到标准HTML 页面中,随同HTML 页面下载到当地执行。在Delphi 中,这种客户端是以ActiveForm 的形式出现的。ActiveForm 是开发具有Web 功能的Client/Server 应用程序另外一个重要的部分。ActiveForm 是一个ActiveX 控件,在设计阶段和普通Form 并没有什么不同,但编译后生成的*.OCX 文件可以在浏览器内运行。客户机通过浏览器下载一个ActiveForm,ActiveForm 通过TRemoteServer 与远程服务器建立连接,再由远程服务器访问数据库。
  一个基于Web 的多层应用程序的运行流程如图3:
de069_3.jpg (24581 字节)
  (1) 客户通过WWW 浏览器向WWW 服务器发出请求,通过HTTP 协议下载嵌入了ActiveForm 的HTML 页面,安装ActiveForm,并在本机运行。

  (2) ActiveForm 通过MIDAS 连接构件连接应用服务器,将客户的请求数据发送给应用服务器。Internet/Intranet 上的应用服务器必须支持DCOM 或TCP/IP 连接方式,同样,设计成ActiveForm 的客户程序也必须支持DCOM 或TCP/IP 连接方式,因为下载ActiveForm 的计算机上可能没有安装OLEnterprise 或CORBA 运行期软件。

  (3) 应用服务器收到请求后连接远程数据库服务器,申请检索或更新数据。

  (4) 远程数据库服务器完成操作后,将数据发送给应用服务器。

  (5) 应用服务器再将处理后的数据发送给客户端的ActiveForm,ActiveForm 从ClientDataSet 中提取数据,按照一定的规则与格式在可视数据控件中显示出来。

  四、基于Web的多层应用程序的开发步骤

  1. 创建应用服务器
  要创建一个多层Client/Server 应用程序,首先要创建应用服务器,然后注册或安装应用服务器,只有应用服务器已注册并且正在运行的情况下,才能创建客户程序。对于客户程序来说,既可以在设计期连接应用服务器,也可以在运行期连接应用服务器。如果客户程序与应用服务器不在同一个系统中,必须在客户计算机上注册或安装应用服务器,这样,在设计期就可以连接应用服务器。

  (1) 使用“File" ->"New Application" 开始一个新项目。如果在Delphi3 中, 则选取菜单“File" ->"New...",从弹出窗口中选取“New RemoteDataModule"。在Delphi4 中,如果要创建一个COM 自动化服务器,允许客户通过DCOM、TCP/IP、OLEnterprise 等方式访问此服务器,选择“Remote Data Module",如果要创建一个允许客户通过MTS 访问的Active Library,选择“MTSData Module",如果要创建一个CORBA 服务器,选择CORBA Data Module。

  (2) 把一个数据集构件如TTable、TQuery 或TStoredProc 放到远程数据模块上,并进行有关设置,使得它们能访问远程的SQL 数据库。可将业务规则放入这些构件的Constraint 属性或响应事件中。将来一旦业务规则发生改变只需调整应用服务器端的程序,维护工作量大大减轻。

  (3) 把TDataSetProvider 或TProvider 构件放到远程数据模块上,有一个数据集构件,就要有一个TDataSetProvider 或TProvider 构件与之对应。然后,用鼠标右键单击TDataSetProvider 或TProvider 构件,在弹出的菜单中选择“ExportFrom in Data Module",这是为了引出Provider 接口,在类型库中注册。设置TDataSetProvider 或TProvider 构件的DataSet 属性指定要访问的数据库

  (4) 编写代码,实现商业规则。

  (5) 保存、编译、注册或安装应用服务器。

  (6) 如果应用服务器没有使用DCOM,您必须安装有关的运行期软件,因为其他连接方式需要这些运行期软件的支持。例如,对于TCP/IP 来说,需要安装ScktSrver.exe 或ScktSrvc.exe,后者只能运行在Windows NT 环境下。对于OLEnterprise 来说,需要安装OLEnterprise 运行期版本。对于CORBA 来说,需要安装VisiBroker ORB。

  2. 创建ActiveForm 客户端

  Internet/Intranet 上的应用服务器必须支持DCOM 或TCP/IP 连接方式,同样,设计成ActiveForm 的客户程序也必须支持DCOM 或TCP/IP 连接方式,因为下载ActiveForm 的计算机上可能没有安装OLEnterprise 或CORBA 运行期软件。最好采用TCP/IP 连接方式,因为您无法肯定下载ActiveForm 的计算机是否支持DCOM,而支持TCP/IP 的环境是很普遍的。

  (1) 使用“File"菜单上的“New"命令打开“New Items"对话框,选取“ActiveX"页,双击“ActiveForm"图标,打开ActiveForm 向导,单击“OK"按钮,Delphi 4 就创建一个ActiveX 项目。然后使用“File"菜单上的“New"命令,再双击“Data Module"图标加入一个数据模块。

  (2) 把一个或几个MIDAS 连接构件如TDCOMConnection、TSocketConnection、TOLEnterpriseConnection、TCorbaConnection、TRemoteServer 或TMIDASConnection 加到数据模块上。至于究竟选择哪一种MIDAS 连接构件,这取决于通信协议。设置有关属性指定和连接应用服务器,这与具体的MIDAS 连接构件有关。

  (3) 把一个或几个TClientDataSet 构件放到数据模块上,设置RemoteServer 属性指定一个MIDAS 连接构件,设置ProviderName 属性指定应用服务器上的TDataSetResolver 或TProvider 构件,这样,客户程序就可以通过IProvider 接口与应用服务器通讯。

  (4) 把一个TDataSource 构件放到数据模块上,设置它的DataSet 属性指定TClientDataSet 构件。再把一个数据控件如TDBGrid 放到窗体上,设置它的DataSource 属性指定TDataSource 构件。

  (5) 使用“Project"菜单上的“Web DeploymentOptions"命令打开“Web Deployment Options"对话框,然后设置有关Web 发布的选项,主要是指定ActiveForm 在Web 服务器上的URL。最后,使用“Project"菜单上的“WebDeploy"命令把ActiveForm 发布到Web 服务器上。

  为了测试这个Active 窗体,可以用一个Web 浏览器如IE 下载嵌入了ActiveForm 的网页。如果客户程序通过DCOM 与应用服务器连接,Windows 95 中需要安装支持DCOM 的程序——DCOM95,而Windows NT 4.0 则不需要。