Active Server Pages+ 的预览 - 第 1 章:介绍 ASP+






4.83/5 (3投票s)
2000 年 11 月 28 日

95267
ASP.NET 入门
![]() |
|
尽管 Active Server Pages 3.0 的文档还未干透,微软就已经在全力开发其核心服务器端编程技术的下一代产品了。在本章中,我们将介绍这款新产品,并探讨它到底是什么。目前它被命名为 ASP+ Next Generation Web Services(尽管这个名字可能还会改变),我们将了解为什么我们需要新版本的 ASP,并探讨其设计和实现的背后概念。虽然本书主要面向有过 ASP 使用经验的开发人员,但我们将在本章开始探讨迁移到 ASP+ 时涉及的一些核心问题。
ASP+ 被设计为与早期版本的 ASP 向后兼容,仅在某些情况下需要进行微小改动(我们在附录中将进一步探讨这些)。然而,更重要的是,您可以将 ASP+ 安装在现有的 Windows 2000 服务器上,与 ASP 3.0 并存。这使得您可以在不要求独立“测试平台”服务器的情况下,尝试使用新版本。您可以继续使用现有的 ASP 应用程序,并在准备好时将它们迁移到 ASP+,这样您在 ASP 上的投资就不会损失。
但仅仅将应用程序移植到 ASP+ 只会为您带来新版本提供的部分优势。ASP+ 拥有许多新特性,提供了极大的易用性、更强大的功能和更好的
运行时效率,但要利用它们,您需要更深入地了解 ASP+ 的工作方式。
ASP+ 的工作原理。
由于我们是使用 ASP+ 的预览版本来撰写本书的,所以我们无法确切知道最终发布的全部功能。但感谢微软 ASP+ 团队提供的信息和协助,我们可以很有把握地认为本书的内容在最终版本中将是可靠且有用的。我们还将维护一个特殊的网站,可以从 http://www.wrox.com/beta 访问,在那里我们将记录 Beta 版和最终发布版出现的变化,并提供一些详细信息。
因此,在本章中,我们将涵盖:
- Active Server Pages 自问世以来的演进历程
- 新的运行时框架是什么
- ASP+ 与 ASP 的区别以及原因
- ASP+ 入门简要指南
- 最终发布版本中预期的一些变化
我们从回顾 ASP 和 ASP+ 的演进历程开始,这将有助于为理解和使用新产品打下基础。有关使用 COM+ 和早期 ASP 版本的信息,请参阅 Wrox 出版的 Professional ASP 3.0(ISBN 1-861002-61-0)。
Active Server Pages 的演进
尽管它似乎已经存在了很久,但 Active Server Pages 仅有三年多的历史。自 1996 年底问世以来,它迅速发展成为 Windows 环境中(以及在其他接受相同或类似语法实现的平台上,如 ChilliASP)服务器端 Web 编程的主要技术。但它并非凭空出现——其基础要追溯得更远。
动态服务器端 Web 编程
传统上,动态 Web 页面是通过服务器端可执行程序创建的。一种名为通用网关接口 (CGI) 的标准化 Web 服务器接口规范允许可执行程序访问来自客户端的传入请求中的所有信息。然后,程序可以生成构成返回页面(HTML、脚本代码、文本等)所需的所有输出,并通过 Web 服务器将其发送回客户端。
为了简化程序员的工作,并避免创建可执行程序,Perl 等语言使用一种接受基于文本的脚本文件的应用程序。程序员只需编写脚本,Web 服务器就会使用 Perl 解释器执行它。
Microsoft ISAPI 技术
微软在其 Web 服务器 Internet Information Server 中引入了另一种 Web 服务器接口。这就是 Internet Server Application Programming Interface (ISAPI),它与 CGI 不同,它允许动态链接库 (DLL) 中的编译代码被 Web 服务器直接执行。与 CGI 一样,代码可以访问客户端请求中的所有信息,并生成返回页面的完整输出。
微软 Web 领域的大部分开发都基于 ISAPI 接口。早期一个短暂的产品是 dbWeb,一种数据访问技术,它提供了一系列搜索、过滤和格式化功能,用于访问服务器上存储的数据以及与客户端进行交互。
第二个开发项目是 Internet Database Connector (IDC)。它受到了开发人员的极大欢迎——不仅因为它快速高效(与 dbWeb 不同),而且因为它更加通用且易于编程。IDC 引入了模板的概念,允许程序员轻松地将现有的 HTML 页面适配以使用其功能,并围绕它快速构建新应用程序。
IDC 为每个“页面”使用两个文本文件。第一个是一个简单的脚本,它定义了如何从服务器端数据库收集数据。本质上,它只是一个 SQL 语句加上一些配置信息。
{this is the query file named getuserlist.idc}
Datasource: GlobalExampleData
Username: examples
Password: secret
Template: getuserlist.htx
SQLStatement:
+ SELECT DISTINCT UserName
+ FROM Person ORDER BY UserName;
服务器执行此文件以获取结果记录集,然后加载模板文件。
{this is an extract from the template file named getuserlist.htx}
...
<TABLE>
<TR>
<TD>User name:</TD>
<TD>
<SELECT NAME=selUserName>
<%BeginDetail%>
<OPTION VALUE="<%UserName%>"><%UserName%>
<%EndDetail%>
</SELECT>
</TD>
</TR>
</TABLE>
...
模板只是一个普通的 Web 页面,包含 HTML、文本和其他对象,但其中插入了一个或多个特殊分隔的占位符。这些占位符的语法以及支持的其他简单程序代码结构,与 ASP 惊人地相似。当然,ASP 正是从这里演变而来的。
ASP 的版本
因此,在 1996 年初,Denali(ASP 的代号)作为 beta 版本 0.9 发布,它轰动了 Web 开发界。在 Web 页面内执行代码的能力既简单又强大。通过提供一系列可以执行高级功能的组件,尤其是 ActiveX Data Objects (ADO),创建各种动态页面几乎易如反掌。
Active Server Pages 1.0 的最终发布版本,作为 IIS 3.0 的附加组件可用,很快就在 Windows 平台上的各地得到使用。ASP 与 ADO 的结合使开发人员能够轻松地创建和打开数据库的记录集。毫无疑问,这是它快速被接受的主要因素之一,因为现在您可以在脚本中创建和打开数据库记录集,并几乎以任何方式、以任何顺序操作和输出任何值。
1998 年,微软发布了 ASP 2.0,作为免费的 Windows NT4 Option Pack 的一部分。此版本 ASP 与 1.0 版本的主要区别在于外部组件的实例化方式。使用 ASP 2.0 和 IIS 4.0,可以创建一个 ASP 应用程序,并在其中使其组件在自己的独立内存空间中运行(即进程外)。Microsoft Transaction Server (MTS) 的提供也使得构建可以参与事务的组件变得容易。
Windows 2000、COM+ 和 ASP 3.0
今年早些时候(2000 年),Windows 2000 发布了。它包含了 IIS 的 5.0 版本和 ASP 的 3.0 版本。除了 ASP 的一些小幅添加外,这里的核心区别实际上更多地与 COM+ 有关。在 Windows 2000 中,微软将 MTS 与核心 COM 运行时结合起来,创建了 COM+。它提供了许多新特性,使组件的使用更加方便,并提供了更稳定、可扩展和高效的执行平台。
除了管理界面的一些小改动外,IIS 的表面上变化不大。然而,在底层,它现在使用 COM+ 组件服务为组件提供更好的执行环境,包括默认的进程外执行以及在需要时运行每个组件的独立进程的选项。
ASP+ 和下一代 Web 服务框架
这一切都将我们带到了现在,ASP+。ASP+ 的底层结构与以前的版本有很大不同,尽管从“外部”(对开发人员而言)来看,它似乎提供了非常相似的接口。ASP+ 几乎完全是基于组件和模块化的,您使用的每个页面、对象和 HTML 元素都可以是运行时组件对象。
为了高效地执行并提供可扩展的解决方案,对这些对象的管理是很有必要的先决条件。新的运行时环境会自动进行这种管理,使 ASP+ 变得更加面向对象。这使得开发人员可以通过一种更加细粒度和可控的方式访问这些组件对象,从而构建更强大的应用程序。
此外,ASP+ 的面向对象特性为整个环境提供了可扩展性。开发人员可以通过创建新组件或继承创建它们的基类,以及覆盖选定的行为来扩展环境。在底层,COM+ 运行时会自动管理对象的实例化、池化和分配。
下一代 Web 服务框架
因此,COM+ 提供了一个操作系统服务的框架。但这并不是全部。ASP+ 实际上是一个全新的运行时框架的一部分,它为 Windows 中的各种应用程序提供支持。该框架是微软下一代 Web 服务 (NGWS) 的关键部分。当您安装它时,ASP+ 就会作为包的一部分。NGWS 框架还支持所有其他服务器端编程技术,例如新的托管组件服务、构建可执行应用程序和 Windows 服务的支持、访问性能计数器 API 和事件日志 API 等。
NGWS 框架通过为可扩展的分布式应用程序添加新的增强服务,扩展了我们用来创建可重用且可互操作的软件组件的组件对象模型 (COM) 体系结构。
- 统一、丰富的编程库集
- 安全、多语言的运行时引擎
- 简化的应用程序创建、部署和维护
- 提高分布式应用程序的可扩展性
- 保护现有软件和培训投资
我们将在下一节探讨它如何实现这一切。
NGWS 框架是什么?
ASP 集成到操作系统的方式与早期版本的 ASP 有显著不同,早期版本基本上只是操作系统的附加组件。到目前为止,ASP 是通过一个名为 asp.dll 的 ISAPI DLL,加上一些新的系统文件和作为包一部分的 ASP 用户组件(如浏览器功能组件)来实现的。
NGWS 框架反映了信息技术行业对创建、部署和维护各种 Web 服务(从简单的客户端应用程序到最复杂的分布式体系结构)需求的不断变化。整体概念和策略是 Windows 分布式 Internet 应用程序 (DNA) 体系结构的一部分。
然而,需要认识到的重要一点是,该框架不仅仅是为了 ASP+。它作为所有类型应用程序在 Windows 上构建的基础。下图展示了运行时框架如何支持 ASP+ 应用程序。
|
NGWS 框架提供了一个执行代码的引擎,以及一组可用于构建应用程序的面向对象的类/组件。它还充当应用程序与核心操作系统之间的接口。您可能会问,为什么我们需要这样一个层,因为现有应用程序可以很容易地与核心操作系统和服务进行通信。原因是它允许应用程序以标准化的方式充分利用操作系统,从而实现更快、更简单的开发——这在当今竞争激烈的商业环境中变得越来越必要。
为了实现这些目标,运行时框架实现了许多程序员或特定编程语言环境必须自行提供的功能。这包括自动垃圾回收、丰富的可重用对象库以满足最常见任务的需求,以及改进的应用程序安全性。当然,随着网络应用程序的普及,尤其是那些通过 Internet 运行的应用程序,最后一点变得越来越重要。
通用中间语言
然而,运行时框架提供的最大优势之一是语言中立的执行环境。所有代码,无论源语言如何,都会自动编译成标准的中间语言 (IL)——要么是按需编译,要么是在首次执行时编译(对于 ASP+)。然后,运行时框架创建构成应用程序的最终二进制代码并执行它。编译后的 IL 代码用于每次请求,直到源代码发生更改,此时缓存的版本将被使无效并丢弃。
因此,无论您使用 Visual Basic、C#、JScript、Perl 还是其他支持的语言,创建的中间代码都是(或应该)相同的。并且最终二进制对象代码的缓存提高了运行时效率和可扩展性。
C# 是微软专为下一代 Web 服务框架和 ASP+ 设计的新语言。它结合了 C++ 的强大功能和效率以及 Visual Basic 和 JScript 的简洁性。
这实现的一个成就是能够从一种语言调用到另一种语言,甚至可以继承用一种语言创建的对象,并在另一种语言中修改它们。例如,您可以在 VB 程序中继承用 C# 编写的对象,然后添加方法或属性,或者覆盖现有方法和属性。事实上,框架的部分内容以及整个 ASP+ 对象模型现在都内部使用 C# 而不是 C++ 来实现。
因此,新的运行时框架为编程任何类型的应用程序引入了一个真正的多语言平台。由于我们目前的大部分开发都集中在分布式应用程序领域,尤其是基于 Internet 和 Intranet 的应用程序,因此许多新特性都直接针对此类开发。
Web 应用程序基础设施
前图中高亮显示的三个部分(并在下图重复显示)是实现 ASP+ 本身的部分,也是我们本书关注的部分。 |
|
这三个部分共同实现了 Web 应用程序基础设施——这是我们本书关注的主题。结合新的运行时框架,它提供了一系列令人兴奋的新特性。
用户界面支持
作为 ASP+ 库的一部分,有大量智能的基于服务器的丰富控件,可用于快速简单地构建基于 Web 的用户界面。它们可以为低级别浏览器输出 HTML 3.2 代码,同时利用运行时库为 Internet Explorer 4 及以上版本等更丰富的客户端提供增强的交互性。
这些基于服务器的控件还可以重用,以构建由其他控件组成的控件,从而继承这些组成控件的实现和逻辑。
数据访问支持
NGWS 框架提供了一个新版本的 ADO,称为 ADO+,它提供了集成的服务来访问数据——无论数据的格式或位置如何。ADO+ 为关系数据提供了一个面向对象的视图,使开发人员能够快速方便地访问来自分布式源的数据。
ADO+ 还改进了对 XML 的支持,并在一定程度上依赖 XML。ADO+ 可以自动将记录集(或现在称为数据集)持久化到 XML 并从 XML 恢复。正如我们将看到的,这在使用 ASP+ Web 服务传递 Web 中的数据时特别有用。
分布式应用程序的可扩展性
任何 Web 应用程序的两个主要需求是健壮的操作系统平台和可扩展性,以处理大量并发请求。NGWS 运行时通过允许自动错误和过载检测来重新启动和管理当前正在使用的应用程序和组件,来提供这些功能。这可以防止有问题的代码或内存泄漏耗尽资源并导致服务器瘫痪。
还有新的和更新的系统和基础设施服务,包括自动内存管理和垃圾回收、自动持久化和封送,以及基于证据的安全。这些功能共同为更具可扩展性和可靠性的资源分配和应用程序处理提供了支持。
现有软件和培训投资
尽管核心操作系统和运行时发生了所有变化,但我们仍然非常谨慎地维护了与早期 Windows、COM 和 ASP 版本的向后兼容性。在大多数情况下,现有的应用程序、COM 和 COM+ 组件、ASP 页面以及其他脚本和可执行文件都可以在 NGWS 运行时下工作。或者,您可以根据业务需求,在您自己的时间更新它们。
所有 ASP+ 页面都具有 .aspx 文件扩展名,该扩展名映射到 ASP+ 运行时框架。这使得具有 .asp 文件扩展名的页面可以在现有的 ASP 运行时下保持不变地运行。
ASP+ 与 ASP 有何不同?
在概述了 ASP+ 如何成为操作系统一部分之后,我们需要看看另一个方面。ASP+ 与早期版本的 ASP 有何不同,又为何不同?而且到底有多大不同?好吧,如果您只想运行现有页面和应用程序,您可能根本不会注意到太多差异。然而,一旦您打开 ASP+ SDK 或帮助文件,您就会看到一个全新的、看起来一点也不熟悉的世界。
不要惊慌!我们将在下一节中介绍主要区别。我们将首先探讨为什么微软决定我们需要一个新版本的 ASP,以及它将如何帮助您作为开发人员,在创建 Web 站点和应用程序时满足未来的需求。接下来,我们将提供一个 ASP+ 主要新特性清单,然后详细检查每个特性。本书的其余部分将逐一介绍新特性,解释如何使用它们。
为什么我们需要新版本的 ASP?
在本章的引言中,我们列出了微软在设计和开发 ASP+ 时的主要动机。毕竟,考虑到 ASP 如此成功,为什么我们需要一个新版本?实际上有四个主要问题需要考虑。
- 目前,ASP 只能使用 VBScript 和 JScript 等基本非类型化语言进行脚本编写(除非您安装了单独的语言解释器)。虽然 ASP 在首次执行时会解析并缓存页面代码,但这些限制阻止了像 Visual Basic 和 C++ 这样的强类型语言在其中具有优势的情况下使用。ASP+ 为 Web 应用程序提供了真正的语言中立执行框架。
- 创建包含代码、HTML、文本、对象声明等混合在一起的巨大 ASP 页也非常容易,而且很难重用代码,除非将其放入单独的“include”文件中——这不是最好的解决方案。在许多环境中,Web 应用程序的开发需要广泛的专业人员技能,例如,有程序员编写代码,有设计师使 HTML 看起来美观。将代码和内容混合在同一个文件中,这两个群体都需要操作,这使得他们难以协同工作。ASP+ 允许真正分离代码和内容。
- 在早期版本的 ASP 中,您几乎必须编写代码来完成几乎所有事情。想在表单字段中维护状态?编写代码。想验证客户端输入的数据?编写代码。想发出一些简单的数据值?编写代码。想缓存页面区域以优化性能?编写代码。ASP+ 引入了一个真正的组件模型,具有基于服务器的控件和事件驱动的执行范例,其概念类似于 Visual Basic 的“Form”工作方式。新的 ASP+ 服务器控件是声明性的(即,您只需声明它们就能让它们做某事),因此您实际编写的代码更少——实际上,在许多情况下您根本不需要编写任何代码!
- 外面的世界正在变化。通过“Internet 设备”(如手机、个人数字助理 (PDA)、电视机顶盒、游戏机等)访问您网站的用户比例,将很快超过使用 PC 和传统 Web 浏览器的用户数量。这意味着我们可能必须准备在服务器端做更多工作,以使我们的页面适合特定设备。我们还必须以各种新格式创建输出,例如无线标记语言 (WML)。此外,除了创建用于渲染的 WML 外,新的 Internet 设备和业务应用程序将能够从 Web 应用程序发送和接收 XML 数据。今天从 ASP 中执行此操作需要您手动使用 XML 解析器,转换 XML 模式的数据等。ASP+ Web 服务使这变得容易得多。
除此之外,分布式应用程序快速变化的性质需要更快的开发、更多的组件化和可重用性、更轻松的部署以及更广泛的平台支持。诸如简单对象访问协议 (SOAP) 等新标准,以及企业对企业 (B2B) 数据交换等新的商业需求,需要使用新技术来生成输出并与其他系统通信。Web 应用程序和 Web 站点还需要提供更健壮和可扩展的服务,ASP+ 通过主动监控和在发现故障、内存泄漏等时自动重启应用程序来提供这些服务。
因此,为了满足所有这些需求,ASP 被彻底改版,成为一个全新的编程环境。虽然目前可用的工具还不多,但 Visual Studio 7.0 将提供对构建 ASP+ 应用程序(包括 ASP+ 页面和 ASP+ 服务)的全面支持。
丰富、基于组件、事件驱动的编程模型专门设计为“工具友好”,并且所有 Visual Studio 语言(包括 VB、C++ 和 C#)都将支持这种模型。而且可以肯定的是,第三方工具制造商也不会落后。
ASP+ 的主要优势
当今 Web 开发人员面临的最大挑战无疑是持续存在的浏览器兼容性问题,以及他们必须创建的页面的日益增长的复杂性。试图构建更多交互式页面,使用每个浏览器的最新功能,同时确保页面在所有流行浏览器上都能正常工作,这是一场挥之不去的噩梦。
当然,随着新的 Internet 设备(即将到来或已到来)的出现,情况只会变得更糟。特别是,试图为蜂窝电话和传统浏览器客户端提供相同用户级功能的页面几乎是不可能的。许多蜂窝电话的仅文本显示(12 字符 x 3 行)确实限制了创造力和用户交互。
一个显而易见的解决方案是动态创建针对每个特定客户端的输出——或者创建同一网站的多个版本,每个版本针对一种客户端。第二个选项并不吸引人,大多数开发人员会选择第一个。然而,这隐含着每次用户点击都将需要服务器端处理来确定创建什么输出。
如果是这样,为什么不自动化大部分过程呢?为此,ASP+ 引入了服务器控件的概念,它们封装了常见的任务并提供了一个清晰的编程模型。它们还有助于管理所有不同类型客户端的定位。
服务器端 HTML 控件——减少代码量
ASP 一直提供在服务器上执行组件的机会,这些组件可以生成返回给用户的页面部分。ASP+ 通过服务器控件扩展了这一概念。将任何 HTML 元素变成服务器控件所需做的就是添加一个额外的属性:runat="server"。
页面中的任何 HTML 元素都可以这样标记,然后 ASP+ 将在服务器上处理该元素,并可以生成适合该特定客户端的输出。作为副产品,我们可以执行额外的技巧——特别是使用 HTML <form> 和相关的表单控件元素,我们可以创建代码来在与服务器的往返过程中管理状态。这使得编程体验不那么单调,生产力也大大提高。
虽然服务器上执行的 HTML 元素的概念一开始可能有点奇怪,但您会发现它为页面增加了一个全新的功能层,并使其编写起来更简单。程序员还能想要什么?
维护状态的问题
创建交互式 Web 站点和应用程序时,最繁琐的任务之一是管理从 HTML 表单控件传递到服务器的值,以及在页面请求之间维护这些控件中的值。因此,ASP+ 的核心目标之一是简化这项编程任务。这不需要程序员付出额外的努力,并且适用于所有支持基本 HTML 及以上版本的浏览器。
看看下面的代码片段。它创建了一个使用 HTML 控件的简单表单,用户可以在其中输入计算机名称并选择操作系统。好的,这本身并不是一个非常令人兴奋的例子,但它说明了一个如今几乎所有 Web 应用程序都使用的常见场景。当表单页面提交到服务器时,用户选择的值将从 Request.Form 集合中提取,并使用 Response.Write 方法显示。页面中重要的部分在代码列表中突出显示。
<html>
<body>
<%
If Len(Request.Form("selOpSys")) > 0 Then
strOpSys = Request.Form("selOpSys")
strName = Request.Form("txtName")
Response.Write "You selected '" & strOpSys _
& "' for machine '" & strName & "'."
End If
%>
<form action="pageone.asp" method="post">
Machine Name:
<input type="text" name="txtName">
<p />
Operating System:
<select name="selOpSys" size="1">
<option>Windows 95</option>
<option>Windows 98</option>
<option>Windows NT4</option>
<option>Windows 2000</option>
</select>
<p />
<input type="submit" value="Submit">
</form>
</body>
</html>
尽管这是一个 ASP 页面(文件扩展名是 .asp 而不是 .aspx),如果我们将其扩展名更改为 .aspx,它在 ASP+ 下也能正常工作。请记住,这两个系统可以很自由地在同一台机器上共存,文件扩展名仅决定是由 ASP 还是 ASP+ 来处理它。
此屏幕截图显示了它在 Internet Explorer 5 中的外观。当用户单击“提交”按钮将值发送到服务器时,页面会重新加载并显示选定的值。当然,在实际应用程序中,一些值可能会存储在数据库中,或者用于执行一些特定于应用程序的处理——在这个例子中,我们只是在页面中显示它们。 |
|
一个问题是页面不维护其状态,换句话说,控件会恢复到它们的默认值。用户必须重新输入才能再次使用表单。您可以在下一个屏幕截图中看到这一点。 |
|
为了解决这种情况,我们必须在页面中添加额外的 ASP 代码,以便在页面重新加载时将值插入控件中。对于文本框,只需设置 value 属性并使用一些内联 ASP 代码,使用 HTMLEncode 方法来确保任何非合法 HTML 字符都得到正确编码。然而,对于 <select> 列表,我们需要做一些工作来找出选择了哪个值,并为该特定 <option> 元素添加 selected 属性。所需更改如下所示。
<html>
<body>
<%
If Len(Request.Form("selOpSys")) > 0 Then
strOpSys = Request.Form("selOpSys")
strName = Request.Form("txtName")
Response.Write "You selected '" & strOpSys _
& "' for machine '" & strName & "'."
End If
%>
<form action="pageone.asp" method="post">
Machine Name:
<input type="text" name="txtName"
value="<% = Server.HTMLEncode(Request("txtName")) %>">
<p />
Operating System:
<select name="selOpSys" size="1">
<option
<% If strOpSys = "Windows 95" Then Response.Write " selected" %>
>Windows 95</option>
<option
<% If strOpSys = "Windows 98" Then Response.Write " selected" %>
>Windows 98</option>
<option
<% If strOpSys = "Windows NT4" Then Response.Write " selected" %>
>Windows NT4</option>
<option
<% If strOpSys = "Windows 2000" Then Response.Write " selected" %>
>Windows 2000</option>
</select>
<p />
<input type="submit" value="Submit">
</form>
</body>
</html>
现在,当页面重新加载时,控件会维护其状态并显示用户选择的值。 |
|
此名为 pageone.asp 的页面位于本书示例的 Chapter01 目录中。您可以从我们的网站 http://www.wrox.com 下载所有示例文件。
自动维护状态的控件
那么,ASP+ 在这种常见情况下如何帮助我们呢?下一个列表显示了利用 ASP+ 服务器控件自动保留其状态所需的更改。我们仍然使用 Response.Write 方法来显示选定的值。然而,这一次页面上的一些元素添加了特殊的 runat="server" 属性。当 ASP+ 遇到这些元素时,它会在服务器上处理它们,并为客户端生成适当的 HTML 输出。
<html>
<body>
<%
If Len(Request.Form("selOpSys")) > 0 Then
strOpSys = Request.Form("selOpSys")
strName = Request.Form("txtName")
Response.Write("You selected '" & strOpSys _
& "' for machine '" & strName & "'.")
End If
%>
<form runat="server">
Machine Name:
<input type="text" id="txtName" runat="server">
<p />
Operating System:
<select id="selOpSys" size="1" runat="server">
<option>Windows 95</option>
<option>Windows 98</option>
<option>Windows NT4</option>
<option>Windows 2000</option>
</select>
<p />
<input type="submit"\ value="Submit">
</form>
</body>
</html>
您可以清楚地看到,这个 ASP+ 页面比上一个示例简单得多。当加载到 Internet Explorer 5 中并提交值到服务器时,结果看起来完全相同。 |
|
此名为 pageone.aspx 的页面位于本书示例的 Chapter01 目录中。您可以从我们的网站 http://www.wrox.com 下载所有示例文件。
服务器端控件如何工作?
这是如何实现的?关键是 runat="server" 属性。为了了解发生了什么,请从浏览器中查看页面的源代码。它看起来像这样。
<html>
<body>
You selected 'Windows 98' for machine 'tizzy'.
<FORM name="ctrl0" method="post" action="pageone.aspx" id="ctrl0">
<INPUT type="hidden" name="__VIEWSTATE" value="a0z1741688109__x">
Machine Name:
<INPUT type="text" id="txtName" name="txtName" value="tizzy">
<p />
Operating System:
<SELECT id="selOpSys" size="1" name="selOpSys">
<OPTION value="Windows 95">Windows 95</OPTION>
<OPTION selected value="Windows 98">Windows 98</OPTION>
<OPTION value="Windows NT4">Windows NT4</OPTION>
<OPTION value="Windows 2000">Windows 2000</OPTION>
</SELECT>
<p />
<input type="submit" value="Submit">
</FORM>
</body>
</html>
我们编写了这段 ASP+ 代码来创建页面中的 <form>。
<form runat="server">
...
</form>
当页面由 ASP+ 执行时,发送到浏览器的输出是:
<FORM name="ctrl0" method="post" action="pageone.aspx"
id="ctrl0">
...
</FORM>
您可以看到 action 和 method 属性是由 ASP+ 自动创建的,以便表单中的控件值将被 POST 回同一个页面。ASP+ 还添加了一个唯一的 id 和 name 属性,因为我们没有提供。但是,如果您指定了这些,则将使用您指定的值。
如果您包含 method="GET" 属性,则表单内容将作为查询字符串的一部分发送到服务器,就像早期版本的 ASP 一样,自动状态管理将不再起作用。
在表单内部,我们编写了这段 ASP+ 代码来创建文本框。
<input type="text" id="txtName" runat="server">
浏览器中的结果是:
<INPUT type="text" id="txtName" name="txtName"
value="tizzy">
您可以看到 ASP+ 自动添加了 value 属性,其中包含表单提交时控件中的文本值。它还保留了我们提供的 id 属性,并添加了一个具有相同值的 name 属性。
对于 <select> 列表,我们编写了这段代码。
<select id="selOpSys" size="1" runat="server">
<option>Windows 95</option>
<option>Windows 98</option>
<option>Windows NT4</option>
<option>Windows 2000</option>
</select>
ASP+ 遵从,输出了这段 HTML,其中在适当的
<option> 元素中包含 selected 属性。
<SELECT name="selOpSys" id="selOpSys" size="1">
<OPTION value="Windows 95">Windows 95</OPTION>
<OPTION selected value="Windows 98">Windows 98</OPTION>
<OPTION value="Windows NT4">Windows NT4</OPTION>
<OPTION value="Windows 2000">Windows 2000</OPTION>
</SELECT>
同样,创建了一个唯一的 id 属性,并且 <option> 元素自动添加了匹配的 value 属性。(但是,如果我们提供了自己的 value 属性,它们将被保留。)
页面 VIEWSTATE
另一个变化是 ASP+ 自动向表单添加了一个 HIDDEN 类型控件。
<INPUT type="hidden"
name="__VIEWSTATE" value="a0z1741688109__x">
这就是 ASP+ 如何跨多个请求存储页面状态的本地变化——即,在 Web 请求之间不会自动在浏览器和服务器之间发送的事物。例如,如果服务器控件的背景颜色已被修改,它将使用 VIEWSTATE 隐藏字段在请求之间记住这一点。每次将表单回发到原始页面时都会使用 VIEWSTATE 字段。在第 2 章中,我们将更详细地讨论此主题。
因此,正如您所见,实际上没有“魔法技巧”。它都是标准的 HTML,**没有**客户端脚本库,**没有** ActiveX 控件或 Java Applet。同样重要的是,**绝对** **没有****状态**存储在服务器上。相反,值只是使用标准方法 POST 到服务器。值通过服务器控件在页面发送到客户端之前修改 HTML 来在请求之间简单地保存和维护。
ASP+ 中的服务器端代码
为了在页面中显示值,我们使用了与前面 ASP 示例中非常相似的代码。
...
If Len(Request.Form("selOpSys")) > 0 Then
strOpSys = Request.Form("selOpSys")
strName = Request.Form("txtName")
Response.Write("You selected '" & strOpSys _
& "' for machine '" & strName & "'.")
End If
...
但是,ASP+ 和服务器控件的另一个伟大特性是它们可用于运行在服务器上的创建页面输出的代码。ASP+ 解释器强制要求每个控件都有一个唯一的 id 属性,因此**所有**服务器控件(即具有 runat="server" 属性的元素)都可以被代码访问。这意味着我们不再需要访问 Request 集合来获取从表单控件回发到服务器的值——我们可以通过其唯一的 id 直接引用它们。
...
If Len(selOpSys.value) > 0 Then
Response.Write("You selected '" & selOpSys.value _
& "' for machine '" & txtName.value & "'.")
End If
...
ASP+ 中的 Visual Basic 代码
在我们刚才看到的 ASP 页面中,脚本被假定为 VBScript(我们没有指定它,并且 VBScript 是默认的,除非您更改服务器设置)。在 ASP+ 中,不支持 VBScript。相反,默认语言是 Visual Basic(“VB”),它是 VBScript 的超集。因此,我们的代码被编译成 IL 并由运行时执行。
ASP+ 中包含的 Visual Basic 的编译器和运行时是新的 7.0 版本(好消息——您无需购买单独的副本!)。这有一些含义,我们在本书附录 B 中进行了总结。
立即需要注意的最重要一点是,VB7 中的所有方法调用都必须将参数列表括在括号中(类似于 JScript 和 JavaScript)。在 VBScript 和早期版本的 VB 中,不需要这样做——在某些情况下会导致错误。您可以看到我们在示例中将 Response.Write 方法的参数括在括号中。
其次,VB7 没有“默认”方法或“默认”属性的概念,因此我们现在必须提供方法或属性名。您可能在处理 ADO 记录集时首先遇到这一点,其语法必须是
fieldvalue = objRecordset.Fields("fieldname").value
服务器端事件处理——更好的代码结构
当然,如果我们有在服务器上执行的 HTML 元素,为什么不进一步扩展这个概念呢?ASP+ 将每个页面转换为服务器端对象,并公开更多可在代码中使用以动态创建内容的属性、方法和事件。每个页面都变成了一个 COM+ 对象树,可以根据需要单独访问和编程。
使用服务器端控件事件
为了了解如何利用这一点来更优雅地构建我们的页面,请看下面的代码。它显示了我们在上一个示例中使用的 ASP+ 页面,但做了一些更改。此版本的页面名为 pagetwo.aspx。
<html>
<body>
<script language="VB" runat="server">
Sub ShowValues(Sender As Object, Args As EventArgs)
divResult.innerText = "You selected '" _
& selOpSys.value & "' for machine '" _
& txtName.value & "'."
End Sub
</script>
<div id="divResult" runat="server"></div>
<form runat="server">
Machine Name:
<input type="text" id="txtName" runat="server">
<p />
Operating System:
<select id="selOpSys" size="1" runat="server">
<option>Windows 95</option>
<option>Windows 98</option>
<option>Windows NT4</option>
<option>Windows 2000</option>
</select>
<p />
<input type="submit" value="Submit"
runat="server" onserverclick="ShowValues">
</form>
</body>
</html>
首先,请注意我们将内联 ASP+ 代码替换为 <script> 部分,其中指定 VB 作为语言,并包含 runat="server" 属性。在其中,我们编写了一个名为 ShowValues 的 Visual Basic 函数。在 ASP+ 中,函数和子例程必须放在服务器端 <script> 元素内,而不是放在通常的 <%...%> 脚本分隔符中——我们将在下一章中更详细地讨论这一点。
我们还向页面添加了一个 HTML <div> 元素,包括 runat="server" 属性。因此,该元素将在服务器上创建,并且可以被运行在那里的代码访问。当 VB 子例程执行时,它将设置这个 <div> 元素的 innerText 属性。
同时请注意,它是如何获取所需的值(例如,由用户提交的值)的。因为文本框和 <select> 列表也在服务器上运行,我们的代码可以通过访问这些控件的值属性来直接提取值。当页面被执行并在客户端渲染时,创建的 <div> 元素如下所示。
<div id="divResult">You selected 'Windows NT4' for machine 'lewis'.</div>
将服务器端控件事件连接到您的代码
现在您应该想知道 VB 子例程实际上是如何执行的。很简单——在创建提交按钮的 <input> 元素中,我们添加了两个新属性。
<input type="submit" value="Submit"
runat="server" onserverclick="ShowValues">
runat="server" 属性将 HTML 元素转换为服务器端控件,“可见”因此在服务器上的 ASP+ 中是可编程的。然后 onserverclick="ShowValues" 属性告诉运行时,当按钮被单击时,它应该执行 ShowValues 子例程。请注意,HTML 控件的服务器端事件名称包含“server”一词,以区别于客户端等效项(即,调用客户端事件处理程序的 onclick)。
结果是一个与前一个示例工作方式相同的页面,但 ASP+ 源现在具有更结构化、更“干净”的格式。它使代码更易读,并且仍然提供相同的结果——无需任何客户端脚本或浏览器提供的特殊支持。如果您在浏览器中查看源代码,您会发现它完全相同。 |
|
此名为 pagetwo.asp 的页面位于本书示例的 Chapter01 目录中。您可以从我们的网站 http://www.wrox.com 下载所有示例文件。
我们将在第 2 章中看到如何通过将代码完全分离来进一步改进结构。而且,更好的是(与早期版本的 ASP 一样),我们可以将自己的自定义组件添加到页面,或者利用 NGWS 框架随附的一系列服务器端组件。
其中许多可以定制以创建特定于客户端类型的输出,并由页面中的模板内容控制。
ASP+ 应用程序框架
作为 ASP+ 模块化的副产品,开发人员还可以访问底层运行时框架,如果他们需要比 ASP+ 页面本身更低级别的操作。除了通过传统的 ASP 对象(如 Form、QueryString、Cookies 和 ServerVariables)提供的信息外,开发人员还可以访问执行运行时处理的底层对象。
这些对象包括整个页面上下文、处理请求的 HTTPModules 和 RequestHTTPHandler 对象。还可以访问原始数据流,这对于管理文件上传和其他类似的特定任务非常有用。我们将在第 6 章中详细探讨整个主题。
编译和丰富的语言支持——增强的性能
当页面或 Web 服务首次被客户端激活时,ASP+ 会动态编译代码,缓存它,然后为所有后续请求重用此缓存代码,直到原始页面发生更改——届时编译后的代码版本将被使无效并从缓存中删除。您可以看到,第一次执行 ASP+ 页面时会出现延迟,而后续请求的响应几乎是即时的。
由于编译到的是中间语言(而不是处理器级别的二进制代码),只要编译器输出此中间语言的代码,就可以使用任何语言。事实上,许多独立供应商已经在开发不同的语言(包括 Cobol)。
而且,由于中间语言代码在各种语言之间是通用的,每种语言都可以继承所有其他语言并调用最初用所有其他语言编写的例程。运行时提供的有效组件管理服务也确保了页面中编译后的代码执行效率比使用早期版本的 ASP 要高得多。
新功能清单
ASP+ 相较于早期版本 ASP 的主要功能包括:
- 使用新的服务器端控件的页面,用于自动化页面中的状态管理,并减少您需要编写的代码。因为 ASP+ 页面具有与 VB Forms 相似的编程模型,所以我们也称 ASP+ 页面为 Web Forms。
- HTML 服务器端控件可用于在页面输出中生成 HTML 元素,并允许使用代码在运行时设置这些控件的属性(即特性)。它们还允许检测由元素引发的事件,并在服务器上响应这些事件执行相应的代码。
- 在服务器上运行的丰富控件可用于在页面输出中创建更复杂的 HTML 元素和对象。ASP+ 包括一个日历控件和一系列网格、表格和列表控件。这些控件还可以利用服务器端数据绑定以值填充它们。
- Web 服务允许开发人员创建通常不呈现为可见输出的类,而是为客户端提供服务。例如,它们可以包含在响应请求时返回特定值的函数。
- 配置和部署现在更加容易,使用了人类可读的 XML 格式配置文件。组件不再需要在服务器上注册(不再需要 regsvr32!),并且可以使用文件复制命令、FrontPage 服务器扩展或 FTP 来部署应用程序。
- 应用程序和会话状态管理已扩展,为存储特定于客户端和应用程序的值提供了持久化且更具可扩展性的环境。特别地,用户会话状态现在可以轻松地在 Web 场中维护。
- 错误处理、调试和跟踪功能已大大扩展和改进。每个页面都可以有自己的“错误页面”,并且还可以显示页面代码在执行时使用的值——提供“跟踪”功能。调试也可以跨语言进行——允许您从一种语言无缝地单步调试到另一种语言,例如,从 VB 页面中的代码到 C++ 组件。
- 安全管理功能现在允许使用多种不同类型的登录和用户身份验证。代替默认的浏览器登录提示(使用 Windows 2000 和 NTLM 身份验证),可以创建自定义登录页面并由 ASP+ 管理。根据用户所属的角色或组管理用户也更加容易。
- 自定义服务器端缓存允许开发人员在服务器本地存储各种值和对象,供 ASP+ 页面使用。运行时还可以缓存 ASP+ 页面的**输出**。这可以在动态创建的页面对许多访问者都相同的场景中提供巨大的性能提升,例如产品目录。
- ASP+ 附带了一系列有用的组件。这些类库可以帮助简化 Web 应用程序的编写。例如包括:“SendMail”组件、加密/解密组件、定义自定义性能计数器的组件、读写 NT 事件日志的组件、处理 MSMQ 的组件、网络访问组件(WinInet 的替代品)、数据访问组件等。
诸如内在的 Request 和 Response 对象(以及它们实现的 Form、QueryString、Cookies 和 ServerVariables 集合)等功能与早期版本的 ASP 兼容。但是,它们获得了许多新的属性和方法,使得构建应用程序更加容易。还可以访问 ObjectContext 对象供任何现有 ASP 组件使用。但是,内在的 ASP 对象以及影响现有页面、组件和应用程序在 ASP+ 下性能的其他问题,都有一些新的方法和属性可用。请参阅附录 A 以获取更多详细信息。
ASP+ 页面
ASP+ 页面将在第 2、3 和 4 章中详细介绍。ASP+ 页面提供的四大优势是:
- 控件可以封装可重用的功能。这使得它们可以自动化和简化在早期 ASP 版本中需要特定编码的许多常见编程任务,例如状态管理、验证、数据操作等。
- 代码更“干净”,易于阅读。代码在服务器控件中的封装,加上在页面中使用适当事件处理技术的能力,允许更结构化的设计。先前经过测试和优化的控件的可重用性也意味着开发速度更快。
- 对代码和用户界面开发工具有更好的支持。这些工具可以提供真正的所见即所得页面编辑、控件属性管理以及轻松访问控件的方法和事件。
- 它消除了 ASP 对非类型化脚本语言(如 VBScript 和 JScript)的依赖。代码可以用 ASP+ 支持的任何语言编写,例如 Visual Basic、C++、C#、Perl 等。它也可以作为独立模块编写并在页面中使用,而不是像传统的内联代码那样。
ASP+ 控件系列
ASP+ 提供一系列新的服务器控件,可以在 ASP+ 页面中实例化。从开发者的角度来看,使用这些控件的优势在于,可以对客户端控件引发的事件执行服务器端处理。
ASP+ 提供的服务器控件分为四大类或“系列”:
- 内在控件,它们在客户端创建 HTML 风格的元素。它们可以创建智能控件,自动维护状态并提供额外功能,或者只是纯 HTML 元素。
- 列表控件,它们可以自动在客户端生成各种列表。结合服务器端数据绑定,它们还可以使用几行代码以来自数据库、XML 文件等的数据填充列表。
- 丰富控件输出客户端 HTML,在某些情况下还输出客户端脚本,以在客户端创建更复杂的控件类型或界面元素。例如,“日历”控件,它会检测浏览器类型并创建相应的代码来补充该浏览器的功能。
- 验证控件是不可见的控件,它们可以轻松地在创建用户填写并提交到服务器的表单时执行客户端或服务器端验证。有多种此类控件,可以轻松执行复杂的验证。
所有这些控件都旨在生成可在任何 Web 浏览器上运行的输出(您将在本书的几个地方看到演示)。不需要客户端 ActiveX 控件或 Java Applet。我们将在下一节中更详细地介绍每种控件类型。
ASP+ 内在控件
在本章前面看到的示例中,我们看到了 ASP+ 如何提供一系列智能的内在控件。换句话说,它们可以在服务器上执行以生成包含事件处理和状态维护(控件显示的数值)的输出。在第 2、3 和 4 章中,我们将更详细地探讨如何使用这些控件,并探索它们的各种功能。
然而,为了概述新的 ASP+ 内在控件的目标,我们可以说它们服务于三个主要目的:
- 它们允许开发人员在创建页面时在服务器上与控件交互,特别是通过设置属性值或响应在客户端引发的事件。
- 它们会自动创建适当的 HTML 来保留其当前状态,以便在页面重新加载时显示用户选择的正确值,而无需开发人员编写代码来执行此操作。
- 它们通过将这些任务所需的重复代码封装在控件中,使开发更简单快捷,并促进重用和更好的页面设计与结构。
基本的内在控件通过简单地在页面中插入等效的 HTML 来使用,就像在早期版本的 ASP 中一样,但添加了 runat="server" 属性。在 ASP+ 的预览版本中实现为特定对象的元素是:
<table> |
<tr> |
<th> |
<td> |
<form> |
<input> |
<select> |
<textarea> |
<button> |
<a> |
<img> |
与 HTML 一样,<input> 服务器控件取决于 type 属性的值。控件创建的输出当然因值而异。
ASP+ 页面中的所有其他带有 runat="server" 属性的 HTML 元素都由一个通用的 HTML 服务器控件处理。它根据元素本身以及您提供的或在页面创建时在服务器端设置的任何属性来创建输出。
还有一组新的 ASP+ 控件可以在页面内定义,并且以“asp”命名空间为前缀。这些控件公开的属性对应于等效 HTML 元素的标准可用属性。与所有服务器控件一样,您可以在页面的服务器端 Load 事件中设置这些属性,或者像往常一样将它们作为属性添加,但使用特殊的属性名称。当渲染到客户端时,属性将被转换为等效的 HTML 语法。
例如,要创建一个 ListBox 控件实例,我们可以使用:
<asp:ListBox rows="3" runat="server">
<asp:ListItem>Windows 98</asp:ListItem>
<asp:ListItem>Windows NT4</asp:ListItem>
<asp:ListItem>Windows 2000</asp:ListItem>
</asp:ListBox>
在运行时(预览版中),上面的 ASP+ 代码会创建以下 HTML,并将其发送到客户端:
<SELECT name="ListBox0" size="3">
<OPTION value="Windows 98">Windows 98</OPTION>
<OPTION value="Windows NT4">Windows NT4</OPTION>
<OPTION value="Windows 2000">Windows 2000</OPTION>
</SELECT>
“asp”前缀的内在控件摘要如下:
ASP+ 内在控件 |
HTML 输出元素 |
<asp:Button> |
<input type="submit"> |
<asp:LinkButton> |
<a href="jscript:__doPostBack(...)">...</a> |
<asp:ImageButton> |
<input type="image"> |
表格继续显示在下一页
ASP+ 内在控件 |
HTML 输出元素 |
<asp:HyperLink> |
<a href="...">...</a> |
<asp:TextBox> |
<input type="text" value="..."> |
<asp:CheckBox> |
<input type="checkbox"> |
<asp:RadioButton> |
<input type="radio"> |
<asp:DropDownList> |
<select>...</select> |
<asp:ListBox> |
<select size="...">...</select> |
<asp:Image> |
<img src="..."> |
<asp:Label> |
<span>...</span> |
<asp:Panel> |
<div>...</div> |
<asp:Table> |
<table>...</table> |
<asp:TableRow> |
<tr>...</tr> |
<asp:TableCell> |
<td>...</td> |
这些控件比 HTML 控件提供了更标准化的属性集,并使得实现用于设计和构建 ASP+ 页面和应用程序的工具更加容易。
ASP+ 列表控件
许多日常任务涉及在 Web 页面中列出数据。通常,这些数据将从某种数据存储中提取,可能是关系数据库。ASP+ 列表控件的目的是简化这类页面的构建。这包括将所需功能封装在单个控件或一组控件中,从而节省开发时间并简化任务。
生成用户界面的服务器端 ASP+ 控件还可以管理分页、排序、过滤和选择单个项目等任务。最后,它们可以使用 ASP+ 中的新服务器端数据绑定功能,仅用几行代码自动填充列表。用于创建列表的三个标准控件是 Repeater、DataList 和 DataGrid 控件。
Repeater 控件是最简单的,它仅用于重复渲染输出。开发人员定义模板,用于将样式信息应用于控件创建的输出的标题、项、页脚和分隔符部分。例如,创建表格时,标题和页脚信息将(正如您所期望的)用于表格的标题和页脚(HTML 术语中的 <thead> 和 <tfoot> 部分)。项模板内容应用于从数据存储中重复值生成的表格的每一行。还可以使用 alternatingItem 模板为交替行应用不同的样式。分隔符信息定义了将在每行之后和下一行之前生成的 HTML 输出。
DataList 控件与 Repeater 控件不同之处在于,它提供了对重复数据的内置格式化,同时也接受与 Repeater 控件相同的模板值。DataList 控件渲染额外的 HTML(在其模板定义之外),以更好地控制渲染列表的布局和格式,提供诸如垂直/水平流动和样式支持等功能。然而,与 Repeater 控件不同的是,它还可以用于按需编辑元素中的值,并检测用户所做的更改。
列表控件中最丰富的是 DataGrid 控件。输出是一个 HTML 表格,开发人员可以定义模板,用于将样式信息应用于表格的各个部分。除了能够编辑表格中的值外,用户还可以对内容进行排序和过滤,其外观类似于电子表格。但是,由于控件的输出只是 HTML,因此它将在所有流行浏览器中工作。
|
ASP+ 中还包括另外两种更专业的列表控件类型:RadioButtonList 和 CheckboxList 控件。实际上,它们只是将 HTML 单选按钮或复选框元素的列表渲染到客户端,并通过 span 元素应用标题。但是,您可以轻松指定布局,即项目应该水平显示在页面上还是垂直显示,或者显示在 HTML 表格内。您还可以控制文本标签的对齐方式,并安排列表自动回发选定的值。
ASP+ 丰富控件
ASP+ 的预览版本附带了三个丰富控件,它们提供了普通 HTML 通常无法提供的特定功能。例如,日历控件和 AdRotator 控件。TreeView、ImageGenerator 等控件也将在后续版本中发布。
为了让您大致了解这些自定义控件的功能,请看下面的截图。
|
这是使用这段简单的代码生成的。
<form runat="server">
<asp:Calendar runat="server" />
</form>
ASP+ 验证控件
在 Web 应用程序中使用 HTML 表单时,一项常见的任务是验证用户输入的值。它们可能必须落在指定的范围内,不能为空,甚至可能需要交叉引用几个控件的值来检查输入是否有效。
传统上,这都是通过客户端脚本或服务器端脚本完成的,通常是为每个表单页面特别编写的。在 ASP+ 中,包含了一系列验证控件。这些控件可以轻松地执行验证检查——无论是客户端还是服务器端。
提供了五种类型的验证控件。RequiredFieldValidator 控件、CompareValidator 控件、RangeValidator 控件和 RegularExpressionValidator 控件执行各种类型的检查,以确保控件包含特定值,或者与另一个控件中的值匹配。CustomValidator 控件将用户输入到控件的值传递给指定的客户端或服务器端函数进行自定义验证。ValidationSummary 控件收集所有验证错误并将它们放在页面内的列表中。
这些控件中的每一个(ValidationSummary 控件除外)都通过您为验证控件设置的属性链接到一个或多个 HTML 控件。它们可以自动输出您指定的文本或字符串,当验证失败时。您还可以使用 Page 对象的 IsValid 方法来查看是否有任何验证控件检测到错误,并提供自定义错误消息。
其中一些控件还可以检测浏览器类型,并输出执行客户端验证的代码,而无需往返服务器。如果不可能,则输出用于在提交值到服务器时进行验证的代码。我们将在第 4 章中详细介绍如何使用这些控件。
我们将在第 2 章中更详细地介绍本书中讨论的大部分控件。与它们相关的更复杂的主题,例如模板、服务器端数据绑定和 ADO+,将在第 3 章中介绍。第 4 章讨论验证控件以及 ASP+ 页面中的其他高级技术。我们还将在第 7 章中介绍如何构建自己的自定义服务器端控件。
ASP+ Web 服务
随着 XML 在传统计算领域不断推进,我们过去处理事物的方式越来越多地发生改变。其中一个领域是提供可被远程客户端消耗的程序化服务,特别是在服务器和客户端运行在不同的操作系统平台上的情况下。简单对象访问协议 (SOAP) 是一种 XML 语法,它允许客户端通过提供标准格式的请求来利用远程服务器或应用程序提供的服务。
ASP+ 支持创建合适的服务器或应用程序对象,这些对象接受 SOAP 请求,并以 SOAP 格式返回结果。这项技术称为 Web 服务,它允许开发人员在 .NET 框架内快速轻松地创建这些对象。
这些对象还可以使用基于 XML 的服务描述语言 (SDL) 自动发现并向客户端描述。
您只需使用正常的服务器端代码创建一个公共类对象,使用任何支持的语言,并包含一个或多个标记为特殊 [WebMethod] 指示符的方法,客户端就可以访问。这些被称为自定义属性。未标记为这样的其他方法不会暴露,客户端也无法访问。不需要了解 COM+ 或 HTTP 本身,这些服务对象的源文件只是文本文件。
Web 服务允许 ASP+ 开发人员快速轻松地创建自定义业务服务对象。客户端可以使用 HTTP-GET、HTTP-POST 或 HTTP-SOAP 方法进行同步或异步访问,这些方法提供了额外的灵活性。与其他 ASP+ 对象一样,源会被编译、缓存并在运行时下执行。我们将在第 5 章中探讨 Web 服务的整个概念。
ASP+ 配置和部署
在早期版本的 ASP 中,名为 global.asa 的文件可以存在于虚拟应用程序的根目录中。此文件定义了应用程序的全局变量和事件处理程序。但是,所有其他 Web 站点的配置详细信息都在 MMC 的 Internet Services Manager 插件中进行。在 Internet Services Manager 中进行的设置存储在 IIS 元数据库中,元数据库是一个服务器端的可机读文件,它指定了该机器上 Web 服务的整个结构。
这至少有一个主要的缺点。它要求管理员或开发人员通过 Internet Services Manager(可以远程访问 LAN 上的另一台机器)、相应的 HTML 页面或通过 Active Directory Services Interface (ADSI) 访问元数据库的自定义页面来访问元数据库。
全局配置文件 – config.web
在 ASP+ 中,所有 Web 应用程序的配置详细信息都保存在名为 config.web 的人类可读文件中。默认的 config.web 文件位于 ProgramFiles\ComPlus\v2000.14.1812\ 目录中,它指定了适用于任何不覆盖默认设置的应用程序或目录的设置。配置文件是 XML 的标准格式,每个应用程序都继承了默认 config.web 文件中的设置。
config.web 文件为应用程序指定了各种设置,包括将用于处理每个请求的 HTTP Modules 和 Request Handlers。这提供了一个完全可扩展和灵活的体系结构,允许在需要时执行非标准的 HTTP 协议处理。我们将在第 6 章中研究配置文件及其用法。
应用程序定义文件 – global.asax
与 ASP 2.0 和 3.0 一样,还可以使用一个定义文件来指定应用程序启动和结束时,以及单个用户会话启动和结束时要采取的操作。此文件命名为 global.asax(注意 .asax 文件扩展名),并存储在每个应用程序的根目录中。
global.asax 支持现有的 ASP 事件处理程序 Application_OnStart、Application_OnEnd、Session_OnStart 和 Session_OnEnd,以及一些新事件,如 Application_BeginRequest、Security_OnAuthenticate 等。而且,与以前一样,global.asax 文件可用于设置全局或会话级变量的值和实例化对象。我们将在第 6 章探讨 global.asax 文件的用法。
ASP+ 应用程序和会话状态
ASP 早期版本中一个令开发人员迅速利用的有用功能是为存储值和对象实例提供了全局和用户级别作用域。这使用了 ASP 中的 Application 和 Session 对象,并且这些对象在 ASP+ 中仍然存在。尽管向后兼容,但新的 Application 和 Session 对象提供了大量额外功能。
使用应用程序状态
与早期版本一样,计算机上运行的每个 ASP 应用程序都有一个 Application 对象的单个实例,该实例可以被该应用程序内的任何页面访问。只要应用程序“保持活动”状态,任何值或对象引用都有效。但是,当编辑 global.asax 文件时,或当最后一个客户端 Session 对象被销毁时,Application 对象也会被销毁。
使用 Application 对象存储简单值非常有用,并且通常提供了 Lock 和 Unlock 方法,以防止用户通过并发更新来损坏其中的值。然而,这可能会导致阻塞,当一个页面等待访问 Application 对象时,而 Application 对象正被另一个页面锁定。
请注意,当一个页面执行完成或超时,或发生未处理的错误时,Application 对象会自动为该页面解锁。
请牢记在 Application 对象中存储大量数据的影响,因为这会占用其他地方所需的资源。您还需要确保在 Application 级别作用域中实例化的任何对象都是线程安全的,并且能够处理多个并发访问。Application 对象使用中的另一个限制是,它不会在处理同一应用程序的用户请求的多个服务器的 Web 场中,或在同一应用程序在单个多处理器机器内的多个进程中运行的“Web 园”中进行维护。
使用会话状态
虽然 Application 对象与早期 ASP 版本相比几乎没有变化,但 ASP+ 中的 Session 对象经历了一些相当大的更新。它仍然与早期 ASP 版本的代码兼容,但具有多项新功能,使其更加有用。
最大的变化是,Session 对象的内容现在(可选地)可以存储在 ASP+ 进程之外,在一个名为 Session State Store 的新对象中。它由一个名为 State Server Process 的新 Windows 服务管理,该服务会持久化所有用户 Session 对象的内容——即使它们运行的 ASP+ 进程失败。它还会删除因超时或错误而终止的会话的内容。
或者,Session 内容可以被序列化到一个临时的 SQL Server 数据库表中,ASP+ 直接与 SQL Server 通信。这意味着它可以在应用程序或计算机故障后重新加载,从而提供比早期版本更健壮的 Session 对象存储实现。因此,它非常适合需要会话级别状态管理功能的应用程序,例如购物车。
这个新的状态存储系统还有另一个直接优势。使用 Web 场来支持大规模应用程序或网站时,管理会话一直是一个问题,因为它们在 Web 场中的机器之间不可用。
新的 ASP+ Session State Store 可以在多台服务器之间分区,以便维护每个客户端的状态,而不管它们首先命中 Web 场中的哪台服务器。
最后,ASP+ 还允许为不支持 cookie 的客户端维护会话状态。这在早期 ASP 版本中就已被提议,但从未实现。现在,通过使用特殊的配置设置,您可以强制 ASP+ 将会话 ID “混入”到 URL 中。这避免了之前遇到的所有丢失状态信息的问题,例如当超链接中的 URL 与页面名称不使用相同的字符大小时。
最后,State Server Process 还将能够公开有关 Session State Store 内容的信息,这将有助于性能监控和管理任务,例如
设置每个客户端状态的最大限制。我们在第 6 章中研究了会话的管理方式。
第 6 章。
ASP+ 错误处理、调试和跟踪
错误处理和调试一直是 ASP 落后于 Visual Basic 和 C++ 等其他开发环境的领域。在 ASP+ 中,有几项新功能有助于缓解这种情况。现在可以为每个 ASP+ 页面指定单独的错误页面,方法是在 ASP+ 页面开头使用新的 ErrorPage 指令
<%@Page ErrorPage="/errorpages/thispage.aspx"%>
如果加载、解析、编译或处理页面时发生“未找到”、“访问被拒绝”响应,或发生“内部服务器错误”(由 ASP 代码或对象错误引起),则会加载您指定的自定义错误页面。在此页面中,您可以访问错误代码、页面 URL 和错误消息。自定义错误页面或其他错误处理程序可以替代地在应用程序的 config.web 文件中指定。
如果未指定错误页面,则 ASP+ 将加载自己的错误页面,该页面包含比以前更多的关于错误以及如何纠正错误的详细信息。config.web 文件中的设置还允许您指定此信息仅呈现给在 Web 服务器上运行的浏览器,在这种情况下,远程用户将只收到简单的错误指示。或者,您可以在 ASP+ 页面中创建一个捕获 HandleError 事件的过程,这样做也可以防止默认错误页面的显示。
另一个受欢迎的新功能是 Visual Basic 现在支持 try...catch...finally 错误处理技术,该技术长期以来一直是 C++ 等语言以及最近的 JScript 的主要支柱。更多详细信息可在附录 B 中找到。ASP+ 还通过包含新的 Debugger 工具来改进调试技术。这是随 Visual Studio 一起提供的调试器,支持本地和远程调试。
最后,ASP+ 现在包含全面的跟踪功能,因此您不再需要用 Response.Write 语句填充页面来弄清楚代码内部发生了什么。相反,通过使用新的 Trace 指令在页面顶部启用跟踪,您可以将信息写入 Trace 对象,并让它自动呈现为页面底部的 HTML 表。还可以通过在 config.web 文件中添加指令来为 ASP+ 应用程序启用跟踪。跟踪信息会自动包含显示响应时间和其他有用内部参数的统计信息
|
此外,还提供了一个基于 Web 的查看器,允许您检查 TraceContext 对象的日志文件内容。我们在第 4 章中研究了错误处理、调试和跟踪的整个主题。
其他 ASP+ 功能
为了结束对 ASP+ 新功能的简短介绍,我们将探讨一些属于“通用”标题的其他主题。这些包括安全管理、从 ASP+ 页面发送电子邮件以及服务器端缓存。
新的安全管理功能
在第 4 章和第 6 章中,您将看到 ASP+ 如何实现多种新方法来管理页面和应用程序中的安全性。与 ASP 3.0 一样,可以使用 Basic、Digest 和 NTLM(Windows NT)身份验证方法。这些在 ASP+ 中使用早期 ASP 版本中 IIS 提供的服务来实现。还有一种新的身份验证技术称为 Passport 身份验证,它使用新的 Managed Passport Profile API。还可以将用户分配到角色,然后使用 IsCallerinRole 方法检查每个用户是否具有访问资源的相应权限。
另一种方法是使用自定义表单身份验证。此技术使用存储在 cookie 中的令牌来跟踪用户,并允许使用自定义登录页面,而不是让客户端看到标准的 Windows 登录对话框。这提供了与 amazon.com 和 yahoo.com 类似的用戶體驗。没有此功能,您需要编写 ISAPI 筛选器来实现此目的——有了 ASP+,这变得非常简单。
服务器端缓存
ASP+ 使用服务器端缓存来提高各种方面的性能。除了缓存 ASP 页面的中间代码和各种其他对象外,ASP 还有一个输出缓存,允许将页面的全部内容缓存起来,然后为其他客户端重用(如果合适)。
还可以访问自定义服务器端缓存,该缓存可用于保存应用程序内所需的`对象`、值或其他内容。您的页面和应用程序可以使用此缓存通过存储经常使用或将再次需要的项来提高性能。缓存仅在内存中实现(在计算机故障的情况下不可靠),并且由操作系统自动执行清理和管理。
开始使用 ASP+
在了解了 ASP+ 的全部内容以及支持它的幕后技术的一些细节之后,是时候动手构建一些应用程序了。您可以下载本书的示例文件在自己的服务器上运行,并对其进行修改和扩展。但首先,如果您还没有安装 ASP+,则必须安装它。
最新版本的 ASP+ 可以从 Microsoft 网站下载。在撰写本文时,下载的确切位置未知,但您可以通过我们的支持网站 http://www.wrox.com/beta 访问它。它也可作为 CD 以最低成本提供,并且是 Visual Studio 7 的一部分。
至于工具,在撰写本文时,我们正在使用 ASP 开发人员的常用朋友——Windows 记事本。当然,您可以继续使用 Visual InterDev 或任何其他支持 ASP 的开发工具——它对 ASP+ 的新对象语法和服务器端控件帮助不大。但只要它不破坏任何它不认识的代码,在更好的工具可用之前它就可以正常工作。
而且,如果您像我们一样是固定的“简单文本编辑器”ASP 开发人员,您可能想尝试 Windows 记事本的替代品,它提供了额外功能。我们目前的喜好是 TextPad (http://www.textpad.com/)。
安装 ASP+
安装 ASP+ 只需运行可执行的设置文件即可。但是,您应该首先确保已安装 Internet Explorer 5.5 版本。如果没有,请从 http://msdn.microsoft.com/downloads/webtechnology/ie/iepreview.asp 下载或直接安装。
安装 IE 5.5 之前,请确保关闭所有其他应用程序,因为它会更新许多 Windows 2000 操作系统文件。安装完成后,您就可以运行 ASP+ 了。目前无需进行其他配置,因为默认配置将满足我们首次实验的需要。
创建 ASP+ 应用程序
在 ASP 2.0 和 3.0 中,有必要采取一些明确的措施来创建 ASP 应用程序,特别是如果您想在单独的进程中运行应用程序使用的任何组件。好消息是,使用 ASP+,这一切实际上都不是必需的。您也不必注册任何 ASP+ 组件。
如前所述,一个名为 config.web 的文件控制着 ASP+ 应用程序的配置。它存储在应用程序的根文件夹中。但是,有一个默认的 config.web 文件(在安装运行时时会自动安装在您的 ProgramFiles\COM20SDK\ 文件夹中),该文件用于所有 ASP+ 应用程序。因此,您要做的就是创建一个子目录,放在您的 InetPub\WWWRoot 文件夹下,并将您的 ASP+ 页面放在那里。
当然,您仍然可以创建一个位于 WWWRoot 目录之外的文件夹,并在需要时(与早期 ASP 版本一样)在 Internet Services Manager 中设置一个虚拟目录指向它。无需为此应用程序的“应用程序设置”部分或“配置”对话框中的任何配置选项进行设置——默认设置将正常工作。
|
稍后,如果需要,您可以向应用程序的根文件夹添加一个 config.web 文件和一个 global.asax 文件,以指定配置设置和应用程序级别的事件处理程序。
测试您的安装
安装 ASP+ 运行时框架(以及 ASP+ 预览版本的 Internet Explorer 5.5)后,您可以进行尝试。一种方便的方法来确认它正在工作是运行我们提供的示例文件之一。我们之前看过的名为 pageone.aspx 的简单示例页面包含在本书示例的 Chapter01 文件夹中(可从 http://www.wrox.com/ 获取)。
只需将其复制到服务器上的 InetPub\WWWRoot 目录,然后使用 URL https:///pageone.aspx 或 http://your_server_name/pageone.aspx 从浏览器打开它。您应该会看到此
|
我们在这里使用了 Netscape Navigator 6 和 Opera 4 来证明该页面不依赖于 Internet Explorer 的独特功能。
如果页面无法正常工作,请查看 ASP+ 附带的“自述”文本文件,了解最新的信息。或者,可以查看 ASP+ 随附的 SDK 文档,或在 Microsoft 网站上查找,以查看完整的描述和任何错误消息的解决方案。
一旦您启动并运行,下一步就是查看“快速入门”教程。有各种各样的 ASP+ 页面、Web 服务和应用程序的示例可供您尝试和查看源代码。从 https:///quickstart/ 或 http://machinename/quickstart/ 打开示例。
|
关于 ASP+ 最终版本
显然,ASP+ 的预览版本和我们正在使用的运行时框架并不完全完整。但是,它被归类为“功能完整”,这意味着在最终版本之前只会进行一些小的更改和添加。在本节最后,我们将探讨一些您可以在最终版本中预期看到但尚未提供或尚未正常工作的`东西`。
多 Windows 平台支持
NGWS 框架和 ASP+ 的最终版本面向所有当前和最近的 Windows 平台,包括 Windows 2000、Windows NT4、Windows 95 和 Windows 98。然而,预览版本仅设计用于 Windows 2000 Server 和 Windows 2000 Professional。Windows 95 和 Windows 98 的版本将是功能受限的“个人”版本,但将允许这些操作系统提供 ASP+ 页面执行的本地源。这对于构建设计用于本地运行的应用程序很有用。
XHTML 合规性
目前,ASP+ 服务器端控件生成的输出是基本的 HTML 3.2,不符合 XHTML 标准。良好的编码实践表明,所有 Web 页面都应符合万维网联盟 (W3C) 的新 XHTML 建议,以便如果需要,它们可以通过 XML 解析器或其他期望内容符合 XML 格式的应用程序进行处理。
XHTML 1.0 的完整规范可从 W3C 网站 http://www.w3.org/TR/xhtml1 获取,Microsoft 将在 ASP+ 的最终版本中尝试从服务器端组件生成符合 XHTML 标准的 HTML 代码。但是,由于一些流行的浏览器在遇到 XHTML 时行为可能很奇怪,因此最终支持级别目前难以判断。
客户端特定输出格式
ASP+ 预览版中提供的大多数智能服务器端控件仅输出标准的 HTML 3.2。但是,一些(如我们在第 4 章中介绍的验证控件)确实可以检测到 Internet Explorer 4 及更高版本,并生成利用此浏览器 DHTML 功能的输出。这提供了更好的性能和更好的用户体验,因为它极大地减少了每次用户更改控件中选定数据时与服务器进行往返的需求。
在 ASP+ 的后期 beta 版和发布版本中,将会有更多此类控件。还将有旨在创建完全不同格式输出的控件,例如无线标记语言 (WML)。在某些情况下,这可能是一组单独的控件;但是,由于这些类型的 Internet 设备的用户界面和客户端功能之间存在极大的不兼容性。
新的管理工具
最后,ASP+ 的发布版本将包含管理工具,使您可以更轻松地配置和维护应用程序。您可以预期会看到用于管理 config.web 配置文件和 global.asax 应用程序文件的工具。还应该有用于查看应用程序性能的图形界面,以及在调试完整应用程序时检查详细跟踪信息的工具。
摘要
在本章中,我们试图提供 ASP+ 与早期 ASP 版本相比的全部新内容和变化。ASP+ 是 Microsoft 成功的主动服务器页面技术的新一代,代表了易用性和功能性方面的真正进步。
ASP+ 旨在消除 ASP 的许多现有限制,例如对脚本语言的依赖、对面向对象设计和编程技术的支持不佳,以及在构建的每个页面或应用程序中不断重新发明技术的需要。相反,ASP+ 结合了构建更复杂、更强大的应用程序的能力,同时减少了开发人员编写重复性代码的需求。例如,维护 HTML 表单控件中的值并将这些值“往返”发送回服务器的过程需要大量代码来维护页面内的状态。ASP+ 会自动为您完成所有这些工作。
同时,外部世界正在变化。通过“Internet 设备”访问您站点的用户比例,例如手机、个人数字助理 (PDA)、电视机顶盒、游戏机或其他设备,将很快超过使用 PC 和传统 Web 浏览器的用户数量。ASP+ 提供了解决方案,有助于减少处理这些不同类型客户端所需的工作。
分布式应用程序的快速变化性质需要更快的开发、更多的组件化和可重用性,以及更广泛的通用平台支持。SOAP(简单对象访问协议)等新标准和企业对企业 (B2B) 数据交换等新商业需求需要使用新技术来生成输出并与其他系统通信。为了满足所有这些要求,ASP 已从头开始进行了彻底的改造,成为一个全新的编程环境,其中包括
- 使用新的服务器端控件自动管理页面状态,并减少需要编写的代码。
- HTML 服务器端控件,可用于生成页面输出中的 HTML 元素,并允许在运行时使用代码设置这些控件的属性(即`属性`)。它们还允许检测由元素引发的事件,并在服务器上执行相应的代码以响应这些事件。
- 运行在服务器上的 Rich Controls 可用于在页面输出中创建更复杂的 HTML 元素和对象。ASP+ 包括日历控件和一系列网格、表和列表控件。这些控件还可以利用服务器端数据绑定来填充值。
- Web 服务,允许开发人员创建通常不作为可见输出呈现的页面,而是向客户端提供服务。例如,它们可以包含响应请求返回特定值的函数。
- 更好的配置和部署,使用人类可读的 XML 格式配置文件。组件不再需要在服务器上注册(使用 regsvr32),并且可以使用文件复制命令、FrontPage 服务器扩展或 FTP 来部署应用程序。
- 扩展的应用程序和会话状态管理,为存储特定客户端和应用程序相关的值提供了一个持久化且更具可伸缩性的环境。
- 改进的错误处理、调试和跟踪功能。每个页面都可以有自己的“错误页面”,并且还可以显示页面代码执行时使用的值,从而提供“跟踪”功能。
- 新的安全管理功能,允许使用多种不同类型的登录和用户身份验证。而不是默认的浏览器登录提示,可以使用自定义登录页面与 Windows 2000 和 NTLM 身份验证一起使用。根据用户所属的角色或组来管理用户也更容易。
- 自定义服务器端缓存允许开发人员在服务器本地存储各种值和对象,供 ASP+ 页面使用。运行时还可以缓存 ASP+ 页面的**输出**。这可以在动态创建的页面对许多访问者都相同的场景中提供巨大的性能提升,例如产品目录。
- ASP+ 附带一系列有用的组件。这些类库可以帮助简化 Web 应用程序的编写。例如,包括:“SendMail”组件、加密/解密组件、定义自定义性能计数器的组件、读写 NT 事件日志的组件、处理 MSMQ 的组件、网络访问组件(“WinInet”的替代品)、数据访问组件等。
在本书的其余部分,我们将更详细地探讨所有这些主题,并向您展示如何使用 ASP+ 比以往任何时候都更快、更有效地构建强大且交互式的基于 Web 的分布式应用程序。
版权 © 2000 Wrox Press Ltd
ing 允许开发人员在服务器本地存储各种值和对象,以供 ASP+ 页面使用。运行时还可以缓存 ASP+ 页面的*输出*。在动态创建的页面对许多访问者都相同的情况下,例如产品目录,这可以提供巨大的性能提升。在本书的其余部分,我们将更详细地探讨所有这些主题,并向您展示如何使用 ASP+ 比以往任何时候都更快、更有效地构建强大且交互式的基于 Web 的分布式应用程序。
版权 © 2000 Wrox Press Ltd
在本书的其余部分,我们将更详细地探讨所有这些主题,并向您展示如何使用 ASP+ 比以往任何时候都更快、更有效地构建强大且交互式的基于 Web 的分布式应用程序。
版权 © 2000 Wrox Press Ltd
ing 允许开发人员在服务器本地存储各种值和对象,以供 ASP+ 页面使用。运行时还可以缓存 ASP+ 页面的*输出*。在动态创建的页面对许多访问者都相同的情况下,例如产品目录,这可以提供巨大的性能提升。在本书的其余部分,我们将更详细地探讨所有这些主题,并向您展示如何使用 ASP+ 比以往任何时候都更快、更有效地构建强大且交互式的基于 Web 的分布式应用程序。