1、介绍
Web Broker 组件(位于工具面板的“Internet”选项卡中)可以帮助您创建与特定统一资源标识符(URI)相关联的事件处理程序。当处理完成后,您可以通过编程方式构建 HTML 或 XML 文档,并将它们传输给客户端。
通常情况下,网页的内容来源于数据库。您可以利用 Internet 组件自动管理数据库连接,使得单个 DLL 或 SO 文件能够处理多个同时进行的、线程安全的数据库连接。
本系列的后续部分将详细解释如何使用 Web Broker 组件来创建一个 Web 服务器应用程序。
2、利用 Web Broker 构建 Web 服务器应用程序
Web Broker 组件(在工具面板的“Internet”标签下)使您能够创建与特定统一资源标识符(URI)相关联的事件处理程序。处理完成后,您可以编程生成 HTML 或 XML 文档,并将其传输给客户端。
在 Windows 上使用 Web Broker 架构创建新的 Web 服务器应用程序:
1). 选择File > New > Other。
2). 在“新建项目”对话框中,选择 Delphi 下的“Web”标签,并选择“Web Server Application”。
3). 出现一个对话框,您可以从中选择 Web 服务器应用程序的类型:
- Stand-alone application:为显示表单的 Web 服务器应用程序开发设置环境。
- Stand-alone console application:为开发 Web 服务器控制台应用程序设置环境。
- ISAPI dynamic link library:将您的项目设置为 DLL,并包含 Web 服务器所期望的导出方法。它会向项目文件添加库头文件,以及项目文件的 uses 列表和 exports 子句所需的条目。
- Apache dynamic link module:将您的项目设置为 DLL。Apache Web 服务器应用程序是 Web 服务器加载的 DLL。信息传递给 DLL,处理后由 Web 服务器返回给客户端。
- CGI stand-alone executable:将您的项目设置为控制台应用程序,并添加项目文件 uses 子句所需的条目。
在 Linux 上使用 Web Broker 架构创建新的 Web 服务器应用程序:
1. 选择 File > New > Other。
2. 在“新建项目”对话框中,选择 Delphi 下的“Web”标签,并选择“Web服务器应用程序”。
3. 出现一个对话框,您可以从中选择 Web 服务器应用程序的类型:
- 独立应用程序:为显示表单的 Web 服务器应用程序开发设置环境。
- Apache 动态链接模块:将您的项目设置为 SO。Apache Web 服务器应用程序是 Web 服务器加载的 SO。信息传递给 SO,处理后由 Web 服务器返回给客户端。
- CGI 独立可执行文件:将您的项目设置为控制台应用程序,并添加项目文件 uses 子句所需的条目。
2.1 Web 应用程序对象(Web Application Object)
为您的 Web 应用程序设置的项目中包含一个名为 Application 的全局变量。Application 是 TWebApplication 的一个派生类,适用于您正在创建的应用程序类型。它在 Web 服务器接收到 HTTP 请求消息时运行。
警告:在项目 uses 子句中,不要在 CGIApp、ApacheApp、ApacheTwoApp 或 ISAPIApp 单元之后包含 Forms 或 QForms 单元。Forms 也声明了一个名为 Application 的全局变量,如果它出现在 CGIApp、ApacheApp、ApacheTwoApp 或 ISAPIApp 单元之后,Application 将被初始化为错误类型的对象。
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
2.2 web模块(web Module)
Web 模块(Web.HTTPApp.TWebModule)是 System.Classes.TDataModule 的一个衍生类,可以像数据模块一样使用:它为 Web 应用中的业务规则和非可视组件提供集中控制。
您可以添加任何内容生成器到您的应用中,以生成响应消息。这些可以是内置的内容生成器,比如在多层数据库应用中作为客户端的 Web 服务器。
除了存储非可视组件和业务规则,Web 模块还充当 Web 调度器,将传入的 HTTP 请求消息匹配到生成这些请求响应的动作项。
如果您已经有一个数据模块,其中包含了您希望在 Web 应用中使用的许多非可视组件和业务规则,您可以用现有的数据模块替换 Web 模块。只需删除自动生成的 Web 模块,并用您的数据模块替换它。然后,向您的数据模块添加一个 Web.HTTPApp.TWebDispatcher 组件,这样它就可以像 Web 模块一样调度请求消息到动作项。如果您想要改变选择动作项以响应传入 HTTP 请求消息的方式,可以从 Web.HTTPApp.TCustomWebDispatcher 派生一个新的调度器组件,并将其添加到数据模块中。
您的项目中只能包含一个调度器。这可以是创建项目时自动生成的 Web 模块,或者是您添加到替换 Web 模块的数据模块中的 TWebDispatcher 组件。如果在执行过程中创建了第二个包含调度器的数据模块,Web 服务器应用将会引发运行时错误。
注意:您在设计时设置的 Web 模块实际上是一个模板。在 ISAPI 和 NSAPI 应用中,每个请求消息都会生成一个单独的线程,并且为每个线程动态创建 Web 模块及其内容的单独实例。
警告:在基于 DLL 或 SO(针对 Linux 平台)的 Web 服务器应用中,Web 模块被缓存以供后续重用,以提高响应速度。调度器及其动作列表的状态在请求之间不会重新初始化。在执行过程中启用或禁用动作项可能会导致在该模块用于后续客户端请求时出现意外结果。
3. Web Broker 应用程序的结构
当 Web 应用程序接收到一个 HTTP 请求消息时,它会创建一个 Web.HTTPApp.TWebRequest 对象来表示这个 HTTP 请求消息,以及一个 Web.HTTPApp.TWebResponse 对象来表示应该返回的响应。然后,应用程序将这些对象传递给 Web 调度器(可以是 Web 模块或 TWebDispatcher 组件)。
Web 调度器控制着 Web 服务器应用程序的流程。调度器维护着一个动作项(TWebActionItem)的集合,这些动作项(action items)知道如何处理特定类型的 HTTP 请求消息。调度器识别出合适的动作项或自动调度组件来处理 HTTP 请求消息,并将请求和响应对象传递给识别出的处理器,以便它执行任何请求的操作或制定响应消息。
动作项负责读取请求并组装响应消息。专门的内容包括生成器组件协助动作项动态生成响应消息的内容,这些内容可以包括自定义 HTML 代码或其他 MIME 内容。内容包括生成器可以利用其他内容包括生成器或 THTMLTagAttributes 的派生类来帮助它们创建响应消息的内容。
如果您正在创建一个实现 Web 服务的服务器,您的 Web 服务器应用程序可能包括一个自动调度组件,该组件将基于 SOAP 的消息传递给一个解释并执行它们的调用器。在尝试了所有动作项之后,调度器调用这些自动调度组件来处理请求消息。
当所有动作项(或自动调度组件)通过填写 TWebResponse 对象完成响应创建后,调度器将结果返回给 Web 应用程序。然后应用程序通过 Web 服务器将响应发送给客户端。