Web Broker(Web服务应用程序)入门教程(4)

1. 生成响应消息的内容


Web Broker 提供了一系列对象,以协助您的动作项生成 HTTP 响应消息的内容。您可以使用这些对象生成保存在文件中或直接发送回 Web 客户端的 HTML 命令字符串。您可以编写自己的内容生成器,继承自 Web.HTTPApp.TCustomContentProducer 或其某个派生类。

TCustomContentProducer 提供了一个通用接口,用于创建任何 MIME 类型作为 HTTP 响应消息的内容。其派生类包括页面生成器和表格生成器:

页面生成器扫描 HTML 文档,寻找特殊的标签,并将它们替换为定制的 HTML 代码。它们在“使用页面生成器组件”中有描述。
表格生成器基于数据集中的信息创建 HTML 命令。它们在“在响应中使用数据库信息”中有描述。

1.1 使用页面生成器组件


页面生成器(Web.HTTPProd.TPageProducer 及其派生类)采用一个 HTML 模板,并通过替换特殊的 HTML 透明标签来转换它,生成定制的 HTML 代码。您可以存储一组标准响应模板,当您需要生成对 HTTP 请求消息的响应时,由页面生成器填充这些模板。您可以通过将页面生成器链接在一起,通过逐步细化 HTML 透明标签来迭代构建 HTML 文档。

1) HTML 模板


HTML 模板是一系列 HTML 命令和 HTML 透明标签的序列。HTML 透明标签的形式为:

<#TagName Param1=Value1 Param2=Value2 ...>

尖括号(< 和 >)定义了标签的整个范围。井号(#)紧跟在开尖括号(<)之后,与尖括号之间没有空格。井号向页面生成器标识该字符串为 HTML 透明标签。标签名称紧跟在井号之后,与井号之间没有空格。标签名称可以是任何有效的标识符,并标识标签代表的转换类型。

在标签名称之后,HTML 透明标签可以可选地包含指定要执行的转换细节的参数。每个参数的形式为 ParamName=Value,参数名称、等号(=)和值之间没有空格。参数通过空格分隔。

尖括号(< 和 >)使标签对不认识 #TagName 结构的 HTML 浏览器透明。

使用 HTML 模板时,您将:

(1)可选地,使用预定义的 HTML 透明标签名称


虽然您可以创建自己的 HTML 透明标签来表示页面生成器处理的任何类型的信息,但有几个与 TTag 数据类型值相关的预定义标签名称。这些预定义标签名称对应于可能在响应消息中变化的 HTML 命令。它们在下表中列出:

标签名称TTag 值标签应转换为的内容
LinktgLink一个超文本链接。结果是一个以 <A> 标签开始,以 </A> 标签结束的 HTML 序列。
ImagetgImage一个图形图像。结果是一个 HTML <IMG> 标签。
TabletgTable一个 HTML 表格。结果是一个以 <TABLE> 标签开始,以 </TABLE> 标签结束的 HTML 序列。
ImageMaptgImageMap一个带有相关热区的图形图像。结果是一个以 <MAP> 标签开始,以 </MAP> 标签结束的 HTML 序列。
ObjecttgObject一个嵌入式 ActiveX 对象。结果是一个以 <OBJECT> 标签开始,以 </OBJECT> 标签结束的 HTML 序列。
EmbedtgEmbed一个 Netscape 兼容的附加 DLL。结果是一个以 <EMBED> 标签开始,以 </EMBED> 标签结束的 HTML 序列。

任何其他标签名称都与 tgCustom 相关联。页面生成器不提供预定义标签名称的内置处理。它们只是提供帮助,将应用程序的转换过程组织成许多更常见的任务。

注意:预定义的标签名称不区分大小写。

(2)指定 HTML 模板


页面生成器为您提供了许多指定 HTML 模板的选项。您可以将 HTMLFile 属性设置为包含 HTML 模板的文件名。您可以将 HTMLDoc 属性设置为包含 HTML 模板的 TStrings 对象。如果您使用 HTMLFile 属性或 HTMLDoc 属性来指定模板,您可以通过调用 Content 方法来生成转换后的 HTML 命令。

此外,您可以直接调用 ContentFromString 方法来转换作为参数传递的单个字符串的 HTML 模板。您也可以调用 ContentFromStream 方法从流中读取 HTML 模板。因此,例如,您可以将所有 HTML 模板存储在数据库的 memo 字段中,并使用 ContentFromStream 方法直接从 Bde.DBTables.TBlobStream 对象读取模板,以获得转换后的 HTML 命令。

(3)转换 HTML 透明标签


当您调用页面生成器的 Content 方法之一时,页面生成器会转换 HTML 模板。当 Content 方法遇到 HTML 透明标签时,它会触发 OnHTMLTag 事件。您必须编写一个事件处理程序来确定遇到的标签类型,并用定制的内容替换它。有关转换 HTML 透明标签的简单示例,请参见“从动作项使用页面生成器”。

如果您不为页面生成器创建 OnHTMLTag 事件处理程序,HTML 透明标签将被替换为空字符串。

(4)从动作项使用页面生成器


页面生成器组件的典型用法是使用 HTMLFile 属性指定包含 HTML 模板的文件。OnAction 事件处理程序调用 Content 方法将模板转换为最终的 HTML 序列:

procedure WebModule1.MyActionEventHandler(Sender: TObject; Request: TWebRequest;
  Response: TWebResponse; var Handled: Boolean);
begin
  PageProducer1.HTMLFile := 'Greeting.html';
  Response.Content := PageProducer1.Content;
end;
void __fastcall WebModule1::MyActionEventHandler(TObject *Sender,
  TWebRequest *Request, TWebResponse *Response, bool &Handled)
{
  PageProducer1->HTMLFile = "Greeting.html";
  Response->Content = PageProducer1->Content();
}

Greeting.html 是一个包含以下 HTML 模板的文件:

<HTML>
<HEAD><TITLE>Our Brand New Web Site</TITLE></HEAD>
<BODY>
Hello <#UserName>!  Welcome to our Web site.
</BODY>
</HTML>

OnHTMLTag 事件处理程序在执行期间替换 HTML 中的自定义标签(<#UserName>):

procedure WebModule1.PageProducer1HTMLTag(Sender : TObject;Tag: TTag;
  const TagString: string; TagParams: TStrings; var ReplaceText: string);
begin
  if CompareText(TagString,'UserName') = 0 then
    ReplaceText := TPageProducer(Sender).Dispatcher.Request.Content;
end;
void __fastcall WebModule1::HTMLTagHandler(TObject *Sender, TTag Tag,
  const AnsiString TagString, TStrings *TagParams, AnsiString &ReplaceText)
{
  if (CompareText(TagString,"UserName") == 0)
    ReplaceText = ((TPageProducer *)Sender)->Dispatcher->Request->Content;
}

如果请求消息的内容是字符串 Mr. Ed,Response.Content 的值将是:

<HTML>
<HEAD><TITLE>Our Brand New Web Site</TITLE></HEAD>
<BODY>
Hello Mr. Ed!  Welcome to our Web site.
</BODY>
</HTML>

注意:此示例使用 OnAction 事件处理程序调用内容生成器并分配响应消息的内容。如果您在设计时分配了页面生成器的 HTMLFile 属性,则无需编写 OnAction 事件处理程序。在这种情况下,您只需将 PageProducer1 作为动作项的 Producer 属性的值,即可实现与上述 OnAction 事件处理程序相同的效果。

5)链接页面生成器


HTTPProd.OnHTMLTag 事件处理程序的替换文本不一定是您想要在 HTTP 响应消息中使用的最终 HTML 序列。您可能想要使用多个页面生成器,其中一个页面生成器的输出是下一个页面生成器的输入。

链接页面生成器的最简单方式是将每个页面生成器与单独的动作项关联,所有动作项具有相同的 PathInfo 和 MethodType。第一个动作项从其内容生成器设置 Web 响应消息的内容,但其 OnAction 事件处理程序确保消息不被视为已处理。下一个动作项使用其关联生成器的 ContentFromString 方法来操作 Web 响应消息的内容,依此类推。之后的动作项使用如下的 OnAction 事件处理程序:

procedure WebModule1.Action2Action(Sender: TObject; Request: TWebRequest;
  Response: TWebResponse; var Handled: Boolean);
begin
  Response.Content := PageProducer2.ContentFromString(Response.Content);
end;
void __fastcall WebModule1::Action2Action(TObject *Sender,
  TWebRequest *Request, TWebResponse *Response, bool &Handled)
{
  Response->Content = PageProducer2->ContentFromString(Response->Content);
}

例如,考虑一个应用程序,它响应指定月份和年份的请求消息,返回日历页面。每个日历页面包含一张图片,然后是月份和年份的名称,夹在上个月和下个月的小图片之间,然后是实际的日历。生成的图片看起来像这样:

日历的一般形式存储在一个模板文件中。看起来像这样:

<HTML>
<Head></HEAD>
<BODY>
<#MonthlyImage> <#TitleLine><#MainBody>
</BODY>
</HTML>

第一个页面生成器的 OnHTMLTag 事件处理程序从请求消息中查找月份和年份。使用这些信息和模板文件,它执行以下操作:

- 将 `<#MonthlyImage>` 替换为 `<#Image Month=January Year=2000>`。
- 将 `<#TitleLine>` 替换为 `<#Calendar Month=December Year=1999 Size=Small> January 2000 <#Calendar Month=February Year=2000 Size=Small>`。
- 将 `<#MainBody>` 替换为 `<#Calendar Month=January Year=2000 Size=Large>`。

下一个页面生成器的 OnHTMLTag 事件处理程序使用第一个页面生成器产生的内容,并将 `<#Image Month=January Year=2000>` 标签替换为适当的 HTML `<img>` 标签。另一个页面生成器用适当的 HTML 表格解析 `#Calendar` 标签。

通过这种方式,您可以创建复杂的 HTML 页面,其中每个页面生成器负责处理页面的特定部分,从而实现模块化和高效的页面构建过程。这种链式页面生成器的方法允许您灵活地组合和重用页面组件,以生成动态内容。

总结来说,Web Broker 提供的页面生成器组件是强大的工具,可以帮助您生成定制的 HTTP 响应内容。通过使用 HTML 模板和事件驱动的标签替换机制,您可以创建动态的、数据驱动的 Web 页面,以满足您的应用程序需求。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caridle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值