大约有将近一百万名开发人员使用 Framework的第一个版本来开发网站所以在年的夏天当从Microsoft传出将有新版本发布的传闻时许多人的耳朵都竖了起来这个新的版本将使得创建ASPNET页面所需的代码行数减少%像这样大规模的提高生产效率在程序设计中是不多见的当ASPNET 的代码样例在年秋的Microsoft专业开发人员大会(Microsoft Professional Developers Conference)上演示时结果比预计的还要好以前使用ASPNET的第一个版本程序员需要花费几个小时才能做出的页面现在使用ASPNET 只需要几分钟就完成了简单来说在NET Framework 最终版本发布之后任何继续使用第一个版本创建ASPNET页面的程序人员都将花费大量的额外时间才能达到相同的结果
也许就像其他任何领域一样ASPNET 所提供的优势是能够方便地将数据集成进页面程序员不再需要知道详细的连接命令以及数据阅读器和数据适配器对象就能执行普通数据任务了对于初学者掌握能力ASPNET 使得基本数据的使用简单易学并且有能力进行更复杂的数据应用
NET Framework
Microsoft开发出了作为基本原理的NET和一系列技术用于在互联网中让计算机共同工作总的目标就是让信息和进程在大范围的系统和设备之间顺畅地交流NET不是一种语言也不是一个特别的产品更确切地说它是一套标准和规范并已经应用于自年以来Microsoft发布的所有产品中
NET包含了一种使用开放标准的XML格式交换信息的标准化格式可扩展标记语言(Extensible Markup LanguageXML)不需要请求者具备任何有关数据存储如何保存信息的专门知识—— 数据都以自描述的XML格式取出同样地目前几乎所有的数据存储都可以用XML来提供信息这对于所有NET数据客户都具有吸引力
NET支持软件的Web Services标准可请求在使用了开放平台标准的简单对象访问协议(Simple Object Access ProtocolSOAP)和XML的远程软件上运行代码NET网站可以从另外一个网站上找到该网站所提供的服务并使用这些服务这样可以使得网站从其他的网站上获得HTML计算后的结果或者数据集
作为NET开端的一部分Microsoft发布了一套运行时编程工具和应用编程接口(API)称为NET Framework让开发团队能够创建NET应用程序和XML Web ServicesNET Framework由公共语言运行库(Common Language RuntimeCLR)和一套统一的类库组成
CLR为运行的应用程序提供了一个完全管理的执行环境其中包括几个服务例如程序集装载和卸载进程和内存的管理安全实施以及即时编译等CLR名称的意思就是指能够用多种语言编写应用程序并且将源代码编译成CLR能够读懂并运行的中间语言而无需考虑原来所使用的语言这种语言独立性就是CLR的关键特性(也是ASPNET的特性)它允许开发人员使用自己喜欢的语言工作比如C#VB或者Cobol都能够获得NET Framework的常用特性
NET Framework还包括了一套类库这套类库提供了每一个应用程序所需的常用功能可以使用NET Framework支持的任何语言来访问这些类库由这些类库提供的服务(以及相应的命名空间)如下
· 基本类型(System)
· 输入/输出(SystemIO)
· 数据访问(SystemData)
· 安全(SystemSecurity)
· 数据结构(SystemCollections)
· 配置(SystemConfiguration)
· 连网(SystemNet)
· 反射(SystemReflection)
· 全球化(SystemGlobalization)
· 绘画和制图(SystemDrawing)
· 跟蹤和诊断(SystemDiagnostics)
· 窗口(客户端)应用程序模型(SystemWindowsForms)
· Web应用程序模型(SystemWeb)
注意NET Framework包含了两个应用程序编程模型一个用于客户端应用程序(SystemWindowsForms)另一个用于基于Web的应用程序(SystemWeb)本书着重讲解后一个模型NET Framework中的SystemWeb命名空间是NET Framework的一部分它提供了ASPNET功能换句话说ASPNET就是构建应用程序的所有NET Framework的一部分
ASPNET是一种用于创建基于Web的应用程序的编程模型从本质上来说运行时和NET Framework类库集可以用于创建动态Web页它需要在Web服务器的环境中运行例如Microsoft Internet Information Server(Microsoft互联网信息服务器IIS)并且根据服务浏览器请求指示在服务器上执行程序与直接由Web服务器提供的静态HTML不同的是ASPNET页面实际上是在服务器上执行以后再产生结果的页面的最后生成也许是由许多不同的指令和/或数据源构造的
ASPNET页面以aspx扩展名存储页面由程序员将文本标记(例如HTML)以及ASPNET特定服务器标记和脚本组合在一起然后存储在Web服务器上可以将存储后的ASPNET页面看成是一套描述如何创建一个HTML页面的指令当该页面被请求浏览时服务器端程序将会用纯标记来创建一个客户端浏览器可以读懂并能呈现(render)的页面因为呈现后的输出是纯标记所以任何浏览器都能够读懂所有的动态过程都发生在Web服务器端ASPNET特定服务器标记非常强大例如它可以对用户的动作作出反应连接至数据存储以及自动创建非常复杂的HTML结构
正像前面提到的那样ASPNET只是NET Framework的一部分所以 ASPNET页面可以利用这个框架提供的所有服务包括连网数据访问安全以及更多其他服务因为ASPNET可以使用所有这些服务所以相比以前能够创建更加丰富的Web应用程序只需花少量的时间来构建所有应用程序所需的构建块而将大多数时间用在应用程序独有的特殊逻辑上
ASPNET还在Web编程中引入了一些独特的新技术可以在典型的动态服务器页面(Active Server PagesASP)上极大地改善开发模式
· 语言独立性——因为ASPNET是NET Framework的一部分所以可以使用您自己选择的语言来构建ASPNET应用程序例如C#VB或J#而典型的ASP则仅限于JScript或者VBScript页面
· 编译而不是解释——与典型的ASP在每一次页面请求时都解释编程结构不同ASPNET在服务器端动态地将页面编译成可以运行得非常快的本机编程指令可以很明显地看到典型的ASP页面的性能与相同ASPNET页面的性能之间相差的数量级别
· 事件驱动编程模式——在典型的ASP中页面总是以自顶向下的线性方式执行并且HTML标记常常与程序指令混合在一起任何一个有一定ASP经验的人都知道这样会使得页面难以阅读甚至更加难以维护ASPNET引入了事件驱动模型这个模型允许您将代码与标记内容分离将代码并入处理专门任务的有意义的单元中例如响应客户端的按钮单击动作这个类似VB的事件模型极大地提高了页面的可读性和可维护性
· 服务器控件——典型的ASP需要动态地将HTML片断代码接合在一起呈现这样做的结果就是在应用程序中一遍又一遍地编写相同的代码(您需要多少次才能从数据库查询中构建一张表格)ASPNET带给Web编程的一个最大的好处就是能够将公共的呈现和行为封装成服务器控件(server control)可以在应用程序中很方便地重复使用就像HTML标记一样服务器控件以声明的形式创建但是表现为一个位于服务器端的可编程对象它可以与代码进行交互并输出定制的动态HTML呈现ASPNET包含了大约多个服务器控件这些控件封装了从标准表单元素到复杂控件(如网格和菜单)的所有内容
· 控件设计时间的改善(当使用Visual Web Developer时)—— 开发人员通过使用设计时间界面可以减少花费在开发复杂页面上的时间这些界面包括敏捷任务面板标签级导航栏和可以设置控件属性的向导 ASPNET
ASPNET的第一个版本(和)在年至年间迅速风靡了Microsoft的开发阵营程序人员很快便感觉到他们通过使用强大和灵活的NET Framework可以大大减少编码时间而且CIO们也看到当程序员花在解决客户代码的疑难问题上的时间减少时他们就可以将更多的资源投入到更高级的IT结构的改善上ASPNET确实是一个里程碑式的版本它简化了开发人员的工作
但是就在第一个版本发布之前Microsoft的ASPNET小组就已经在为开发ASPNET 而工作了他们以下面雄心勃勃的目标来开始他们的工作
· 使创建一个典型的Web应用程序所需代码行数减少%
· 提供一套可扩展的应用程序服务用来为通用应用程序任务提供构建块例如成员角色个人化以及导航等
· 创建一系列基于任务的服务器控件这些控件可以调节上述服务交付完全可定制的用户接口(UI)以最小的代码量来展示这些服务
· 当与NET Framework协同工作提供页面服务时改善IIS的性能
· 提供管理功能以便加强ASPNET服务器的部署管理和运行
· 改善宿主公司所用的工具以便可以支持多站点并能够将开发人员的项目迁移至公共部署环境
· 让ASPNET的几乎所有特性都能够方便地扩展或者用定制的高级任务的执行替换 在这里我们有必要再来细细地回想一下第一个目标也就是使编写一个动态Web应用程序所需的代码量减少%这有可能吗?Microsoft的ASPNET小组已经仔细考虑过各种以定制代码执行的通用任务并且专门制定了将这些任务封装进构建块(特别是服务器控件)的方式这样就能够自动地完成这些任务了例如大多数Web应用程序都需要安全或者导航或者个性化服务来为用户提供定制的体验在ASPNET 中这些任务是通过一系列可配置的应用程序服务以及与这些应用程序服务进行对话的服务器控件来实现的这样可以极大地减少实施这些通用服务所需的应用程序的代码量但是在所有这些通用任务当中有一个任务是绝对独立于其他应用程序的这就是数据访问服务数据是驱动所有动态Web应用程序的公用线程所以毫不奇怪ASPNET小组为了减少代码量和在ASPNET 的应用程序中执行数据访问所需的概念而制订了一些大胆的目标
· 在ASPNET中可以通过声明的(无代码)方式来定义一个数据源
· 可以通过声明的(无代码)方式用UI控件显示数据无需在页面的执行生存期中的特定时间进行显式的数据绑定
· 可以通过声明的(无代码)方式执行通用数据任务例如排序分页过滤更新插入以及删除数据
· 可以使用多种UI控件来显示数据包括灵活的网格/详细控件该控件既可以显示又可以操作数据
· 为创建定制的数据源启用可扩展的模型来支持新的数据类型
ASPNET 具有一些程序员可以使用的特定的服务器控件用于在页面上添加数据交互这些专门的数据控件分为两组数据源控件和数据绑定控件数据源控件创建与数据库的链接数据绑定控件则从数据源控件获取信息并在页面上创建呈现这种简单的双控件模式可用于多种情况对于多种数据库类型甚至是非关系型数据源都有相应的数据源控件同样地有多种数据绑定控件可用来在页面上生成表格树型列表以及其他数据格式在前面我们已对ASPNET进行了介绍同时讲述了ASPNET的一些理论现在开始介绍本书剩余部分的细节内容数据源控件和数据绑定控件的使用数据源控件以及附带产品包括如下条目
· SqlDataSource控件用于与Microsoft SQL Server和其他数据库进行连接
· AccessDataSource控件用于与MDB文件连接
· ObjectDataSource控件用于与中间层对象连接
· XMLDataSource控件用于XML文件或者数据流
· SiteMapDataSource控件用于以ASPNET 站点地图格式存储的XML文件额外的控件已经由第三方开发
在数据绑定控件中有很多与ASPNET x中的相似有一些则是ASPNET 全新开发的
· ListBoxDropDownList和BulletedListCheckBoxListRadioButtonList
· AdRotator是实现旧功能的数据绑定控件
· DataList和Repeater以灵活的布局方式提供数据
· DataGrid(与ASPNET x中的相同)和GridView(第个版本中的新控件)用于表格数据
· DetailsView和FormView以轻松的导航提供记录的信息
· TreeView用于显示分级数据
总之数据源控件和数据绑定控件将会是本书重点介绍的对象
在NET Framework 公开beta版本发布之前少数的几个程序组就已经被允许查看工作代码并希望尽快获得他们的反馈结果所有的反应只有一个那就是热烈太好了!然后就是什么时候我才能用ASPNET 替换我的ASPNET x应用程序?现在beta发布版本已经在手边我们无需再等待了
ADONET
是NET Framework中的一套类库它将会让您更加方便地在应用程序中使用数据Microsoft收集了过去几十年中最佳的数据连接的实践操作并编写代码实现这些实践这些代码被包装进了一些对象中以便其他软件可以方便地使用
ADONET中的代码处理了大量的数据库特有的复杂情况所以当ASPNET页面设计人员想读取或者写入数据时他们只需编写少量的代码并且这些代码都是标准化的就像ASPNET一样ADONET不是一种语言它是对象(类)的集合在对象(类)中包含了由Microsoft编写的代码可以使用诸如Visual Basic或者C#等编程语言来在对象外部运行这些代码
可以将ADONET看作是一个介于数据源和数据使用者之间的非常灵巧的转换层ADONET可以接受数据使用者语言中的命令然后将这些命令转换成在数据源中可以正确执行任务的命令但是就像您将会看到的那样ASPNET 提供了服务器端数据控件可以更方便地与ADONET交互工作所以有的时候这基本上减少了直接使用ADONET对象的需求
很多读者已经有使用ASPNET早期版本的经验了这一小节将回顾一下这种模式目的是演示您需要通过ADONET对象将数据引入Web页中的这一过程对那些从来都没有使用过早期版本的读者来说可以将本小节作为一个新奇的故事类似于在发现乙醚之前进行的外科技术研究在以前创建一个简单典型的ASPNET x版本的页面需要如下代码
<script runat=server>
Sub Page_Load(ByVal sender As Object ByVal e As SystemEventArgs)
BulletedListDataSource = GetAuthorsByState(CA)
BulletedListDataBind()
End Sub
Shared Function GetAuthorsByState(ByVal state As String) As SystemDataDataSet
Dim connectionString As String =
server=(local); database=pubs; trusted_connection=true
Dim dbConnection As SystemDataIDbConnection = New SystemDataSqlClientSqlConnection(connectionString)
Dim queryString As String = SELECT [authors][au_id] [authors][au_fname] [authors][au_lname] [authors]
[state] FROM [authors] WHERE ([authors][state] = @state)
Dim dbCommand As SystemDataIDbCommand = New SystemDataSqlClientSqlCommand
dbCommandCommandText = queryString
dbCommandConnection = dbConnection
Dim dbParam_state As SystemDataIDataParameter = New SystemDataSqlClientSqlParameter
dbParam_stateParameterName = @state
dbParam_stateValue = state
dbParam_stateDbType = SystemDataDbTypeStringFixedLength
dbCommandParametersAdd(dbParam_state)
Dim dataAdapter As SystemDataIDbDataAdapter = New SystemDataSqlClientSqlDataAdapter
dataAdapterSelectCommand = dbCommand
Dim dataSet As SystemDataDataSet = New SystemDataDataSet
dataAdapterFill(dataSet)
Return dataSet
End Function
</script>
<html><head runat=server><title>Untitled Page/title></head>
<body>
<form id=form runat=server><div>
<asp:BulletedList ID=BulletedList DataTextField= au_lname Runat=server />
</div></form>
</body></html>
以上示例对数据库执行了一条简单的SQL SELECT语句并将结果与一个BulletedList控件绑定页面中有一个名为GetAuthorsByState的方法该方法创建了用来完成这个任务的几个ADONET对象
· SqlConnection对象表示与数据库服务器进行连接
· SqlCommand对象表示要执行的SQL SELECT命令
· SqlParameter对象代表了一个将被命令中的标记代替的值
· SqlDataAdapter表示填充命令中的DataSet对象的能力
· DataSet表示命令结果可以与BulletedList进行绑定
在Page_Load事件中调用GetAuthorsByState方法并生成DateSet结果然后将这个结果赋给BulletedList的DataSource属性接着调用DataBind()使得BulletedList用这个数据结果将自己同步我们在页面执行生存期中的适当的时候调用DataBind()这样的做法是ASPNET 在一般情况下寻找并消除的一个关键步骤实际上在大多数情况下 ASPNET 根本不需要与ADONET进行交互操作但是理解上述ADONET对象之间的关系是非常有用的这样我们就可以讨论 ASPNET 是如何改进这个模式的
和数据访问
ASPNET 给我们提供了一个改良的数据访问模式这个模式减少了在 ASPNET x中执行数据绑定所需的代码量首先无需编程实现实例化设置属性以及调用前述列表中的ADO对象的方法您需要做的就是在页面上简单地添加服务器端控件并设置属性当呈现页面时ASPNET 将会自动地执行所有的对象实例化并调用方法创建并显示数据请将以下ASPNET 代码与上面的代码进行对比
<html>
<head runat=server><title>Demo</title></head>
<body>
<form id=form runat=server>
<asp:SqlDataSource ID=SqlDataSource Runat=server SelectCommand=SELECT au_lname FROM authors WHERE (state = @state)
ConnectionString=Server=HPSERV; Integrated Security=True;Database=pubs>
<SelectParameters>
<asp:Parameter Type=String DefaultValue=CA Name=state />
</SelectParameters>
</asp:SqlDataSource>
<asp:BulletedList ID=BulletedList runat=server DataSourceID=SqlDataSource
DataTextField=Au_lname>
</asp:BulletedList>
</form>
</body></html>
第二个改进来自于对在页面生存期中的事件敏感的服务器端控件ASPNET 服务器端控件能够在正确的时间做出正确的动作请注意在ASPNET 页面中对页面生存期中的事件的任何引用ASP早期版本的学生一般都会对在页面生存期中执行多种任务感到迷惑特别是数据绑定因此很多ASPNET x页面都会有这样的让程序员编写代码的遭遇即在错误的事件下调用DataBind或者在多个事件中多次调用DataBind这些定时操作现在都可以通过ASPNET 的服务器端数据控件来自动完成
请注意在前面的ASPNET 的代码中使用了两个服务器端控件第一个是数据源控件本例中是SqlDataSource控件该控件在后台建立了所有显示数据所需的ADO连接对象包括ConnectionCommand以及DataReader或者Dataset对象然后使用了一个名为BulletedList的数据绑定控件用来获取数据源控件的数据并在页面上呈现
术语
在完成介绍性内容之前我将提供一个到目前为止所用到的术语表
· 动态Web页—— 作为代码存储在Web服务器上的文件当被请求时可转换为HTML当页面被转换时他们可以根据用户和网站拥有者的实时情况而按照不同的请求来获取不同的表单
· IIS—— 在Windows中内置的Web服务器用于通过TCP/IP向请求者提供Web页运行于Windows 或者Windows XP Professional上的IIS可以使用NET Framework类来提供ASPNET Web页
· NET Framework—— 一组包含Microsoft编写的代码的类可以使得开发应用程序更加方便和快捷并且更易于在互联网上运行很多类都已经被封装进能够启用NET 的大约十多个Microsoft产品当中了
· CLR(公共语言运行库)—— NET Framework的一项特性可以让编程人员用多种语言编写代码然后将代码编译成可用来部署的单独统一的语言
· ASPNET—— NET Framework中的运行时和类库集用来创建动态Web应用程序
· 数据存储—— 数据被存放和管理的地方所有的RDBMS都可用于数据存储但是有些数据存储就不是RDBMS因为它们不是关系型的
· 数据库或关系型数据库管理系统(RDMS)—— 一种可以读取和操纵数据的软件大多数系统包含了用来设计和测试数据库的工具以及优化过程的工具一个RDBMS必须按照标准化形式(关系型格式)存储数据
· DataBase模式(或数据库元数据)—— 数据库结构包括表和关系的设计该模式不包括实际的数据值
· MicrosoftTM Access—— 一种基于MDB文件格式JET引擎以及一系列用于创建和使用数据库的工具的RDMSAccess价格便宜容易学习能被广泛接受并且已经被部署到很多机器上但是它不支持太多的并发用户
· JET—— 运行在后台并使用MDB(Access)文件的数据库引擎JET可以直接从其他软件(例如NET或Access)接受命令来读取或者修改MDB文件
· 结构化查询语言(Structured Query LanguageSQL)—— 一种被数据使用者用来从数据提供程序那里请求读取或者写入数据的语言经过近十年的发展SQL已经成为与RDBMS通信的标准
· MicrosoftTM SQL Server—— 一种企业级的RDBMS可以支持大量的数据和大量的并发用户
· MicrosoftTM SQL Server Express(SSE)—— 基于Microsoft SQL Server数据库引擎的可免费获得的数据库引擎与SQL Server不同的是SSE能提供的同时数据连接数量有限并且只有少数几个功能本书将在大多数示例中使用SSE
· MicrosoftTM Data Engine(MSDE)—— 与SSE类似但是基于SQL Server引擎的早期版本MSDE将在本书的练习中使用
· XML—— 一种标准的数据格式每个值都被存储并描述XML不是非常有效率(用于描述的空间通常会超过数据的大小)但是却能被很多不同的数据管理系统方便地读取
· Web页编辑器—— 一种允许打开和修改页面的软件最常用的编辑器是记事本Visual StudioVisual Web Developer和ASPNET Web Matrix与其他工具打包成一个编辑器用以提高效率 · 集成开发环境(Integrated Development EnvironmentIDE)—— 一套用来帮助编程人员开发代码的工具Visual Studio就是一个非常强大的IDEWeb ASPNET Web Matrix也提供了很多工具典型的IDE应当包含一个Web页编辑器
· ADONET—— 由Microsoft编写的类(代码)的集合作为数据存储(例如Access或者XML文件)和数据使用者(例如ASP页面)之间的中间件
· 连接—— 一个ADO对象表示数据使用者和数据提供程序之间的惟一路径
· 命令—— 一个ADO对象表示一条可以被传递给数据库的SQL语句
· 参数—— 一个ADO对象表示在语句进入数据库之前可以被插入Common Object(SQL语句)中的多个数据
· DataSet—— 一个ADO对象表示集成至记录或字段中的一组数据
· 服务器控件—— 一组独立的代码(一个对象)用于在服务器上执行任务生成兼容HTML的并且发送至浏览器的页面通过ViewState服务器端控件可以维持其状态
· 数据源控件—— 一种服务器端控件可以创建专门的惟一的数据库连接它提供了ADO对象的一种抽象并且使得编写ASPNET 页面更加快速和容易数据源控件可用于Microsoft SQL ServerAccessXML以及其他数据源
· 数据绑定控件—— 一种服务器端控件可以从数据源控件中获得数据并在页面上呈现它数据绑定控件将程序员从编写诸如<table>的HTML标记中解脱出来数据绑定控件可用于呈现表格列表树型以及其他结构