发布日期:2024-05-27 17:01浏览次数:
大型网站设计服务器端动态主页设计大型网站设计服务器端动态主页设计 第七章 大型网站设计——服务器端动态主页设计 通过前面各章的介绍,相信大家已经对网页设计已经有一个完整的认识了。对于建立一个个人或者小型网站来说,利用前面给大家介绍的各种技术和工具就已经能够建立一个图文并茂,动态十足的网站了。但是,对于一个大型或者商业网站来说,这些技术只能够提供Web页面的建立和在静态Web页面的基础上进行的简单动态交互,而大型或者商业网站的设计除了会关注网页所呈现给用户的外观,它们更加关注网站的信息发布、信息收集以及信息处理的能力,而这些能力使用前面所介绍的技...
大型网站设计服务器端动态主页设计 第七章 大型网站设计——服务器端动态主页设计 通过前面各章的介绍,相信大家已经对网页设计已经有一个完整的认识了。对于建立一个个人或者小型网站来说,利用前面给大家介绍的各种技术和工具就已经能够建立一个图文并茂,动态十足的网站了。但是,对于一个大型或者商业网站来说,这些技术只能够提供Web页面的建立和在静态Web页面的基础上进行的简单动态交互,而大型或者商业网站的设计除了会关注网页所呈现给用户的外观,它们更加关注网站的信息发布、信息收集以及信息处理的能力,而这些能力使用前面所介绍的技术是无法获得的,因此计算机技术人员就开发出了各种服务器端动态主页设计技术来完成这些功能。 通过本章的学习,应掌握以下内容特点及环境搭建 ?ASP.NET的Web Form的应用 ?ASP.NET的数据库编程的应用 ?ASP.NET的会线服务器端动态主页设计概述 7.1.1 服务器端动态技术的诞生 随着Internet应用的深入,Web技术引入的新的商机也逐渐为人们所注意。但是由于当时的Web技术缺乏对交互和信息动态更新的支持,阻碍的Web技术在商业领域的应用。为了突破这种局限,计算机科学家进行了很多种尝试,提出了很多种对Web技术进行信息交互功能扩展的技术,其中最早投入使用并迅速成为主流技术的是“通用网关接口(CGI)”技术,它的全称是Common Gateway Interface,它的出现令Web技术拥有了强大的交互能力,并且扩展了的功能,例如WWW Server和数据库管理系统(DBMS)交互的能力、WWW Server运行服务器进程的能力等。这些扩展加速了Web技术在商业上的应用,并且促进了各种大型网站的诞生。 CGI技术在其诞生之初以其强大的功能成为90%大型网站首选的构建技术,但是通过使用人们发现CGI技术存在两个致命的问题。首先,由于CGI技术提供了WWW Server服务 网页设计 ?272? 器和主机程序的交互能力,也使CGI技术存在比较严重的安全问题,恶意黑客可以通过CGI技术的漏洞控制服务器并造成服务的瘫痪和数据的损失;其次,CGI技术需要为每一次访问建立一个进程来完成对CGI脚本的处理,如果网站的访问量比较大,那么这种处理方式将严重影响网站的性能。由于这些问题的存在,各大软件厂商都纷纷推出新的技术来替代CGI技术,其中比较有影响力的包括PHP、JSP和ASP等等,其中又以MicroSoft公司推出的ASP技术使用最广泛。2000年秋天,MicroSoft公司推出了ASP技术的升级版——ASP.NET技术,本章将通过对ASP.NET技术的介绍,帮助同学们了解和掌握一种服务器端编程技术,拥有建立大型网站的能力。 1. ASP技术的历史 在讲述ASP.NET历史之前,首先来回顾一下ASP。 ASP的第一个版本是0.9测试版。它给WEB开发带来一阵暴风,它能够将代码直接嵌入HTML,使得设计WEB页面变得更简单,更强大,并且通过内置的组件能够实现强大功能,最明显的就是ActiveX Data Objects (ADO),它使得建立一个动态页面如小孩子玩游戏一样简单。 最终出场的是Active Server Page 1.0,它做为IIS的附属产品免费发送。并且不久就在Windows平台上广泛使用。ASP与ADO的结合使用开发者很容易地在一个数据库中建立和打开一个
集。这不无疑是它如此快就被大众接受的因素,因为你现在能使用这些脚本建立和打开一个记录集,处理和输出任何数据,以任何顺序,几乎只要你能想到的,它就能完成。 1998年,微软公司又发布了ASP 2.0 。ASP 1.0和ASP 2.0主要区别是外部的组件需要实例化。有了ASP 2.0 和IIS 4.0,我们就有可能建立ASP应用了,而且每个组件就有了自已单独的内存空间。内置的MicroSoft Transaction Server(MTS)也使用制做组件便得简单。 微软公司接着开发了Windows 2000操作系统。 这个Windows版本给我们带上了IIS 5.0 以及 ASP 3.0。此次并不是简单对ASP进行补充,核心的不同实际上是把很多的事情交给了COM来做。在windows 2000中,微软结合了MTS与COM核心环境做出了COM+,这就让主机有了一种新的方法来使用组件,同样给主机带来了更多的稳定性,成了一个可以升级的效率高的工作平台。IIS 5.0在表面上似乎没有改什么,但是在接口上动的手术比较大。在内部,它使用COM+ 组件服务来对组件提供一个更好的执行的环境。 有了这些,微软公司推出了ASP.NET,ASP.NET又叫ASP.NET,他不是ASP的简单升级,而是MicroSoft推出的新一代Active Server Pages。ASP.NET是微软发展的新的体系结.NET的一部分,其中全新的技术架构会让每个人的编程生活变得更的简单 272 第七章 大型网站设计——服务器端动态网页设计?273? 7.1.2 MicroSoft.NET与ASP.NET 2000年秋天,IT业巨头——MicroSoft公司发布了其以网络为核心的新的技术框架——MicroSoft.NET技术框架,表明微软将以网络为中心,彻底转换产品研发、发布的方式,改变产品和服务的范围。在MicroSoft.NET技术框架中,ASP.NET技术是其中的一个最主要的组成部分之一,它是ASP的下一代版本,然而ASP.NET又并非从ASP3.0自然演化而来,在许多方面,ASP.NET与ASP有着本质的不同。ASP.NET完全基于模块与组件,具有更好的可扩展性与可定制性,数据处理方面更是引入了许多激动人心的新技术,正是这些具有革新意义的新特性,让ASP.NET远远超越了ASP,同时也提供给WEB开发人员更好的灵活性,有效缩短了WEB应用程序的开发周期。ASP.NET与Windows 2000 Server/Advanced Server 的完美组合,为中小型乃至企业级的web商业模型提供了一个更为稳定,高效,安全的运行环境。 要了解ASP.NET的真实面目,首先就得了解一下微软.NET战略。 1. Microsoft.NET的历史 随着网络经济的到来,微软公司希望帮助用户,能够在任何时候、任何地方、利用任何工具都可以获得网络上的信息,并享受网络通信所带来的快乐。.NET战略就是为着实现这样的目标而设立的。 微软公开宣布,今后将着重于网络服务和网络资源共享的开发工作,并称,将会为公众提供更加丰富、有用的网络资源与服务。 微软新一代平台的正式名称叫做“新一代Windows服务”(NGWS),现在微软已经给这个平台注册了正式的商标——MicroSoft.Net。在.Net环境中,微软不仅仅是平台和产品的开发者,并且还将作为架构服务提供商、应用程序提供商,开展全方位的Internet服务。在谈及这个平台中使用的新技术,微软透露,它将在.Net环境中提供更多新产品和一揽子的全套服务。 MicroSoft .NET平台的基本思想是: 侧重点从连接到互联网的单一网站或设备上,转移到计算机、设备和服务群组上,使其通力合作,提供更广泛更丰富的解决
。用户将能够控制信息的传送方式、时间和内容。计算机、设备和服务将能够相辅相成,从而提供丰富的服务,而不是像孤岛那样,由用户提供唯一的集成。企业可以提供一种方式,允许用户将它们的产品和服务无缝地嵌入自己的电子构架中。这种思路将扩展二十世纪八十年代首先由PC赋予的个人权限。 MicroSoft .NET将开创互联网的新局面,基于HTML的显示信息将通过可编程的基于 273 网页设计 ?274? XML的信息得到增强。XML是经“万维网联盟”定义的受到广泛支持的行业标准,Web浏览器标准也是由该组织创建的。微软公司为开发它投入了大量精力,但它并不是MicroSoft的专有技术。XML提供了一种从数据的演示视图分离出实际数据的方式。这是新一代互联网的关键,提供了开启信息的方式,以便对信息进行组织、编程和编辑;可以更有效地将数据分布到不同的数字设备;允许各站点进行合作,提供一组可以相互作用的“Web服务”。 MicroSoft .NET综述 MicroSoft .NET平台包括用于创建和操作新一代服务的.NET基础结构和工具;可以启用大量客户机的.NET User Experience;用于建立新一代高度分布式的数以百万计的.NET积木式组件服务;以及用于启用新一代智能互联网设备的.NET设备软件。 MicroSoft .NET产品和服务—包括Windows.NET,连同建立积木式服务的核心集成套件;MSNTM .NET;个人订购服务;Office.NET;Visual Studio .NET;以及用于.NET的bCentralTM。 .Net环境中的突破性改进在于: 1(使用统一的Internet标准(如XML)将不同的系统对接; 2(这是Internet上首个大规模的高度分布式应用服务架构; 3(使用了一个名为“联盟”的管理程序,这个程序能全面管理平台中运行的服务程序,并且为它们提供强大的安全保护后台; .NET平台包括如下组件: 1(用户数据访问技术。其中包括一个新的基于XML的、以浏览器为组件的混合信息 架构,叫做“通用画板”; 2(基于Windows DNA 2000的构建和开发工具; 3(一系列模块化的服务,其中包括认证、信息传递、存储、搜索和软件送递功能; 4(一系列驱动客户设备的软件; 2. 什么是ASP.NET, 本节将详细介绍称为Active Server Pages+ (ASP.NET)的网络应用程序可编程模板。建立在Microsoft .NET框架 上网络应用程序共享一个通用应用程序模板。在这个模型中,网络应用程序是一套起源于基URL 的URLs。因此它包含用于生成在浏览器中观看的网页的网络应用程序和网络服务。 如同名字所述,ASP.NET是由活动服务器页面(ASP)发展而来。ASP.NET利用common language runtime 和服务框架网络应用程序提供了一个可靠的、自动化的、可扩展的主机环境。ASP.NET也受益于common language runtime 集成模板,简化了应用程序的配制。另外,它提供简化应用程序开发的服务(如状态管理服务)以及高水平的编程模板(如ASP.NET Web Forms和ASP.NET Web Services)。 274 第七章 大型网站设计——服务器端动态网页设计?275? ASP.NET的核心是HTTP运行语言,一个高性能的用于处理基于低级结构的HTTP请求的运行语言,而基于的结构与MicroSoft Internet Information Services (IIS)所提供的ISAPI结构相似。HTTP 运行语言是在象服务器上的IIS或客户机上的IE之类的unmanaged 主机过程中运行的受控代码。HTTP runtime负责处理引入的所有HTTP请求,并对每个请求应用程序的URL进行解析,然后把请求分配到应用程序以进行进一步的处理。HTTP 运行语言是多线程的,并异步处理请求,因此劣质的应用程序代码阻碍不了它对新请求的处理。而且HTTP 运行语言假定失败必会发生,因此它被控制为尽最大力量自动地从访问冲突、内存泄漏、死锁等事故中恢复过来。除非是硬件故障,运行语言的目标是100%的可靠性。 网络基本上是一个无状态模型,并且在HTTP请求间没有联系,这使得编写网络应用程序很困难,因为应用程序通常需要维护跨多个请求的状态。ASP.NET增强了由ASP引入的状态管理服务,以便为网络应用程序提供三种类型的状态:应用程序、会话、用户。就象在ASP中一样,应用程序状态特定于一个应用程序实例,并且不会持久。会话状态是特定于一个用户与应用程序间的会话的。与ASP会话状态不同,ASP.NET会话状态储存在一个独立的过程中,并且可把它配制成可以储存到一个独立的机器上。这使得会话状态当应用程序在网络群(Web farm)扩展时非常有用。用户状态类似于会话状态,但通常它不会超时,并且是永久性的。因此,用户状态对储存用户参数和其它个性化的信息是有用的。所有状态管理服务都被实现为HTTP模块,因此它们容易增加到应用程序管道中,或从中删除。如果除了由ASP.NET提供的服务外,还需要额外的状态管理服务,那么可由第三方的模块提供。 ASP.NET同样提供高速缓冲服务,以改善性能。输出缓冲可完全节省网页翻译,段缓冲储存部分的网页。由于提供了相应的类,所以只要需要,应用程序、HTTP模块以及请求处理程序可以在高速缓存中储存任意数量的对象。 7.1.3 ASP.NET的组成 ASP.NET应用程序可编程模板主要是有两个高级可编程模块构成,下面就简单介绍一下这两个高级可编程模块,它们分别是:ASP.NET网络表单(Web Form)和ASP.NET网络服务(Web Service)。 1. ASP.NET网络表单 网络表单把基于Visual Basic?的表单的高生产性的优点带到了网络应用程序的开发中来。网络表单支持传统的将HTML内容与角本代码混合的ASP语法,但是它提出了一种将应用程序代码和用户接口内容分离的更加结构化的方法。引入的网络表单控件用于为封装通 275 网页设计 ?276? 用用户接口元素提供了一种机制。这些新的特点使得开发工具在支持VB小应用程序的同时,也支持设计时模块,使得WUSIWYG工具支持网页布局。 网络表单控件负责生成用户接口,典型情况是在HTML表单中。ASP.NET是提供了一套映射传统的HTML用户接口小部件(包括列表框,文本框和按钮)的网络表单控件和一套附加的更加复杂的网络控件(如日历和广告转板)。这些控件的一个重要特点是,它们可以被编写以适应客户端的能力;同一网页把大范围的客户端平台和表单因素作为目标。换句话说,网络表单控件能“嗅”到正在查找表单的客户,然后返回合适的用户经验――可能是适合低级浏览器的HTML3.2或是适于IE5.0的动态HTML。 考虑到网络是一种无状态的联接模型,网络应用程序开发人员所面临的一个很复杂的问题是,他们要对用户与基于网络的接口的交互作用作出反应。网络利用ASP.NET的体系架构提供了一套丰富的服务,以帮助开发人员建立交互式网页。这些服务的净作用是使基于组件的、事件驱动的可编程模块,对开发人员来说,非常象客户端的表单程序设计。用户与网页交互作用的状态管理的复杂性被ASP.NET 网络 表单和网络表单控件隐藏起来了。对开发人员来说,提供的丰富数据绑定服务使得显示通过数据访问服务得到的数据变得非常容易。 代码与内容的分离使ASP.NET网页能动态地编译到受控类中,用以提高性能。每个引入的HTTP请求都被传递到一个新的网页实例,因此开发人员不需要关心代码中的线. ASP.NET网络服务 ASP.NET 网络 服务体系架构为用ASP.NET建立网络 服务提供了一高级可编程模板。虽然建立网络服务并不需要使用网络 服务平台,但是它提供许多的优点将简化开发过程,并且它使用的编程模型对用ASP或VB工作的开发人员来说是很熟悉的。使用这个可编程模型,开发人员不需要理解HTTP、SOAP或其它任何网络服务规范。 开发人员用ASP.NET生成一个扩展名为.asmx的文件,并把此文件配制为网络应用程序的一部分,就建立起了一个网络 服务。ASMX文件或者包含对在其它地方定义的受控类的引用,或者包含这个类的定义。这个类是由ASP.NET提供的WebService类所派生。公有的类方法在标记上WebMethod属性后,就会成为网络服务方法,把HTTP请求发送到ASMX文件中的URL后,这些方法就会被调用。你不必手工为你的网络服务建立一个契约。当被调用者请求时,ASP.NET检查类的元数据,以自动生成SCL文件。 客户可通过SOAP,HTTP GET 和HTTP POST提交请求。对方法和参数进行编码的约定是:对HTTP GET,将被编码为查询字符串;对HTTP POST,将被编码为表单数据。HTTP GET 和HTTP POST 的机制不如SOAP有力,但是它们使得客户在访问网络服务时不必支持SOAP。 ASP.NET 网络服务模型假定了一个无状态服务结构。无状态结构通常比有状态结构更具 276 第七章 大型网站设计——服务器端动态网页设计?277? 可扩展性。每次收到一个服务请求后,就生成一个新对象,请求被转化为一个方法调用,当方法调用返回时对象被销毁。如果这些服务需要跨请求维护状态,那么它们将使用ASP.NET状态管理服务。基于ASP.NET的网络服务在网络应用程序模型中运行,因此它们得到了该模型的所有安全、配制和其它优点。 ASP.NET 网络服务还提供了一个为在SCL文件中描述的网络服务生成分类的受控代理工具。代理生成器把SCL文件中描述的消息映射成受控类中的方法。代理对应用程序代码隐藏了所有的网络和引导设备,因此使用网络服务看起来就象使用其它受控代码一样。代理将优先使用SOAP链接网络服务,但是它同样支持HTTP GET和 HTTP POST机制。因此HTTP GET和 HTTP POST同样也能被使用。 网络服务为在Internet上绑定应用程序提供了一个利用现存体系架构和应用程序的简单的、灵活的、基于许多标准的模型。网络应用程序很容易与当地开发的服务或已存在的服务集成在一起,而不用考虑开发平台、开发语言或使用的对象模型,以用于实现任何组成的服务或应用程序。 7.1.4 ASP.NET的开发语言 1. ASP.NET的开发语言简介 在前面的内容中介绍过,ASP.NET是基于Microsoft.NET平台的一种应用程序可编程模板,得益于Microsoft.NET平台的CLR特性,开发者可以使用多种编程语言进行开发,这些包括Visual Bacis.NET、JScript.NET、C#.NET、Visual C++.NET,甚至Delphi。越来越多的语言也都加入到了Microsoft.NET阵营中,使用各种语言开发的ASP.NET应用,在接受用户访问的时候,将首先被转换成在.NET平台的CLR,然后对代码进行执行。 在这些语言中C#.NET是微软公司推荐进行ASP.NET开发的语言,C#是一种面向对象语言,这种语言的语法类似于C和C++语言,又融入了Java语言的优点,保留了开发这熟悉的C语言的语法,又解决了C语言安全性难以控制的问题。在本书的所有实例的开发中,也将使用C#作为开发语言,读者可以在实际的应用过程中举一反三,使用自己熟悉的语言进行ASP.NET的开发。 2. C#.NET简介 C#语言是微软公司针对.Net平台开发的一种全新的编程语言。尽管C#象是C,和C++ 277 网页设计 ?278? 语言的升级语言,但是他不象他的前身那样,C#是一个完全面向对象的开发语言。它既有Visual Basic的快速开发的特点,又具有C++的强大的功能。它的风格类似与C、C++和Java。如果你是一个C、C++或者Java的程序员,你会发现你可以很快的使用C#进行开发。和VB.NET一样,C#可以利用公共语言运行时给我们带来的各种好处。例如:语言的交互性,垃圾回收机制,增强的安全性能,以及版本兼容。 C#是一种完全面向对象的开发语言,因此在C#中最基本的语法元素就是类。 和其他的面向对象语言一样,类是一类具共同属性和操作的对象的集合。一个类可以从另一个类继承,在C#中,类是不可以继承多个类的,但是它可以继承多个接口。 每一个类都是由其特有的属性和方法构成的,属性用来保存这个类的对象相关的数据,方法就是定义类的对象能够执行的操作,也就是对象的功能。和其他的面向对象语言一样,C#也提供了继承,接口等其它面向对象的特性。 7.1.5 小结 在本节中,给读者简单介绍了服务器端动态网页技术的产生和发展,简单介绍了当前流行的服务器端动态网页设计技术,并从中选择了ASP.NET技术作为本章讲授的重点。接下来介绍了ASP技术的发展历史,最后着重介绍了ASP.NET技术的组成以及ASP.NET技术的基础平台Microsoft.NET平台的组成和特点。 7.2 ASP.NET基础 在本书接下来的内容里,本书将利用实例详细地给读者介绍怎样使用ASP.NET来进行服务器端动态主页的设计。 ASP.NET是MicorSoft.NET平台的一种可编程开发模板,那么ASP.NET的运行也是基于MicorSoft.NET平台环境之上的。要进行ASP.NET的开发工作,首先要配置ASP.NET的运行环境的开发环境。 278 第七章 大型网站设计——服务器端动态网页设计?279? 7.2.1 .NET的安装与运行环境 1.运行环境配置 当前的MS.NET Framework的版本是1.1版,安装好MS.NET Framework1.1之后系统就 会提供对ASP.NET的支持,下面是安装MS.NET Framework的硬件和软件环境要求: ASP.NET的调试环境 操作系统: Windows 2000 Professional,Windows 2000 Server ,Windows 2000 Advanced Server 浏览器: IE 5.5 支持哪几种语言 ASP.NET 目前能支持3种与语言, C# (读作 C Sharp), Visual Basic,and Jscrip。 使你的机器支持ASP.NET,必须满足以下配置: 硬件要求: 1、 CPU: Intel Pentium II 300 MHz (最好Intel Pentium III 600 MHz) 2、 内存: 96 MB (最好128 MB) 3、 磁盘空间: 250 MB(完全安装) 155 MB(快速安装) 4、 显示: 800x600, 256 colors 5、 CD-ROM: required 软件要求: 1、 MicroSoft Windows 2000 + SP1 2、 MicroSoft Internet Explorer 5.5 3、 IIS5.0 4 、其它: MDAC 2.6 ASP.NET的安装过程很简单,只需按照简单提示安装即可。 ASP.NET(NGWS SDK)的下载地址: -8157-034d1e7cf3a3&displaylang=en 安装微软的VisualStudio.NET和安装ASP.NET很多地方有惊人的相似,所以在此 简单地提一下。 安装VS.NET版本的记得必须先安装以下内容: 1、windows2000 sp1 279 网页设计 ?280? 2、安装IE5.5 3、必须要装有iis,而且iiS要带front page扩展 4、front page服务扩展的补丁QFE 需要注意的是,如果在安装IIS之前就已经安装好了VS.NET IDE的话,需要重新安装MS.NET Framework才能在VS.NET IDE中创建ASP.NET应用程序。 2. 运行VisualStudio.NET IDE环境 微软的VS.NET IDE(Integration Design Environment)是一个非常丰富的变成环境,可以进行C#、VC++、VB.NET、ASPX等的编程,你甚至也可以编写ASP文件。 首先看到的是IDE,如图1所示。VS.NET IDE看起来很熟悉,和低版本的VS IDE类似,它在低版本的VS IDE的基础上又有了新的提高。 图1 VisualStudio.NET 的IDE整体布局 然而,IDE的变化绝非是表面性的。所有的.NET语言都使用同一个IDE,其中的新工具的功能是强大而全面的,用户可以把任何一个设计窗口设定为自动隐藏(就象Windows中的任务条一样),这样就可以使桌面显得不太凌乱,如图2所示: 280 第七章 大型网站设计——服务器端动态网页设计?281? 图2 右上角的“图钉”按钮用来控制窗口自动隐藏 主工作区是由一系列的标签和窗口组成,也就是说IDE不会同时显示许多的窗口或代码模块,在打开对象的源代码时,IDE就会在相应对象的主区内增加新按钮。如图1所示,WebForm1.aspx就是当前打开的代码模块。 IDE中还有一个新的被称作任务列表的窗口,其中的内容包括你和IDE创建的项目。例如,如果在编译一个VB项目时收到一个错误信息,VB就会在任务列表中创建一个条目来解释这个问题。如图1所示,最下方的窗口就是任务列表窗口。 用户还可以直接在任务列表中添加一个条目,或者通过在代码中建立以TODO:开头的注释把代码中的一个位置与任务联系起来。任务清单是一个非常强大的工具,它能使开发者节约不少的时间,并有助于开发者能够更好地调试自己的软件。 过去,VB隐藏了创建一个窗体所必需的全部工作。我们使用IDE创建一个窗体,并在Initialize事件处理程序中添加代码,但对于发生在这两者之间的过程则无能为力。在VB.NET中,窗体成了一个类,包含创建窗体的全部代码,一些高级开发人员可以通过这些代码完成一些很酷的工作。代码编辑器还包括一些新的特性,例如可以自动地对编辑的源代码进行缩进处理,而且可以显示源代码的行号,如图3所示: 281 网页设计 ?282? 图3 VS.NET IDE将原本封闭的代码开放出来 在VS.NET的IDE中,提供了非常多便利的功能,帮助开发者快速安全的完成开发工作。想要完整地介绍VS.NET IDE的使用可能需要一本书的篇幅,因此,在这里就不详细地介绍了,在本书后面的内容里,会将各种常用的功能分别进行介绍。 7.2.2 名字空间(namespace)和ASP.NET的文件类型 1. 什么是名字空间(namespace), 对象一直是面向对象程序开发(OOP)的中心。在MicroSoft.NET中也不例外, MicroSoft.NET中的VB、VBA、VC++、VBScript等各种语言都是如此,不同的开发语言有不同的对象,这些对象均是各个语法所提供的的“资源”,程序开发人员可以利用这些资源,来编写所需的系统,就相隔房屋的一样,建筑师使用同样的素材,然而盖好的房子可能不尽相同。 在过去的ASP中,仅有Server、Request、Response等七个对象。而在ASP.NET的对象库中却分得很细。 例如在ASP.NET网页中要通过SQL语句获得数据库中的数据,必须使用 282 第七章 大型网站设计——服务器端动态网页设计?283? “System.Data.sqlClient”,这是NameSpace名称。 在System.Data.sqlClient下,又有很多类(Class)。每个Class可视为一个对象,因为Class下有属性、方法和事件等 所以,最上层的NameSpace是看作是同类型对象的集合,一个NameSpace之下可拥有多个Class。他们之间的关系如图4所示,Namespace实际是一个具有紧密联系的对象类型的集合,而Class代表了系统中的一个对象类型: ASP.NET NameSpaNameSpa ce ce ClaClaClaCla ss1 ss2 ss3 ss4 图4 ASP.NET以名字空间组织的类型结构 2.如何应用名字空间(NameSpace)?
或者 using System.Data;(在C#文件中的书写格式) using System.Data.OldDb; 以上表示在ASP.NET网页中使用了四个NameSpace,接下来我们要申明变量,但此变量必须是已引用的四个NameSpace所属的Class,如: OleDbConnection MyConnection; OleDbDataSetCommand MyCommand; 在上面的ASP.NET代码中OleDbConnection及OleDbDataSetCommand类型都是System.Data.ADO名字空间之下的Class。 283 网页设计 ?284? 3.ASP.NET中的文件类型, 在ASP.NET中,相对于以前的ASP来说,增加了很多种文件类型,如表1所示,表1中的每一种文件扩展名就代表ASP.NET的一种文件类型: 表1 ASP.NET中的文件类型 文件扩展名 用途及说明 ASP.NET系统环境设置文件,进行应用程序初始化的过程。 Global.asax 內含ASP程序代码的文件,浏览器可执行此类文件,向服务器提出浏览请求 .aspx 制作Web Service的原始文件 .asmx 制作Web Service的XML格式的文件 .sdl .vb或.cs 在非ASP.NET环境下,执行Web Service的文件 可重复使用在多个.aspx的文件,此文件內可含有控件 .aspc 內含User Control的文件,可內含在多個.aspx文件中 .ascx 在每一个ASP.NET应用中,不一定包含上面提到的全部文件类型。只有应用程序使用到ASP.NET的特定功能,在应用程序的
下才会出现某种特定的文件格式。例如应用程序中使用到到网络服务(Web Service),那么在应用程序的解决方案中就会出现.asmx和.sdl文件。开发者对这两种文件进行编码就能够完成网络服务(Web Service)的创建和设置。 7.2.3 C#语言介绍 由于篇幅的原因和C#本身与C++语言类似的特点,在本书中将不会对C#语言的语法进行详尽的介绍。在本节的内容里,将针对C#自身特殊的地方进行介绍。 1. C#程序的基本结构 C#语言是从C和C++语言演变而来,是一种简单、现代、面向对象和类型安全的编程语言。C 和 C++ 程序员会很快熟悉它。C# 的目标是将 Visual Basic 的高效率同 C++ 原有的强大功能结合起来。在此将通过“Hello World”程序讲解C#语言的一些基本结构。 using System; class HelloWorld { public static void Main() { 284 第七章 大型网站设计——服务器端动态网页设计?285? Console.WriteLine(Hello World); } } 一个C#语言编写的应用程序具备的基本结构,即:名字空间、类、程序入口(静态Main方法)。 名字空间在前面已经讲过,它是同类型类的集合,要使用名字空间中的类,首先应该在程序中引用名字空间。在C#中引用名字空间要使用“using”关键字处理,而声明自定义名字空间使用“namespace”关键字处理。本例引用了系统类库中“System”名字空间,并且自定义名字空间名为“Hello”。 “using System;”指令引用一个由Microsoft .NET 框架类库提供的、名为“System”的命名空间。此命名空间包含 Main方法中引用的 Console 类。命名空间提供了一种分层方法来组织一个或多个程序的元素。“using”指令可以非限定地使用属于命名空间的类型。“hello,world”程序使用Console.WriteLine 作为sole.WriteLine 的简写形式。(为了简洁起见,此规范中的大多数示例都省略了using System; 指令。) 类是描述一群具有相似特性(属性)、相同行为(方法)与意义,且和其他对象间有共同关系的对象。类,通过实体化过程后成为对象,即一个真正可以用于应用的程序。本例类名为“HelloWorld”。 Main 方法是程序的入口点,程序控制在该方法中开始和结束。该方法在类的内部声明。作为程序入口点,由于该方法需要在类被实体化前存在,则它必须为静态的(即采用static修饰)。其中Main方法使用void修饰说明该方法不返回值。写 Main 方法时既可以不使用参数,也可以使用参数(本例为不使用参数)。 在 Main 方法中可以创建对象及调用其他方法。 Main 方法是 HelloWorld 类的成员。它具有 static 修饰符,因此是 Hello 类的方法而不是此类的实例的方法 在上面的示例中,还应用到了Console类。Console类是.NET Framework专门为开发控制台应用程序封装的一个类,其中包含了控制台应用程序所需的获取标准输入、输出和错误流的操作。同时对从控制台读取、写入字符和字符串的应用程序提供基本支持。本例中使用了“WriteLine”方法,即向控制台中写入字符串“Hello World”。 2. C#的类 本章已经提到,C#是一个完全的面向对象的编程语言,因此类可以说是C#程序中最主要的组成部分。和其他编程语言类似C#中的类是具有相同数据结构和操作的对象的集合,它们同样是一个对象的集合。下面的代码将创建一个person类。 285 网页设计 ?286? public class person { //在这里面可以增加属性和方法。 } 现在给上面的person类增加一个姓名和年龄的属性。 public class person { private string _Name; private int _Age; public string Name { get { return _Name; } set { _Name=Value; } } public int Age { get { return _Age; } set { _Age=Value; } } } 接下来给上面的类增加一个ToString()的方法。 public class person 286 第七章 大型网站设计——服务器端动态网页设计?287? { private string _Name; private int _Age; public person() { // // TODO: Add constructor logic here // } public string Name { get { return _Name; } set { _Name= Value; } } public int Age { get { return _Age; } set { _Age=Value; } } public string ToString() { return 姓名:+_name+,年龄:+_Age; 287 网页设计 ?288? } } 这样就完成了一个完整的类的定义,需要注意的是类在定义的时候需要指定他的访问权限,这个设定是通过类的修饰符来定义的。在C#中,可以有下面的一种或几种的组合:new、public、protected、internal、private、abstract和sealed,同样的修饰不能出现两次以上(包括两次)。 7.2.4 小结 本节着重介绍了ASP.NET技术的相关基础知识,包括ASP.NET技术的调试平台的安装与配置、名字空间的含义和ASP.NET项目中包含的文件类型。最后,本节还简要介绍了本章中用来进行ASP.NET开发的C#语言的相关基础知识,包括:C#程序的基本结构和C#程序中的类。 7.3 ASP.NET网络表单,Web Form, 7.3.1 网络表单(Web Form)介绍 1. 什么是网络表单(Web Form), 表单(Form)在ASP.NET中具有特殊的含义。和HTML的中的Form标记不同,在ASP.NET中Web Form则代表了一个一个的Web页面。总的看来,Form就像是一个容纳各种控件的容器,各种控件都必须直接或者间接的和它有依存关系。因此,有的开发者称其为“Web页面”。WEB表单,实际上是一个“对象”(Object),具有的其特有的属性和方法。MS.NET架构里面一个比较重要的概念就是“对象”:所有的控件都是对象,甚至数据类型都成了对象;每种数据类型都有自己特有的属性和方法。 WEB FORM文件的后缀名是ASPX。当浏览器第一次请求一个ASPX文件时,WEB FORM页面将被CLR(common language runtime)编译器编译。此后,当再有用户访问此页面的时候,由于ASPX页面已经被编译过,所以,CLR会直接执行编译过的代码。这和ASP的情况完全不同。ASP只支持VBScript和JavaScript这样的解释性的脚本语言。所以ASP页 288 第七章 大型网站设计——服务器端动态网页设计?289? 面是解释执行的。当用户发出请求后,无论是第一次,还是第一千次,ASP的页面都将被动态解释执行。而ASP.NET支持可编译的语言,包括VB.NET、C#、Jscript.NET等。所以,ASP.NET是一次编译多次执行。 为了简化程序员的工作,ASPX页面不需要手工编译,而是在页面被调用的时候,由CLR自行决定是否编译。一般来说,下面两种情况下,ASPX会被重新编译: 1) ASPX页面第一次被浏览器请求; 2) ASPX被改写 由于ASPX页面的编译特性,使ASPX页面的访问速度要比PHP和ASP页面的访问速度提高很多。 2. 一个简单的Web Form 在ASP.NET中,ASPX文件是最常用的一种文件,微软公司建议将所有相关的文件,哪怕是纯HTML文件都以ASPX文件的形式来保存,这样能够提高访问的速度。 下面就是用前面学习的知识来创建第一个Web Form。首先在VS.NET中创建新一个Visual C#项目,如图4所示,在模板窗口中选择ASP.NET Web应用程序,然后在下面的“位置”栏中填入ASP.NET应用在服务器上的位置,填写的格式是使用URL的方式,或者使用程序的默认值。点击确定按钮,完成应用的创建工作。 图4 VS.NET IDE新建项目窗口 289 网页设计 ?290? 接下来打开解决方案管理器,创建eg1.aspx文件,双击该文件,在主工作区就会显示该页的布局和代码,通过点击主工作区下放的HTML按钮,emc易倍就能够看到eg1.aspx的代码,把下面的代码拷贝到eg1.aspx文件中,然后从浏览器访问这个文件: 例1:
然后就可以在浏览器中察看eg1.aspx了,如图5所示,地址的格式如下:图5 例1的执行结果 其中yourhost是当前应用所在的服务器名,yourapp是文件所在应用的名称。由于我们没有对表单提交做任何响应,所以,当按下“查询”按钮后,页面的内容没有什么改变。 290 第七章 大型网站设计——服务器端动态网页设计?291? 3. ASP.NET中Web页的处理过程 这一节我们将深入到asp.net内部,看看页面是怎样被处理的。 和所有的服务器端进程一样,当ASPX页面被客户端请求时,页面的服务器端代码被执行,执行结果被送回到浏览器端。这一点和ASP并没有太大的不同。 但是,asp.net的架构为我们做了许多别的事情。比如,它会自动处理浏览器的表单提交,把各个表单域的输入值变成对象的属性,使得我们可以像访问对象属性那样来访问客户的输入。它还把客户的点击映射到不同的服务器端事件。 了解WEB页面的处理过程很重要。这样你可以仔细地优化你的代码,提高代码的效率。 每一次页面被请求,或者页面事件被提交到服务器,asp.net运行环境将执行必要的代码,重建整个页面,把结果页面送到浏览器,然后抛弃页面的变量、控件的状态和属性等等页面信息。当下一次页面被处理时,asp.net运行环境是不知道它的上一次执行情况的。在这个意义上,ASPX页面是没有状态的。这也是HTTP
的特点(为了加速页面的访问,在asp.net页面里面可以使用缓存机制,也就是保存页面的执行结果,下一次页面被请求时,直接送回上一次的执行结果。)。 在ASP中,当页面被提交到服务器端时,只有那些用户输入的值被传递到服务器。其他的比如组件的属性、变量的值,是不会传递的。所以服务器无法了解组件的进一步的信息。 在asp.net中,页面对象的属性、页面控件的属性被称为“view state”(页面状态)。页面状态在asp.net中被受到特别关照。在实现上,asp.net通过把页面的状态封装到一个隐藏的输入域,从而可以在不同的页面之间实现传递页面的状态。 在页面处理的内部过程是按照如图6所示的顺序进行的: 图6 页面处理的内部过程的顺序 首先,页面的状态被恢复,然后触发Page_Load事件。在这个过程中,你可以读取或者 291 网页设计 ?292? 重置页面的属性和控件的属性,根据IsPostBack属性判定页面是否为第一次被请求,执行数据绑定,或者进行数据库连接等操作。 第二个阶段是事件处理,也就是处理访问者在本页访问时所激发的各种事件。用户可以处理特定的事件,也可以在表单需要校验的情况下,根据IsValid属性判定页面的输入是否有效。 第三个阶段Page_unLoad是在访问者离开本页的时候开始的,在这个阶段通常进行一些清理工作,比如关闭打开的文件和数据库链路,或者释放对象等。 上面我们
了页面处理最重要的几个阶段。但是实际上,页面的处理过程远比上面的复杂,因为在实际应用中,页面上的每一个控件都需要进行适当的初始化。 7.3.2 什么是事件, 在asp.net中,事件是一个非常重要的概念。所谓事件就是指一个应用程序上的任何组成元素的状态因为外部或者内部的原因造成的状态的一次改变,开发者能够将一定的方法和事件连接起来,一旦事件发生,程序就会执行相应的方法,作为对事件的响应来处理控件的变化。 在ASP.NET中,事件就是页面上的控件因为访问者或者自身的原因,其状态发生改变的情况。ASP.NET提供了非常便利的机制帮助开发者完成对事件的处理。下面的例子将说明事件在Web Form 中的应用。 1. 事件的处理 在一个Web Form中,可以包含一个或者多个Web元素或者控件,每一个Web元素或者控件都有若干可以进行处理的消息。emc易倍在下面的示例中,页面包含三个Web控件,一个Label控件,两个Button控件,用户可以点击两个Button中的任意一个,点击的事件将被程序处理,在Label控件上显示相应的信息。 示例是由两个文件组成,其中“eg2.aspx”文件是ASP.NET的页面文件,“eg2.aspx.cs”文件是处理eg2.aspx页面的相应事件的代码文件。 例2:
可以看到在eg2.aspx中,添加了三个Web控件,分别是asp:Label:Label1、asp:Button: Button1和asp:Button:Button2。在eg2.aspx的第一行代码中,Page Language一项设定了本 页的服务器端代码使用的是C#,Codebehind中设定了本页的服务器端代码保存在 eg2.aspx.cs中。页面初始显示如图7所示: 293 网页设计 ?294? 图7 eg2.aspx初始显示 /*源文件el Label1; protected System.Web.UI.WebControls.Button Button1; 294 第七章 大型网站设计——服务器端动态网页设计?295? protected System.Web.UI.WebControls.Button Button2; private void Button1_Click(object sender, System.EventArgs e) { this.Label1.ForeColor=System.Drawing.Color.Green; this.Label1.Text=
; } private void Button2_Click(object sender, System.EventArgs e) { this.Label1.ForeColor=System.Drawing.Color.Yellow; this.Label1.Text=
; } } } 在eg2.aspx.cs的代码中,定义了一个类WebForm1,继承了System.Web.UI名字空间下 的Page类。然后在WebForm1添加了两个消息处理函数非别为Button1_Click和 Button2_Click,这两个函数分别响应“按钮一”和“按钮二”的点击事件。在这两个函数体 中,首先改变了Label1控件的ForeColor属性,也就是改变Label1控件的前景色,这样显示 出来的字体就会改变成新设定的颜色,然后改变Label1控件中显示的文字,来区分两个按钮 的点击事件。点击“按钮一”和“按钮二”后页面情况如图8和图9所示: 295 网页设计 ?296? 图8 点击“按钮一”后的页面显示 图9 点击“按钮二”后的页面显示 7.3.3 Web Form中的控件 1.什么是控件, 在前面的例子里,在一个Web Form中添加了按钮控件和Label控件,并且给控件添加事件处理函数来处理访问者对控件的操作,那么控件的具体定义是什么呢, 在ASP.NET中,一切都是对象,控件也是Web From中能够容纳的对象的一种,也就是说控件是具有可重用性、具有一定的外观、具有一定的属性和方法,能够完成一定的功能,并且能够被用户在Web Form中引用的对象或者组件,大多数控件还可以响应事件。在eg1.aspx简短的代码中,就是用到五个控件,它们分别是asp:textbox、asp:dropdownlist、asp:label、Button和Form控件,如图10所示: 296 第七章 大型网站设计——服务器端动态网页设计?297? 图10 Eg1.aspx中使用的控件 从eg1.aspx的代码中可以看到,一个Web Form最主要的组成部分就是控件,微软公司为了方便开发者使用,将控件分为三类,每一类控件都有其自身的特点。 2. 控件的分类 在ASP.NET中的控件主要分为三类:服务器端控件(Server Control)、HTML控件(HTML Control)和用户自定义控件(User Control)。 服务器端控件(Server Control)就是指在服务端存在和运行的控件。服务器端控件也有自己的外观,在客户端浏览器中,Server Control的外观由HTML代码来表现。Server Control会在初始化时,根据客户的浏览器版本,自动生成适合浏览器的HTML代码。以前做网页或者做ASP程序时候,必须考虑到浏览器的不同版本对HTML的支持有所不同,比如Netscape和IE对DHTML的支持就有所不同。当时,解决浏览器版本兼容问题的最有效方法,就是在不同版本的浏览器中作测试。现在,由于Server Control自动适应不同的浏览器版本,也就是自动兼容不同版本的浏览器,程序员的工作量减轻了许多。 常用的服务器端控件主要有如下几种:文本输入控件(ASP:textbox)、按钮控件(ASP:Button)、复选控件(ASP:CheckBox)、单选控件(ASP: RadioButton)、验证控件、选择控件和列表控件等。 HTML控件比较常见,也就是通常用来制作网页的HTML语言中的TAG,但是和以往 297 网页设计 ?298? 的HTML不同的是,HTML控件在服务器端是可见的,也就是可以通过服务器端运行的程序来改变HTML控件的属性或者处理HTML控件的事件。 ASP.NET中提供了增加内嵌服务器控件的功能,使开发者能够多次的轻松增加你所定义的各种控件。事实上,对于表单等各种控件,可以不用更改或者稍微更改一下就可以多次使用的。在通常情况下,把一个用作服务器控件的web表单统称为用户控件,用一个.ascx为后缀的文件保存起来,这样的保存使得它不被当作一个web表单来运行,当开发者在一个.aspx文件中使用它时,使用Register方法来进行调用。假设有一个文件名为saidy.ascx的文件,那么用下面的语句来调用它:
上面的TagPrefix标记为用户控件确定一个唯一的名字空间,TagName为用户控件确定一个唯一的名称,也可以用其它的名字代替“Message”,Src为确定所包含的文件名称和路径。在Web From中就可以用下面的语句来调用这个自定义控件了:
接下来将通过几个示例来分别说明这三类控件的使用方法。 3. 服务器端控件(Server Control)的使用 在下面的例子eg4.aspx里,将通过一个电子邮件和密码的页面的构建给读者介绍服务器端文本输入控件和验证控件的使用。 文本输入控件目的是让用户输入文本,文本模式是一个单行的输入框,但是用户可以根据自己的需要把它改成密码输入模式或者多行输入模式。 在下面的例子中用单行文本输入模式和密码模式来说明。在ASP.NET中,输入一个文本,可用下面的语句来表示:
第一句为注释,第二句就是文本输入控件的引用,开发者可以设定输入框的宽度和文本的长度,runat=server为表示运行于服务器端。 下面来看看输入控件的校验,在这里使用校验控件来完成。使用校验控件,一个简单的语句就可以实现在普通的html页面上的复杂的JavaScript、VBScript或者其他代码的验证。首先用户必须输入邮件地址:不能为空--
ControlToValidate=email属性为针对TextBox id=email的文本框,Display属性我们定义为“Dynamic”,即为当鼠标光标所在位置发生变化时属性根据条件变化。如果输入为空,则打印出“*”字符出来。 在通常情况下,邮件地址总会包含一些特定的字符,在验证的时候,就可以要求用户输入的内容中包含我们规定的字符。
ControlToValidate=email语句的作用和扇面介绍的一样, ValidationExpression = ^[\w-]+@[\w-]+\.(comnetorgedumil)$表示在输入的邮件地址里要包含的内容,如果没有包含这些内容,则打印出“不是有效邮件地址“这个提示。 对密码的校验也是同样的道理,二者主要的差别是,对于密码通常要求要确认输入一次,校验两次输入的密码是否相同。用下面的代码来完成校验:
ControlToValidate=passwd2 ControlToCompare=passwd此语句即为两个密码之间的比较,如果不相等则打印出“密码不相等“的提示。 299 网页设计 ?300? 下面是例三完整的源代码: 例三:
eg3.aspx的执行结果如图11所示: 302 第七章 大型网站设计——服务器端动态网页设计?303? 图11 页面eg3.aspx的执行结果 在eg3.aspx的文本输入控件中进行输入,如果输入的内容与所需要填写的内容不符,比如两个密码不同或者填写了无效的电子邮件地址,那么将得到如图12所示的结果。 303 网页设计 ?304? 图12 页面eg3.aspx中进行不正确输入的结果 在例三中,使用到了文本输入控件和三种校验控件,基本上所有服务器端控件的使用都和上面用到的控件的使用方法相同,就是将控件放置在Web Form中合适的位置上,然后给控件的属性设置适当的值,来控制控件完成所需要的功能。 接下来看一下HTML控件的使用。 4. HTML控件的使用 HTML控件的使用和服务器端控件的使用非常类似,但是其功能相对服务器端控件来说较弱,在应用中通常是通过事件响应函数对HTML控件的状态变化进行处理。 例四(eg4.aspx)就是典型的HTML控件的使用,其中引用的HTML控件为HTMLTextArea控件。 和HTML中的一样,在ASP.NET中的TextArea也是一个多行输入框。TextArea的宽度由它的Cols属性决定,长度由Rows属性决定。 TextArea控件的定义如下:
例4: 304 第七章 大型网站设计——服务器端动态网页设计?305? 首先是eg4.aspx文件的源代码:
+ this.TextArea1.Value; } } } 在Submit1按钮的消息响应程序中,程序取到了TextArea控件中用户填写的文字,然后将这些文字赋值给Span1控件的InnerHtml属性,Span1控件就会将InnerHtml属性中的值显示在页面上。 在上面的例子中,HTML控件看起来和HTML语言是一样的,但是html语言书写和以服务器端控件的实现在思维方式上已经有了很大的不同。对于html语言而言,只是一种标识;而对服务器端html控件而言,却已演变成为一段程序,一个对象。两者的区别不仅仅是一个写在HTML文件中、一个写在ASP.NET文件中。HTML文件依赖于客户端对标识的解释执行,HTML控件却可以被编译执行,两者在效率上的差异不言而喻。 为了提高开发者所开发的程序的重用性,ASP.NET还提供了用户定义控件。接下来就看一看用户定义控件的使用。 5. 用户自定义控件的使用 用户自定义控件在ASP.NET中是使用.ASCX文件来保存的,在ASPX页面文件中只要按照前面提到的方法对控件进行引用就可以将自定义控件的功能嵌入到ASPX页面中了。 在下面的例5中,将使用一个简单的例子来说明用户自定义控件的使用方法。首先新建一个Web用户控件eg5.ascx,在里面添加控件代码,然后在eg5.aspx中对eg5.ascx进行注册和引用。具体代码如下: 例5:用户控件示例
示例五控件外观如图13所示: 图13 用户自定义控件eg5.ascx的外观 接下来在eg5.aspx文件中注册用户控件eg5.ascx,具体代码如下:注册完之后,就可以使用下面的代码在页面中进行对用户自定义控件的引用:eg5.aspx文件的完整源代码如下:
eg5.aspx的结果如图14所示。 图14 用户自定义控件的使用 在ASP.NET项目中使用用户自定义控件进行开发有三个主要的好处: , 简化了自己程序开发的周期,提高了代码的重用性。 , 有助于形成具有自己特色的风格。 , 隔离了错误发生的根源,修改自己定义的控件时,不必考虑其他因素。 308 第七章 大型网站设计——服务器端动态网页设计?309? 7.3.4 小结 本节中主要介绍了ASP.NET中动态网页的主要组成部分Web Form和控件。ASP.NET中的各种开发语言都是完全的面向对象的语言,因此在ASP.NET中,一切都是对象,包括Web Form和控件。Web Form对象像一个容器,包容整个页面上的控件和其他组成元素。控件主要分为三类,服务器端控件、HTML控件和用户自定义控件,在本节的最后,通过示例给读者讲解了三种控件的具体使用方法。 7.4 数据库编程和ADO.NET 7.4.1 数据库编程简介 1. 为什么要使用数据库编程, 在大型的网站开发中,数据库的使用是不可避免的。由于大型网站庞大的信息量和对更新速度以及方便性的需要,将所有的数据放在数据库中进行管理是开发这唯一的选择。现代的关系型数据库提供了高度的数据安全性、稳定的数据共享性、方便了数据访问性以及对数据存贮的自动管理特性,都决定了采用数据库管理数据是大型网站的唯一选择。 数据库只能用来保存数据,而访问者不会也不可能直接连接到数据库中访问和添加网站的数据,访问者只能通过开发者构建的服务器端动态网站来访问以一定方式组织好的数据,并且通过对网站的操作来更新数据库中的数据。因此,在大型动态网站的开发过程中,不可避免地要使用到数据库,并且要进行数据库编程。 2. 数据库编程的含义 在ASP.NET中,数据库编程主要包括两大部分的内容。第一部分就是数据库的连接与操作。开发者开发的是服务器端动态网页,那么首先要做的事情就是在动态网页和数据库之间建立起来互相传递数据和操作命令的连接;接下来就是通过这个连接访问数据库中的数据,并且在动态网页上以一定的格式显示出来;最后当访问者通过动态网页提交新的数据或者变更了原有的数据,动态网页还需要对数据库中的数据进行添加、删除或者修改。当然,在访 309 网页设计 ?310? 问者离开页面之后,需要切断数据库和动态网页之间的连接,把有限的资源留给别的访问者。 第二部分就是利用ASP.NET提供的控件和数据绑定技术完成对数据库中数据的显示。在第一部分中,已经提到了对数据库中数据的显示,但是上面的显示是通过很多显示和流程控制的C#语句实现的,如果利用ASP.NET提供的控件,就可以利用很少的代码,方便、快捷、美观的将数据显示出来。 在下面的内容里,将通过实例详细介绍数据库编程中两大部分的具体实现方法。 7.4.2 数据库的连接与操作 1. ADO.NET简介 在ASP中,开发者使用ADO(Microsoft ActiveX Data Objects)来进行数据库的连接与操作,在ASP.NET中,emc易倍开发者同样可以使用ADO.NET来进行数据库相关的开发工作。 ASP.NET是ADO的改进版本。利用ADO.NET,通过ADO.NET的Managed Provider所提供的应用程序编程接口(API),开发者可以轻松地访问各种数据源的数据,包括OLEDB所支持的数据库和ODBC支持的数据库。 2. Managed Provider简介 ADO.NET的Managed Provider是一个多层结构的无连接的一致的编程模型。Managed Provider提供了DataSet和数据中心(如MSSQLServer)之间的联系。Managed Provider包含了访问和存取数据库的一系列接口。主要有三个部件: 连接对象Connection、命令对象Command、参数对象Parameter提供了数据源和DataSet之间的接口。DataSetCommand接口定义了数据列和表映射,并最终取回一个DataSet。 数据流提供了高性能的、前向的数据存取机制。通过IdataReader,你可以轻松而高效地访问数据流。 更底层的对象允许你连接到数据库,然后执行数据库系统一级的特定命令。 过去,数据处理主要依赖于两层结构,并且是基于连接的。连接断开,数据就不能再存取。现在,数据处理被延伸到三层以上的结构,相应地,开发者需要切换到无连接的应用模型。这样,DataSetCommand就在ADO.NET中扮演了极其重要的角色。它可以取回一个DataSet,并维护一个数据源和DataSet之间的“桥”,以便于数据访问和修改、保存。DataSetCommand自动将数据的各种操作变换到数据源相关的合适的SQL语句。DataSet 310 第七章 大型网站设计——服务器端动态网页设计?311? Command包含四个Command对象:SelectCommand、InsertCommand、UpdateCommand、DeleteCommand分别用来进行数据库的查询、插入、更新、删除操作。 3. DataSet简介 DataSet是ADO.NET的中心概念。DataSet就像一个和数据库同步的内存中的数据库,开发者可以通过DataSet直接获取数据库中的数据。正是由于DataSet,才使得开发者在编程序时可以屏蔽数据库之间的差异,从而获得一致的编程模型。 DataSet支持多表、表间关系、数据约束等等。这些和关系数据库的模型基本一致。 DataSet里的表(Table)是用DataTable来表示的。DataSet可以包含许多DataTable,这些DataTable构成TablesCollection对象。 DataTable定义在System.Data名字空间中,它代表内存中的一张表(Table)。它包含一个称为ColumnsCollection的对象,代表数据表的各个列的定义。DataTable也包含一个RowsCollection对象,这个对象含有DataTable中的所有数据。 DataTable保存有数据的状态。通过存取DataTable的当前状态,可以知道数据是否被更新或者删除。 各个DataTable之间的关系通过DataRelation来表达,这些DataRelation形成一个集合,称为RelationsCollection,它是DataSet的子对象。DataRelation表达了数据表之间的主键以及外键关系,当两个有这种关系的表之中的某一个表的记录指针移动时,另一个表的记录指针也随之移动。同时,一个有外键的表的记录更新时,如果不满足主键或外键约束,更新就会失败。 在DataSet中还有一个子对象ExtendedProperties,在这个对象里可以定义特定的信息,比如密码、更新时间等。 7.4.3 数据库的访问 1. ADO.NET访问数据库的步骤 在ADO.NET里,访问数据库步骤相对于ASP有很大的变化。ADO.NET的最重要概念之一是DataSet,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是指即使断开数据链路,或者关闭数据库,DataSet依然是可用的。因为DataSet的存在,ADO.NET访问数据库的步骤就相应地改变了: 311 网页设计 ?312? (1) 创建一个数据库链路; (2) 请求一个记录集合; (3) 把记录集合暂存到DataSet; (4) 如果需要,返回第2步;(DataSet可以容纳多个数据集合) (5) 关闭数据库链路; 接下来开发者可以在DataSet上作所需要的操作。 DataSet在内部是用XML来描述数据的。由于XML是一种平台无关、语言无关的数据描述语言,而且可以描述复杂数据关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。 2. ADO.NET常用对象介绍 ADO.NET中包含很多种对象类型,这里只介绍最基本的也最常用的几个。 首先是sqlConnection。sqlConnection的作用是维护一个由动态网页到数据库的连接。为了使用ADO.NET对象,开发过程中需要引入两个NameSpace:System.Data和System.Data.sqlClient,使用前面介绍过的Import指令就可以了:如果在C#文件中,要使用如下格式来引用名字空间: using System.Data; using System.Data.sqlClient; sqlConnection对象常用的方法有Open和Close两个。下面的代码段展示了如何连接到本地的MS SQL Server上的Pubs数据库。 using System; using System.IO; using System.Data; using System.Data.Common; using System.Data.sqlClient; namespace DBtest { public class dbtest : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { 312 第七章 大型网站设计——服务器端动态网页设计?313? // 在此处放置用户代码以初始化页面 // 设置连接串,连接本机的SqlServer数据库 string strConnection = server=localhost;uid=sa;pwd=;database=pubs; // 创建sqlConnection对象 sqlConnection objConnection=new SqlConnection(strConnection); objConnection.Open(); //打开数据库连接 Response.Write(数据库连接成功); // 在页面输出信息,需要数据显示语句代替 objConnection.Close(); //关闭数据库连接 } } } 应该提到的是,ADO.NET提供了三种数据库连接方式:OldDb方式、ODBC方式和SQL方式。这里介绍的方法是通过SQL方式连接到数据库。 和数据库建立好了连接,但是ADO.NET的主角——DataSet还没有出场。接下来的工作就是建立DataSet对象,并将数据填充到DataSet对象中去。 要完成填充DataSet的填充,还需要介绍第二个常用对象:SqlDataAdapter类。SqlDataAdapter对象是DataSet对象和数据库之间的桥梁,用于检索和保存数据。SqlDataAdapter 对象通过对数据源使用适当的SQL 语句来更新DataSet对象中的数据。SqlDataAdapter对象用来填充DataSet对象的方法是分别是Fill方法(它可更改 DataSet 中的数据以匹配数据源中的数据)和 Update方法(它可更改数据源中的数据以匹配 DataSet 中的数据)。SqlDataAdapter 与 SqlConnection 和 SqlCommand 一起使用,以便在连接到数据库时提高性能。 在上面的示例中,已经完成了数据库的连接,那么将Response.Write一句用创建DataSet对象和SqlDataAdapter对象的代码代替,具体代码如下: DataSet objDataSet = new DataSet(); //创建DataSet对象 SqlDataAdapter objAdapter = new SqlDataAdapter(); //创建SqlDataAdapter对象 string strQuery = Select * from authors; //创建查询语句段 objAdapter.SelectCommand = new SqlCommand(strQuery, objConnection); //执行查询语句 objAdapter.Fill(objDataSet); //用查询结果填充DataSet对象 填充完查询结果,访问示例页面会发现在页面上没有任何现实,这是因为DataSet对象是不能在页面上显示任何信息的。在ASP.NET中,显示DataSet对象中的数据的常用控件是 313 网页设计 ?314? DataGrid,它是ASP.NET中的一个HTML控件,可以很好地表现为一个表格,表格的外观可 以任意控制,甚至可以分页显示。这里我们只需要简单地使用它:剩下的任务就是把DataSet绑定到这个DataGrid控件上,绑定是ASP.NET的重要概念, 也就是将一个对象和另外一个对象的内容联系起来。下面就把它和DataGrid绑定: if (!this.IsPostBack) { DataGrid1.DataSource = objDataSet; //设定控件的数据源 DataGrid1.DataKeyField = au_id; //设定数据表的主键 DataGrid1.DataBind(); //进行绑定 } 这样就完成了整个数据库访问的过程,例6的完整源代码如下: 在eg6.aspx文件中,添加DataGrid控件DataGrid1: 例6:dbtest在eg6.aspx.cs文件中,完成数据库连接、访问到显示的代码的编写: //源文件 eg6.aspx.cs using System; using System.Collections; using System.ComponentModel; 314 第七章 大型网站设计——服务器端动态网页设计?315? using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb; namespace CStest { public class dbtest : System.Web.UI.Page { protected System.Web.UI.WebControls.DataGrid DataGrid1; private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 // sql Managed Connection string strConnection = server=localhost;uid=sa;pwd=;database=pubs; SqlConnection objConnection=new SqlConnection(strConnection); objConnection.Open(); DataSet objDataSet = new DataSet(); SqlDataAdapter objAdapter = new SqlDataAdapter(); string strQuery = Select * from authors; objAdapter.SelectCommand = new SqlCommand(strQuery, objConnection); objAdapter.Fill(objDataSet); if (!this.IsPostBack) { DataGrid1.DataSource = objDataSet; DataGrid1.DataKeyField = au_id; DataGrid1.DataBind(); } 315 网页设计 ?316? objConnection.Close(); } } } 对数据库的访问结果如图15所示: 图15 数据库的访问结果(将数据库中的作者名单列出) 7.4.4 小结 本节详细介绍了如何使用ADO.NET方法访问数据库的步骤,并给出了一个具体的例子演示如何从服务器端取得pubs数据库中的authors表的数据到本地的DataSet中,然后使用DataGrid控件绑定到DataSet上,最后在客户端显示。虽然这还比较简单,但这却是最常用的技术。 316 第七章 大型网站设计——服务器端动态网页设计?317? 7.5 ASP.NET的会线 会线. 为什么要进行会话管理, 通常的 Web 应用程序都因为Web技术本身的限制而处于无状态环境中,了解会话状态的概念并没有实际的意义。但是在大型的网站开发过程中,有效的状态管理是一个必备的功能。用户在与网站的交互过程中,用户的访问状态和关键数据是需要在各个页面中不断的传递和保持的。如果没有会话管理的支持,网站就没法分别区分当前的用户是否发生变化。鉴于这种需要,ASP.NET 以及许多其他服务器端编程环境都提供了一个抽象层,允许应用程序基于每个用户和每个应用程序存储持久性数据。 需要特别注意的是,Web 应用程序的会话状态是应用程序在不同的请求中缓存和检索的数据。会话表示用户在与该站点连接期间发送的所有请求,会话状态是用户在会话期间生成和使用的持久性数据的集合。每个会话的状态都彼此独。