跳转到内容

活动服务器页面/服务器端包含

来自 Wikibooks,开放世界中的开放书籍
上一页:使用 ADO 访问数据库 索引 下一页:附录 A:语言参考

在本章中,我们将讨论使用服务器端包含 (SSI) 来简化构建和维护网站的过程。为了获得最大的灵活性,我将 SSI 用于网站模板和通用代码模块(库)。

服务器端包含早在活动服务器页面被构思出来之前就已经存在了。基本上,它被设计为一个 Web 服务器扩展,用于查找包含在 HTML 注释中的特殊宏。几乎所有 Web 服务器都至少支持服务器端包含的某个子集。其中最有用的宏是“服务器端包含”。

因此,当访问一个网页时,Web 服务器首先会扫描访问者请求的源文件(或资源)。如果未找到处理宏,则该文件将直接交付给用户而无需修改。当找到宏时,Web 服务器将对宏进行适当的处理(用适当的结果完全替换 HTML 注释)。所有这些都在内容交付给用户(或远程主机)之前完成。

它做了什么

[编辑 | 编辑源代码]

我们在这里感兴趣的特定处理指令是服务器端包含。这允许您将另一个文档的内容导入到当前文档中。这对于重用 ASP 代码和 HTML 的通用块非常有用。最常见的用途之一是创建网站模板。

另一个流行的用途是创建可以在您需要它们的网页中包含的代码库。我通常创建一个所有页面都必须包含的通用站点库、一个页眉和页脚模板、一个数据库库、一个电子邮件库和一个表单处理库。通过重用通用代码,您可以消除在将代码从一个页面复制到另一个页面时可能发生的错误。

这里我们将讨论两种不同类型的服务器端包含:“虚拟包含”和“文件包含”。唯一的区别在于它们访问网站目录结构的方式。

虚拟包含

[编辑 | 编辑源代码]

虚拟包含将根据 Web 服务器的文档根目录导入另一个文件的内容。文件路径应以斜杠 (/) 开头,它表示网站的根目录(而不是文件系统的根目录)。

Internet Information Server(Microsoft Windows 的默认 Web 服务器)可能已配置为不允许您使用文件包含从父目录导入文件的内容。在这种情况下,您需要使用虚拟包含来完成此任务。

下面显示了一个虚拟包含的示例,用于将页眉页脚模板提取到当前页面中。在 HTML 注释(由<!---->分隔)中,您将看到处理指令(#include virtual)。引号内的路径和文件名是我们想要引入当前文档的资源。

<!-- #include virtual="/lib/header.asp" -->

<h1>Hello World</h1>

<!-- #include virtual="/lib/footer.asp" -->

需要注意的是,您可以将许多不同类型的文件导入到当前文档中。您应该意识到 Web 服务器只是将包含文件的内容直接替换到您的 HTML 文档中。此外,您不能在 ASP 代码块(由<%%>分隔)中嵌入任何预处理宏。

包含过程是递归的,因此,如果您包含一个//也包含//服务器端包含指令的文件,那么这些指令将被递归包含,以便处理所有宏。

文件包含

[编辑 | 编辑源代码]

另一种包含语句是#include file。此语句的工作原理与虚拟包含相同,只是文件路径必须相对于当前页面所在的目录。换句话说,您无法从文档根目录(即网站的根目录)开始访问目录结构。

下面是与之前相同的示例,其中虚拟包含已替换为文件包含。在 IIS 下运行此脚本时,您可能在尝试以这种方式访问父目录时遇到错误。因此,我更喜欢尽可能使用虚拟包含。

<!-- #include file="../lib/header.asp" -->

<h1>Hello World</h1>

<!-- #include file="../lib/footer.asp" -->

服务器端包含的替代方案

[编辑 | 编辑源代码]

活动服务器页面包含几个与服务器端包含类似的语句。这些语句也适用于与服务器端包含相同的用途。但是,没有一个是另一个的替代品。它们都有不同的用途,您应该知道何时使用每个用途。

Server.Execute

[编辑 | 编辑源代码]

这将从网站执行另一个活动服务器页面文件。您可以使用If Then ... End If语法有条件地执行此操作。这与服务器端包含语句不同,服务器端包含语句将在其出现的位置执行。

此语句与服务器端包含语句的另一个区别在于,在调用脚本中定义的所有变量、函数和类都无法在执行的脚本中访问。这是将其用作包含的一个巨大障碍,也是我更喜欢服务器端包含而不是此语句的主要原因。

If Application("ShowForum") Then
	Server.Execute("/module/forum.asp")
End If

我已成功使用此功能构建了一个模块化 Web 门户应用程序。通过控制面板,用户可以配置他们希望在其网站上显示哪些模块。模板引擎检查此配置,仅提取我们需要显示的模块并相应地安排布局。

Server.Transfer

[编辑 | 编辑源代码]

Server.Transfer语句类似于Execute,因为它在 Web 服务器上执行外部 ASP 文件。但是,与Execute不同,此函数不会将控制权返回给调用脚本。相反,控制权将转移到脚本,并且当脚本完成执行时,请求的处理将终止。

这对于用作重定向很有用。基本上,您在脚本中测试某些条件,并根据满足哪个条件将控制权转移到另一个脚本。因此,您可能有一个包含表单的登录页面,该表单发布到自身。如果用户登录已通过身份验证,您可以将处理转移到成员控制面板。

If bIsLoggedIn Then
	Server.Transfer("/account/index.asp")
End If

请注意,如果在到达Server.Transfer语句之前向浏览器输出了任何HTML,则新ASP文件的输出将附加到已输出的HTML中。虽然您可以使用ASP内置语句Response.Redirect执行标准重定向,但这将丢弃已输出的任何HTML并从头开始重建响应。

服务器端包含提供了一种强大的机制来重用Active Server Pages中的代码。您可以使用它来创建网站模板、代码库和HTML模块,这些模块可以在整个网站中重复使用。

两种类型的包含语句分别是虚拟包含文件包含。使用虚拟包含来包含ASP或HTML文件,使用以斜杠 (/) 开头的路径说明符表示网站的文档根目录。文件包含包含文件的內容,其路径说明符相对于调用脚本的目录。外部文件的内容将在处理任何ASP代码之前导入到原始文档中。

服务器端包含的替代方案包括Server.Execute语句,该语句将外部文件作为独立脚本执行,然后将其输出与调用脚本的输出组合在一起。另一种是Server.Transfer语句,它永久地将控制权传递给外部脚本(控制权永远不会返回)。

复习题

[编辑 | 编辑源代码]
  • 服务器端包含的作用是什么?
  • 服务器端包含的两种类型是什么?
  • 如果包含的文件包含服务器端包含会发生什么?
  • 服务器端包含的一些替代方案是什么?
  • 解释这些替代方案如何工作以执行外部ASP代码
  • 为一个非常简单的HTML模板创建包含文件(页眉和页脚)。
  • 编写一个虚拟服务器端包含以导入HTML模板文件。
  • 编写一些ASP代码来调用Server.Execute以显示天气模块。
  • 编写一些ASP代码来调用Server.Transfer以注销成员区域的用户。
上一页:使用 ADO 访问数据库 索引 下一页:附录 A:语言参考
华夏公益教科书