2.1 针对发展设计
既然你已经向客户承诺创建一个很酷的Web网站来提升客户商店的效率,现在该停止庆贺,开始考虑如何实现对客户所做的承诺了。通常,当你书写技术需求时,会发现所有的事情都比预期的更加复杂一些。
注解 强烈建议始终依照一种有效的项目管理方法,以使项目尽可能按预算、按时获得成功。绝大部分项目管理理论都指出,需要一个最初的需求/规格文档,包含你和客户签订的项目详细信息。在创建解决方案时,可以把该文档当作一个指南,而且当客户在开发工作已经开始后提出新需求或进行需求变更时,你可以获得额外费用。更多的内容请参考附录B。
为了确保该项目获得成功,必须采取一种精明的方法来实现已签订的合同。你希望项目的开发更平稳和快速,但最终的目标还是使客户对你的工作感到满意。因此针对提高访问量的目标,你可能计划通过创建一个漂亮、功能完备的网站,以给用户愉快的体验;通过第1章所述的三个开发阶段来创建一个反应迅速的网站。
需求总是站在较高层次上描述的,这对于当今的电子商务网站而言是很正常的。为了使成功的机会最大化,我们将尝试分析和预期尽可能多的技术需求,并以一种支持变更和新增功能的最简单的方式来实现解决方案。
在本章中,我们将为未来的BalloonShop网站创建一个基础框架。同时说明将要使用哪些技术和工具,更重要的是,如何使用它们。在继续之前,我们先对本章的目标做一个快速的总结:
l 从技术视角来分析该项目;
l 为你的应用分析并选择一个架构;
l 决定使用哪项技术、哪种编程语言和工具;
l 探讨命名和编码规范;
l 创建Web网站的基础结构,并完成数据库配置。
对于Web应用系统而言,“设计”可以用来表示很多事情。最普遍的用法可能是表示Web网站的视觉效果和用户界面(UI)设计。
这个方面是十分关键的,必须正视它,访问者通常对网站的视觉效果以及使用的简便性更容易留下印象,而对于使用什么技术,背后有什么技巧,或者Web服务器运行在什么操作系统上都不会太关心。如果网站难以使用就会很容易被遗忘,不管是用什么样的高科技来创建的。
不幸的是,这个真理却让许多经验不足的程序员低估了网站实现中不可见部分(包括代码、数据库等)的重要性。网站的视觉效果部分会引起访问者最初的兴趣,但功能才能够使他们再次访问。基于确定的最初需求,能够很快地实现网站,但如果架构设计不合理,网站的更新会很困难。
不管是什么项目,不管规模多大,有些准备工作在开始编码之前必须完成。不管做了多少规划和设计工作,总会发生意外情况,隐藏的困难、新的需求以及变化的规则似乎总会和最后期限作对。即使没有这些意外因素,网站设计者也经常在项目完成并部署之后,被要求修改或新增功能。这对于BalloonShop而言也是一样,我们在第1章已经讨论了要分成三个独立阶段开发它。
你将学会如何更好地创建该Web网站,避免在功能扩展和更新时崩溃。由于这是一本编程方面的书籍,因此并不解决电子商务的其他重要方面,诸如UI的设计、营销技术以及法律问题。你需要其他素材来解决这些问题。在本书中,将集中关注于使该网站正常工作的代码构建上。
“代码设计”这个词组可以包含不同的含义。例如,需要简单地探讨一下命名规范。不过最重要的方面是在编写代码之前关注其架构。架构指的是将许多实现简单功能(例如,商品搜索功能)的代码分解到较少的、互相连接的组件中的方法。尽管在单个组件中尽可能快速和简单地实现要完成的功能,会更加容易;但创建多个通过协作来实现预期结果的组件将会使你获得更长效的好处。
在考虑架构本身前,必须确定想从这个架构中获得什么。
以最小的努力满足长远需求
除了需要实现一个执行速度很快的Web网站之外,在第1章中所提到的每个开发阶段都将引入要满足的新需求。
每当开始一个新的阶段时,你都希望重用现有解决方案的大部分内容。如果仅是因为添加一个新的功能而重新设计网站(不仅包括视觉效果部分,还包括代码),那是很低效的。可以事先计划好解决方案的重用,以使得当添加新功能时可以简单插入,这就不会为每个新的变化而头痛。
在构建Web网站时,实现一个基于插件式组件的弹性架构,就能够将诸如购物车、门类列表或商品搜索功能编码为独立的组件,然后将其插入到现有应用程序中。达到较好的弹性水平,是应用系统架构设计的目标之一,本章将展示如何付诸实践。你会发现弹性水平是与设计和实现所花费的时间成正比的,因此必须寻求一个折中点,既不使代码过于复杂又能获得最大的利益。
对于所有在线应用系统而言,另一个主要的需求是可伸缩的架构。伸缩性的定义是只需通过增加资源,就能够线性地提高服务能力。换句话说,在一个可伸缩的系统中,客户请求数和处理这些请求所需的硬件资源数之间的比率(比例)是常数,即使当客户的数量不断增加时(理想状态)。而一个不可伸缩的系统,不管提供多少硬件,都无法处理客户数量的增长所带来的需求。由于我们对顾客的总数很有信心,因此必须确保网站能够向大规模的客户提供这个功能,并且不会抛出异常或执行速度缓慢。
可靠性对于电子商务应用而言也是一个很重要的方面。在异常处理策略和强大的关系数据库的帮助下,你可以确保数据的完整性,而非致命错误也不会使网站被击垮。
2.2 三层架构的魔力
通常,架构是指将应用系统的每个功能部分分解到独立的组件中,并将各种组件划分到各个逻辑层中。
现在三层架构越来越流行,这是因为它回答了迄今为止所讨论的所有问题。它将应用系统的功能单元分到三个逻辑层中:
l 表示层;
l 业务层;
l 数据层。
表示层包括网站的UI元素,并且包含管理访问者和客户的业务之间的交互的所有程序逻辑。该层使整个网站充满活性,而且这一层的设计方法对网站的成功至关重要。由于你的应用系统是一个Web网站,因此表示层将由动态Web页面组成。
业务层(也称为中间层)接收来自表示层的请求,并基于其包含的业务逻辑,向表示层返回一个结果。表示层中所发生的事件,绝大部分都会导致业务层被调用(除了那些表示层自己就能够处理的事件,诸如简单的数据输入验证)。例如,如果访问者进行一次商品搜索,那么表示层将调用业务层,说:“请将与该搜索条件相匹配的商品发给我。”绝大多数情况下,业务层都需要调用数据层,以获得响应表示层请求所需的信息。
数据层(有时也称为数据库层)负责保存应用系统的数据,并当有请求时发送给业务层。对于BalloonShop这个电子商务网站而言,你需要保存与商品(包括其门类和分类)、用户、购物车等相关的数据。几乎所有的客户请求最终都将引发数据层的信息查询(除非在业务层或表示层的缓存中已经包含了先前查询的数据),因此拥有一个快速的数据库系统是很重要的。在第3章和第4章中,你将学到如何针对性能优化来设计数据库。
这些层是纯逻辑的,对于每个层的物理位置并没有约束。可以自由地部署应用程序,也就是说,甚至可以将所有的层都部署在单一的服务器上。同样,也可以将每个层部署在不同的机器上,甚至可以将一个层中的组件部署在多台机器上。这些选择都取决于应用系统特定的性能需求。这种灵活性可以带来许多好处,你很快就会看到。
在三层架构模型中,有一个很重要的约束是在层之间的数据传递必须遵从特定的顺序。表示层只允许访问业务层,而从不直接访问数据层。业务层就像中间的“大脑”,负责与其他层通信,处理和协调所有信息流。如果表示层直接与数据层交互,则三层架构的编程规则将被打破。当实现一个三层架构时,必须遵从该规则才能够获得其所带来的好处。
图2-1中表现的是一个三层架构的应用系统中数据传递的简单示意。
1.简单的场景
如果更详细地观察一个简单的例子,那么理解层之间数据的传递就会更简单得多。为了使这个例子和本项目更相关,我们将分析一个在BalloonShop中实际发生的场景。这是三层架构应用程序中的典型场景。
和大多数电子商务站点相似,BalloonShop中也有购物车,我们将在本书的后面章节中详细说明。现在,只需知道网站访问者将通过点击一个Add to Cart(添加到购物车)按钮,将商品添加到购物车中。图2-2展示了该按钮被点击后应用系统中的信息流的情况。
当用户点击针对某个特定商品的Add to Cart按钮(第步)时,表示层(包含该按钮的层)将把该请求转发给业务层,“嗨,我想将这个商品添加到访问者的购物车中!”(第步)。业务层收到该请求后,就知道用户想将一个特定的商品添加到购物车,其处理的过程是,告诉数据层依据所选的商品来更新访问者的购物车(第步)。要调用数据层的原因是,它存储并管理着整个Web站点的数据,包括用户的购物车信息。
数据层将更新数据库(第步),并最终向业务层返回一个成功代码。业务层(第步)将处理这个返回代码以及数据层在更新数据库时可能遇到的任何错误,然后将结果输出到表示层中。
最后,表示层生成并更新购物车视图(第步)。其结果是通过生成HTML Web页面来封装这个结果,然后返回给网站访问者(第步),在网站访问者喜欢的Web浏览器上看到更新后的购物车。
注意在这个简单的例子中,业务层所负责的处理并不太多,并且其业务逻辑并非很复杂。不过,如果应用系统出现了新的业务逻辑规则,那么就将修改业务层。例如,如果存在一条这样的业务逻辑,只有当商品库存量大于0时,才能将其添加到购物车中,而另一个数据层调用可以用来确定该数量。只有当库存中有某商品时,才会收到更新购物车的请求。无论如何,表示层都将了解其状态,并向网站访问者提供易于理解的反馈。
|
|
||||||||||||||||||
图2-1 三层架构的简单表示 |
图2-2 因特网访问者与三层应用系统的交互 |
2.在数字中蕴藏什么
在每个层对于相同信息的不同解释是很有趣的。对于数据层,其存储的数字和信息并没有什么意义,因为它只是一个保存、管理的引擎,负责查询数字、字符串或其他数据类型,并没有什么商品数量或商品名称。在前面的例子中,表示商品数量的0对于数据层(简单的0,一个32位整数)而言就是一个简单的纯数字,并没有什么深刻的含义。
在业务层读取该数字时,就为其赋予了意义。当业务层向数据层查询商品数量时,如果获取的结果是0,业务层将会把其翻译成“嗨,库存中没有该商品!”,最后这个数据还将被表示层封装成一个漂亮的、可视化的表单,例如,一个写着“对不起,现在不能订购该商品”的标签。
即使你不想禁止顾客将库存中没有的商品添加到购物车中,本例(如图2-3所示)也足以从另一个角度表现出三个层中的每个层都具有不同的目标。
3.为正确的层赋予正确的业务逻辑
由于每个层都包含着自己的业务逻辑,有时要在各个层之间划出一个清晰的界限并不容易。在前面的场景中,并不是在业务层读取商品的数量,而是根据一个数(是两次数据层即数据库调用的结果)来决定该商品是否可用,或许会有一个命名为AddProductIfAvailable的独立数据层方法,它将实现只当库存有存货时才能够将商品添加到购物车中。
在这个场景中,一些逻辑从业务层迁移到了数据层。在大多数情况下,你可以自由地决定将某个逻辑放在这层还是那层,或者放在两层中。在大多数情况下,实现三层架构并没有唯一的最佳方法,你必须基于个人偏好或外部约束做出妥协或选择。
有时,即使你知道实现某些东西的正确方法(遵从架构的设计),仍然可能打破这些规则以获得更好的性能。作为一个通用的规则,如果这种方法能够改进性能,并且假设这些规则并非频繁变化的,那么稍微打破(例如在数据层添加一些业务规则,反之亦然)层之间的严格限制是没问题的。否则,将所有的业务规则留在中间层是更可取的,因为这将生成一个更易于维护的“清晰”的应用系统。
最后一点,不要尝试在表示层直接与数据层交互。这是个常见的错误,它是通往复杂、难以维护、低灵活性系统的捷径。在许多与数据访问相关的教材和介绍性材料中,经常会看到使用一个简单的UI应用系统执行一些简单数据库操作的例子。在这类程序中,所有的业务逻辑可能是写在一个简短的、单一的文件中,而非放在单独的层中。尽管这些材料都很好,但一定要记住,这些材料的写作目的大多是为了教你如何完成不同的独立任务(例如,访问一个数据库),而非告诉你如何正确地构建一个灵活的、可伸缩的应用系统。
4.针对BalloonShop的三层架构
使用三层架构来构建BalloonShop网站,有助于实现在本章开始处所列出的目标。根据一套体系确定的编码规范初看起来似乎有些死板,但从长远来看,它能够实现更高水平的灵活性和可扩展性。
将应用系统的主要部分分解到独立的、较小的组件中的同时也就是在鼓励重用性。当为网站添加新功能时,你时常会发现可以重用一些已经存在的东西。添加一个新功能时,无需对已经存在的内容做太大的改动,这本身就是一个重用的好例子。同样,将较小的代码片段放在正确的地方,也可利于对其进行文档化及后续分析。
三层架构的另一个优势是,如果正确地实现,那么整个系统能够更好地应对变化。当某个层中的内容发生变化,甚至在某些极端的情况下,其他层的内容不会受到任何影响。例如,由于某种原因需要更换后端的数据库系统(例如,经理决定用Oracle替代SQL Server),你只需更新数据层。原有的业务层在新数据库同样能工作。
5.为什么不使用更多层
三层架构是迄今为止我们谈及最多的n层架构的一个版本,也是现在最常用的专用术语。n层架构指的是将解决方案分解到多个(n)逻辑层中。在复杂项目中,有时将业务逻辑分解到一个以上的层中的做法很有意义,其结果就是一个多于三层的架构。但是,对于这个Web网站而言,严格按照三层架构的设计是很有意义的,它无需花太多时间来设计,也不需编写太多复杂的框架代码来支持架构,但又提供了大部分的好处。
或许使用一个更复杂的架构可以使应用系统实现更高级别的灵活性和可伸缩性,但在什么也没开始实现之前,将需要花更多的时间来设计。和大部分编程项目一样,你必须在架构设计所需时间和实现所需时间之间找到一个良好的平衡。三层架构对于像BalloonShop这样的中等复杂度项目而言是最合适的。
你或许还会问另一个相对的问题,“为什么不使用更少的层?”两层架构,也称为客户—服务器架构,比较适用于复杂度更低的项目。简单地说,两层架构所需的计划时间更短,在最初阶段也能够更快进行开发,但其产生的应用系统对于长期运行而言更难以维护和扩展。由于我们希望在将来扩展该应用系统,因此两层架构并不太适合,本书其余的部分将不谈及该话题。
现在你已经知道了总体的架构,紧接着来看看将使用什么技术和工具来实现它。在简要地阐述完这些技术之后,你将通过构建网站的第一页以及后端数据库系统来为表示层和数据层建立一个基础。当你在第3章中开始构建Web网站的商品目录时,将会在三层架构的每个层中实现部分实际的功能。
2.3 选择实现技术与工具
不管选择什么样的架构,对于每个开发项目而言,一个主要问题是选择什么样的实现技术、编程语言以及开发工具,外部需要可能会对你的选择带来很大的限制。
注解 在本书中,我们将使用微软的开发技术来构建Web网站。谨记,只要我们提到实现技术的问题,就会有多个解决方案,对于一个问题只有一个最佳解决方案的情况很罕见。尽管我们很喜欢微软的实现技术,但并不是说对于所有类型的项目,它都是最好的选择。另外在有些情况下,由于客户的需求或其他外部约束,我们必须使用指定的技术。在软件开发过程中的系统需求和软件需求阶段将决定你必须使用什么技术来构建该应用系统。更详细的内容参见附录B。
本书是关于基于ASP.NET 2.0(Active Server Page .NET 2.0)和C#编程实现电子商务网站的书籍。而开发工具你可以使用Visual Web Developer 2005 Express Edition和SQL Server 2005 Express Edition,它们都可以在微软的Web网站上自由下载。其安装说明参见附录A。尽管本书假定你对于这些技术与工具先前有一些经验,但我们仍然将简单地介绍一下,看它们是如何适应于项目以及三层架构的。
注解 本书是在Beginning ASP.NET 1.1 E-Commerce: From Novice to Professional(Apress,2004)的基础上编写的,它使用的是ASP.NET 1.1、Visual Studio.NET 2003和SQL Server 2000。如果你是一个开源爱好者,你或许会购买Beginning PHP 5 and MySQL E-Commerce: From Novice to Professional(Apress,2004)。
2.3.1 使用ASP.NET 2.0
ASP.NET 2.0是微软最新推出的用于构建动态、交互式Web内容的开发技术集。与其前一个版本相比,ASP.NET 2.0中引入了许多新功能,用以帮助开发人员在构建Web应用系统时增加产能。
由于本书的目标读者包含现有的ASP.NET 1.1和ASP.NET 2.0开发人员,因此我们随着本书的进程会强调许多ASP.NET 2.0特有的技术,并尝试提供一些有用的技巧与窍门,以便帮助你利用这些技术提高编码效率。但是,本书的重点是构建电子商务网站,因此必然只涉及ASP.NET所提供的大量功能中的一个子集。因此,你仍然需要额外的ASP.NET 2.0书籍(或其他资源)作为参考,以弥补从本书中无法获得的理论基础。在Apress所规划的“技术树”中,在阅读了Beginning ASP.NET 2.0 in C#:From Novice to Professional(Apress,2005)之后再阅读本书是最佳的,当然你也可选择其他入门书籍来阅读。
ASP.NET并非是构建专业电子商务网站的唯一的服务器端技术。其最常见的竞争者包括PHP(Hypertext Preprocessor,超文本预处理器)、JSP(JavaServer Pages)、ColdFusion,甚至还包括过时的ASP 3.0和CGI(公共网关接口)。这些技术之间存在许多不同,但有些基本原则是类似的。例如,使用这些技术编写的页面都是由负责绘制页面静态部分(模板)的基本HTML和负责生成动态部分的代码所组成的。
1.Web客户和Web服务器
你或许已经知道动态Web页面的基本工作原理。不过为了做个简短的回顾,图2-4展示了一个ASP.NET页面从客户端浏览器(不管是IE、Mozilla Firefox还是任何其他Web浏览器)发出请求的瞬间到浏览器收到响应的瞬间所发生的事情。
|
|
|
|
|
|
|
图2-4 Web服务器处理客户端请求的过程
当请求发出后,该页面在返回给客户端之前将在服务器端(这也是为什么将ASP.NET及类似技术称为服务器端技术)首先进行处理。当ASP.NET页面被请求时,其中的代码将首先在服务器端运行。在最终的页面生成之后,其产生的HTML将返回给访问者的浏览器。
返回的HTML中也可以包含与浏览器直接交互的客户端脚本代码。最流行的客户端脚本技术包括JavaScript和VBScript。JavaScript通常是更好的选择,因为它已被广泛接受,而只有IE能够识别VBScript。其他一些重要的客户端技术有Macromedia Flash和Java applet,但它们稍有些不同,因为Web浏览器无法直接解析它们,Flash需要一个特定的插件,而Java applet则需要一个JVM(Java虚拟机)。IE还支持ActiveX控件和.NET程序集。
2.页面后的代码
从ASP.NET的第一个版本开始,就鼓励(并帮助)开发人员将Web页面的代码与HTML设计物理分离。将赋予Web页面生命的代码与HTML设计放在不同的文件中,是对其他一些将代码和HTML混在一起的服务器端技术的重大改进,因为这种混合的结果是冗长、复杂的源文件,难以对其文档化、修改和维护。同样,一个同时包含代码和HTML的文件,将牵涉到程序员和页面设计人员的工作,这将使团队协作陷入不必要的复杂,也增加了页面设计人员在美化页面时破坏代码逻辑的可能。
ASP.NET 1.0引入了一个后置代码(code-behind)模型,用以分离Web页面的HTML布局与给予页面生命的代码。尽管你仍然可以在同一个文件中包含代码和HTML,但Visual Studio.NET 2002和Visual Studio .NET 2003都会自动为一个Web窗体创建两个独立的文件:用于保存HTML设计的.ASPX文件,以及用于保存代码的后置代码文件。由于ASP.NET允许开发人员用自己选择的编程语言(诸如C#、VB.NET)来编写代码,因此后置代码文件的扩展名取决于其使用的语言(诸如.ASPX.CS或.ASPX.VB)。
ASP.NET 2.0使用了一个改进的后置代码模型。虽然这个模型功能更加强大,但其基本原则(分离页面的外在和本质)仍然是相同的。稍后我们将会对这些不同进行概述,以帮助现在的ASP.NET 1.x开发人员迁移到ASP.NET 2.0。
在继续之前,我们先总结一下ASP.NET中最重要的功能:
l 你可以选择不同的.NET语言来编写服务器端代码。默认情况下,可以从C#、VB.NET和J#中选择,不过其整个基础结构设计是支持其他语言的。这些语言的功能都很强大,并且也是纯面向对象的。
l ASP.NET页面的服务器端代码是完全已编译和可执行的,并且采用逐行解释的方式,其结果是性能更好,并且也为在编译阶段检测到更多错误提供可能,而无需等到运行时。
l 后置代码文件的概念可以帮助你将页面的可视化部分和其背后的(服务器端)业务逻辑分离开。与那些把HTML和服务器端代码放在同一个文件中(通常其结果就是“意大利面条”式的代码)的服务器端技术相比,这是其一个优势。
l Visual Web Developer 2005是一个优秀、完善的可视化编辑器,它是ASP.NET程序员军械库中一种很好的武器(尽管对于构建ASP.NET Web应用系统而言不是必需的)。Visual Web Developer 2005 Express Edition是免费的,可以用来开发本书的例子程序。
3.ASP.NET Web窗体、Web用户控件和母版页
ASP.NET Web网站的开发离不开ASP.NET的Web窗体(Web Form)。ASP.NET Web窗体的扩展名是.aspx,它是向客户端提供Web功能的标准途径。一个对于ASPX资源的请求,诸如http://web. cristiandarie.ro /BalloonShop/default.aspx,将使default.aspx文件在服务器端运行(包括其后置代码文件),其结果将生成一个HTML页面,然后发送回客户端。通常,.aspx文件都有一个相关的后置代码文件,它也被看作Web窗体的一部分。
Web用户控件(User Control)和母版页(Master Page)与Web窗体相似,它们也是由HTML和代码(也支持后置代码模型)组成,但客户端不能直接访问它们。它们是用来组织Web窗体的内容的。Web用户控件的扩展名是.ascx,它可以包含在Web窗体中,其父Web窗体就成为了该控件的容器。Web用户控件为在多个Web窗体实现功能片段的重用提供了一种简单的方法。
母版页是ASP.NET 2.0的新功能。一个母版页是一个能够在网站中多个Web窗体中应用的模板,它可以使网站中的不同页面的可视化体验和部分功能保持一致。只要修改母版页,那么所有基于该母版页构建的Web窗体都将随之变化。
Web用户控件、Web服务器端控件和HTML服务器端控件。从另一个视角来看一下Web用户控件是很有价值的。Web用户控件是一种特殊的服务器端控件。服务器端控件一般指三种控件:Web用户控件、Web服务器端控件和HTML服务器端控件。所有的这些控件都可以用来重用Web窗体中的功能片段。
正如前一个小节所说的,Web用户控件使用的文件扩展名是.ascx,它具有一个与Web窗体相似的结构,但不能通过客户端的Web浏览器直接发出对其的请求;它们只能被包含于Web窗体或其他Web用户控件中。
Web服务器端控件是已编译的.NET类,当其执行时将生成HTML输出(最终将包含客户端脚本)。你可以在Web窗体或Web用户控件中使用它们。.NET框架提供了大量Web服务器端控件(许多是2.0版本的框架所提供的),其中包括诸如Label(标签)、TextBox(文本框)及Button(按钮)的简单Web服务器端控件,也有一些更复杂的控件,诸如验证控件、数据控件以及著名的GridView控件(它用来替代老版本中的DataGrid)等。Web服务器端控件的功能很强大,但其编辑却很复杂,因为许多功能都需要手动实现。还有一个功能,你可通过程序来声明和访问其属性,可以通过Visual Web Developer设计器来访问其属性,也可以将这些控件添加到工具栏,就如同Windows窗体应用程序及古老的VB6程序那样。
HTML服务器端控件使你能够在代码(例如从后置代码文件)中访问页面中的HTML元素。只需在HTML控件中加上runat="server"属性就可以将其转化为HTML服务器端控件。大部分HTML服务器端控件(诸如标签、按钮等)是Web服务器端控件的另一个版本。为了保持一致,应该坚持在大部分时间中使用Web服务器端控件,但在某些情况下你会需要使用HTML服务器端控件。
对于BalloonShop项目而言,你需要使用各种类型的控件,还将创建许多Web用户控件。
由于你可以将Web用户控件的开发工作独立于Web网站的开发,在其开发完后再插入到网站中,基于Web用户控件的网站结构,其灵活性和重用性级别都很高。
4.ASP.NET和三层架构
Web窗体、Web用户控件和母版页共同构成应用系统的表示层中。它们负责创建在访问者浏览器中载入的HTML代码。
UI的逻辑则保存在Web窗体、Web用户控件和母版页的后置代码文件中。尽管在ASP.NET中并不一定需要使用后置代码文件(你也可以像ASP那样将代码和HTML混合在一起),但我们只使用后置代码模型来处理表示层逻辑。
在使用三层架构的应用系统中,表示层中的程序逻辑通常表示为各种事件处理程序(event handler),诸如Page_Load、someButton_Click。正如前面所了解的,这些事件处理程序将调用业务层的方法来完成其任务(但从不直接调用数据层)。
2.3.2 使用C#和VB.NET
C#和VB.NET都是可以在Web窗体的后置代码文件中使用的编程语言。在本书中,我们将使用C#,本书还有另外一个名为Beginning ASP.NET E-Commerce in VB.NET:From Novice to Professional的版本,将采用VB.NET来完成相同的功能。和其前一个版本(VB6)不同,VB.NET是纯面向对象的语言,并具有.NET框架所提供的所有功能优势。
ASP.NET 2.0甚至允许你在一个项目中使用不同的语言编写不同的元素,但本书中并不使用该功能。用不同.NET语言编写的独立项目可以自由地协作,只要遵从一些基本规则。关于.NET框架工作原理的更多信息,可以阅读一些概述性的.NET书籍。
注解 虽然你可以在单个项目中使用多种语言,但并不意味着可以过度使用该功能,这只是一种选择。如果看重长期的易维护性并想避免不必要的令人头痛之事(这也是大部分程序员的想法),那么保持一致要比这种差异更重要。
在本书中,除了在后置代码文件中使用C#之外,还将用同样的语言来编写中间层类的代码。当我们在第3章构建商品目录时,将创建第一批类,在那里你将学到更多细节内容,包括许多.NET 2.0提供的特性。
2.3.3 使用Visual Studio 2005和Visual Web Developer 2005 Express版本
Visual Studio 2005是迄今为止所能找到的最好的.NET应用系统开发工具。Visual Studio是一个完整的编程环境,它能够开发很多种项目和文件,包括Windows和Web窗体项目、安装和部署项目以及其他。Visual Studio还可以作为访问数据库的接口,完成数据库表和存储过程的创建,实现表关系等。
Visual Web Developer 2005 Express版本是Visual Studio 2005的一个免费版本,它只关注于用ASP.NET 2.0来开发Web应用系统。由于本书中的代码可以使用任何一个版本来构建,因此我们将交替地使用Visual Web Developer和Visual Studio两个术语。
和Visual Studio的前一个版本相比,Visual Studio .NET 2005和Visual Web Developer 2005的一个很重要的功能是它集成了一个Web服务器,它使你即使没有安装IIS(Internet信息服务)也可以执行ASP.NET Web应用系统。这对于Windows XP Home版本的用户而言是一个好消息,由于他们的操作系统不支持,所以无法安装IIS。
尽管我们将使用Visual Web Developer 2005 Express版本来编写BalloonShop项目,但重要的是知道这并非必需的。在http://www.microsoft.com可以免费下载ASP.NET和C#和VB.NET编译器,它属于.NET框架SDK(软件开发包)的一部分,使用诸如Notepad(记事本)的简单编辑器也足以创建任何类型的Web页面。
提示 在ASP.NET 1.x的时代,并没有免费的Visual Studio版本,许多开发人员的首选是一个名为Web Matrix的优秀程序,一个安装包(现在还可以在http://www.asp.net/webmatrix下载)只有1.3MB的免费ASP.NET开发工具。现在Web Matrix的开发已经暂停,因为Visual Web Developer 2005 Express版本功能强大而且是免费的。
Visual Studio 2005和Visual Web Developer 2005和其前一个版本相比提供了许多新功能,在创建BalloonShop项目的过程中我们将了解到其中的一部分。
2.3.4 使用SQL Server 2005
和.NET框架2.0和Visual Studio 2005一起,微软还发布了新一代的关系数据库管理系统(RDBMS)领域的“选手”,即SQL Server 2005。这个复杂软件的目标是尽可能快速、可靠地存储、管理和查询数据。你可使用SQL Server来存储与网站相关的所有信息,它将通过应用系统的业务逻辑动态地放置到Web页面上。简单地说,所有与商品、门类、用户、购物车相关的数据,都将由SQL Server来存储和管理。
还有一个好消息,SQL Server 2005还提供了一个免费的轻量级版本,名为SQL Server 2005 Express版本。和商业版本不同,SQL Server 2005 Express版本默认没有提供任何可视化管理工具。但是,还有一个名为SQL Server Express Manager的优秀工具也是免费的。在附录A中有关于SQL Server 2005 Express版本和SQL Server Express Manager安装方法的详细信息。
提示 要了解更多关于SQL Server 2005 Express版本与其他版本的不同点,可以访问http://www. microsoft.com/sql/2005/productinfo/sql2005features.asp。
在本章稍后部分中,当你创建BalloonShop数据库时将进行与SQL Server的第一次交互。
SQL Server和三层架构
现在你可能会很清楚地知道SQL Server是与数据层相关的。但是,如果你直到现在还没有和数据库打过交道,可能会认为SQL Server只具有简单的数据存储功能。除了实际的数据存储于其中,SQL Server还能够以存储过程的形式保存逻辑、维护表关系,确保服从各种数据完整性规则等。
你还可以通过一种名为T-SQL的语言和SQL Server通信,它是SQL Server提供的SQL方言。SQL(即结构化查询语言)是一种用来和数据库交互的语言。SQL是用来向数据库发送诸如“给我最后10个订单”或“删除编号为#123的商品”的指令的。
虽然也可以在C#代码中包含T-SQL语句然后提交执行,但这是公认的不良实践,因为它会招致安全、一致性和性能损失等问题。在我们的解决方法中,将使用存储过程(stored procedure)来存储所有的数据层逻辑。按传统观点,存储过程是存储在数据库内部的用T-SQL语句编写的程序。在SQL Server 2005中也是正确的,不过它还引入了托管存储过程的概念,即可以使用诸如C#、VB.NET等语言来编写,其结果就用编译取代了解释。
注解 用C#编写存储过程,也称为托管存储过程,并非说说好玩,它是实实在在的。不过,托管存储过程是一个很强大的武器,和许多其他武器一样,只在特定的场合适用。当你需要执行复杂的数据操作或复杂的业务逻辑,而用T-SQL不易于实现时,托管存储过程就很有意义。但是,学会以正确的方法来完成这些任务需要很多研究,它已经超出了本书的范围。此外在本书中的数据逻辑并不需要使用托管存储过程,其结果就是你将不会看到它。学习如何编写托管存储过程需要花一定的时间,你可以购买一些专门阐述如何在SQL Server下编写托管代码的书籍。
存储过程是存储于数据库内部的,可以被外部程序调用。在你的架构设计中,存储过程将被业务层调用。存储过程将依次操作或访问数据存储,获取结果,然后将其返加给业务层(或执行必要的操作)。
图2-5展示了三层架构中各个层将使用的开发技术。SQL Server包含了应用系统的数据层(存储过程包含了访问和维护数据的程序逻辑),并且负责实际的数据存储。
2.4 遵从编码规范
虽然编码和命名规范在一开始看起来并不重要,但不该忽视它们。在编码时不遵从一组规则,其结果就是产生的代码难以阅读、理解和维护。另一方面,当你遵从一致的编码方法,就可以说代码已经半文档化,它将会提高项目的可维护性,特别是许多人同时工作于同一个项目时。
提示 关于编码和命名规范,有些公司会有其自己的策略,而有时你可以有自己定义规则的灵活性。不管什么情况,其准则就是以某种方法使你的代码保持一致。在http://msdn.microsoft.com/library/default.asp?url=/library/ en-us/cpgenref/html/cpconnamingguidelines.asp可以查看到微软所建议的命名规范。
命名规范涉及项目中的许多元素,因为几乎所有的这些元素都有一个名称:项目本身、命名空间、Web窗体、Web用户控件、Web用户控件及其他接口元素的实例、类、变量、方法、方法参数、数据库表、数据库列、存储过程等。当对所有这些元素进行命名时,如果没有制定一些规则,那么开始编码一周后,你甚至可能无法理解你自己编写的代码。
本书将努力遵从微软建议的命名规范。按现在的哲学,变量的名称应表示它是什么对象而非数据类型。在构建网站时,我们会谈论更多关于命名规范的话题。现在,是开始动手的时候了。
2.5 创建Visual Web Developer项目
我们喜爱的工具显然就是Visual Web Developer。你可以用它来创建各分类型的项目,包括Web Site项目(就是大家所熟悉的Web Application项目)。另外一个必需的工具是SQL Server,它将用来保存网站的数据。在本章的稍后部分将涉及数据库。
注解 在此,我们假定在你的机器上安装Visual Web Developer 2005 Express版本和SQL Server 2005 Express版本。如果你使用的是Visual Studio 2005或SQL Server 2005的商业版本也是可以的,不过在这种情况下,在练习时所需采用的步骤可能会和本书中描述的有些不同。关于这些工具的安装可以参考附录A。
开始构建BalloonShop网站的第一步就是打开Visual Web Developer,然后创建一个新的ASP.NET Web Site项目。在Visual Studio的上一个版本中,还必须安装IIS,而由于在Visual Studio .NET 2005有一个集成Web服务器(名为Cassini),因此可以从硬盘中的任何物理文件夹上运行ASP.NET Web应用系统。因此,当你创建Web Site项目时,目标位置可以指定为一个Web路径(如http://localhost/BalloonShop)或硬盘上的一个物理文件夹(如C:"BalloonShop)。
如果可以选择,仍然使用IIS是首选的解决方法,因为它的性能更好,并能确保其显示出来的页面和最后部署环境中生成的一样。Cassini(集成的Web服务器)很好地模拟了IIS的功能,但仍然不是首选。对于本书而言,你可以任选一种,尽管我们在测试和屏幕截图时都是使用IIS。
在接下来的练习中,你将一步步地创建BalloonShop项目。为了确保你一直拥有我们所预期的代码,消除任何可能的挫折和误解,将在独立的练习小节中包含构建该项目时所必需的步骤。我们知道当书上这么说,但电脑的显示器上却显示不同的内容时会很令人烦恼,因此会尽全力消除这种问题。
让我们开始吧。
练习:创建BalloonShop项目
按照本练习中的步骤,创建这个ASP.NET Web Site项目。
(1) 启动Visual Web Developer 2005 Express版本,选择File→New Web Site。在打开的对话框中,从Templates(模板)面板中选择ASP.NET Web Site(ASP.NET网站),并在Language(语言)栏中选择Visual C#。
(2) 在第一个Location组合框中,你可以选择文件系统、HTTP或FTP,它将决定你的项目将如何执行。如果选择将项目安装在文件系统中,则需要在磁盘上选择一个物理位置,诸如C:"BalloonShop。在这种情况下,该Web应用系统将会使用Visual Web Developer集成的Web服务器(Cassini)来执行。如果你选择一个HTTP位置(诸如http://localhost/BalloonShop),则该Web应用系统将由IIS来执行。选择一个最适合你的方式。如果选择HTTP方式,并在自己的本机开发,则需要确保本机安装了IIS(参见附录A)。为了练习,我们将在http://localhost/BalloonShop上创建该项目,如图2-6所示。
注解 当你基于本地的IIS服务器在一个HTTP位置上创建该项目时,那么默认情况下该项目的物理位置是"InetPub"wwwroot文件夹。如果你想使用另一个文件夹,则点击“控制面板”→“管理工具”,并打开“Internet信息服务”,然后创建一个虚拟文件夹,使其指向你先前用Visual Web Developer创建的Web应用系统所在的物理文件夹。如果这里描述的内容对你意义不大,则忽略它。
图2-6 创建Visual Studio .NET项目
(3) 点击OK。Visual Studio将在你指定的BalloonShop文件夹中创建这个新项目。在这个新项目中,包含一个默认创建的名为Default.aspx的Web窗体,如图2-7所示。
图2-7 在Visual Web Developer 2005 Express版本中打开BalloonShop项目
(4) 在debug(调试)模式中,按F5执行该项目。在此时,Visual Web Developer将会提示(如图2-8所示)在web.config中未启用调试时不能对项目进行调试(实际上此时web.config文件还不存在)。点击OK按钮,以允许Visual Studio启用调试模式。你可以查看新建的web.config文件,看看它为你设置了些什么。
图2-8 必须在web.config中启用调试模式
(5) 当该项目执行时,将打开一个新的IE空白页。关闭这个窗口使该项目从执行态中止(断点和中止调试符号将从Visual Web Developer工具栏上消失,而项目又还原成可编辑状态)。
注解 当项目被执行时,Web网站将在系统的默认Web浏览器中载入。为了方便调试你的代码,建议将Visual Web Developer配置成默认使用IE,即使操作系统的首选浏览器是(例如)Mozilla Firefox。其原因是它看起来与IE集成得更好。例如,当你关闭IE窗口时,Visual Web Developer能够自动将项目从调试状态中止,因而可以继续正常的开发工作;但是,对于其他浏览器,你可能还需要手动中止调试(点击工具栏中四方形的中止按钮,或按Shift+F5键)。要修改Visual Web Developer使用的默认浏览器,则应点击解决方案资源管理器的根节点,选择Browse With(浏览方式),然后从浏览器列表中选择一个,再点击Set as Default(设为默认值)按钮即可。
解析:Visual Web Developer项目
祝贺你!你已经完成了创建电子商务商店的第一步!
与前一个版本的ASP.NET不同,已经无需一个IIS虚拟目录(甚至没有IIS也可以)来运行Web应用系统,因为你可以在磁盘的物理位置上创建一个ASP.NET Web Site项目。这也就等于你可以在任何位置调试或运行Web应用系统。
当想不使用IIS来执行项目时,你可以使用诸如http://localhost:5392/BalloonShop/Default.aspx的地址来访问,这是集成Web服务器的地址。
在此时,你的项目中包含三个文件:
l Default.aspx是Web窗体。
l Default.aspx.cs是该Web窗体的后置代码文件。
l web.config是该项目的配置文件。
我们稍后将详细地说明这些文件。
2.6 实现网站的骨架
网站的可视化设计通常将在客户和专业Web设计师之间的协作与讨论之后达成共识。当然,你也可以从那些以合理价格提供此类服务的公司购买一个Web网站模板。
由于这是一本编程方面的书籍,因此不打算讨论Web设计的问题。此外,我们也希望采用一个简单的设计,这样可以使你聚焦于网站的技术细节。一个简化的设计也可以使你更容易在此基础上添加自己的设计。
BalloonShop网站中的所有页面(包括首页)均具有如图2-9所示的结构。在稍后的章节,将会在这个设计上添加更多组件(诸如登录框、购物车汇总框等),但现在只是一些文字片段,具体内容将在接下来几章中实现。
虽然商品目录的详细结构将在下一章中完成,但现在你已知道,网站中的每个页面上将显示出主要的门类列表。还应在访问者浏览器中看到的每个页面上都显示一个网站的标题栏。
你将通过创建以下内容来实现这个结构:
l 包含所有Web网站页面的通用结构的母版页,如图2-9所示。
l 一些使用母版页的Web窗体,用来实现Web网站的各种位置,诸如主页、门类页面、搜索结构页面等。
l 一些实现功能片段重用的Web用户控件(诸如门类列表框、分类列表框、搜索框、标题栏等)。
图2-10中展现了在开发BalloonShop时将创建的一些Web用户控件。
图2-10 使用Web用户控件来生成内容
使用Web用户控件来实现不同的功能片段有许多长效性优势。将不同的、不相关的功能片段逻辑上分离,就可以灵活、独立地修改它们,甚至可以在其他页面上重用它们,无需再次编写HTML代码以及其后置代码文件。而且对于一个包含于Web页面中的用户控件而言,要扩展其功能或修改其位置也是很简单的;修改Web用户控件的位置并不是一个复杂且冗长的过程。
在本章的剩余部分,我们将编写网站的母版页,第一页使用的Web窗体,它将使用这个母版页,以及实现标题区的Web用户控件。在后续的章节中还将涉及其他用户控件。最后,在本章的末尾处,还将创建BalloonShop数据库,它是构建项目基础的最后一步。
2.6.1 构建第一个页面
此时,在网站中已经有了一个Web窗体,也就是在你创建项目时,由Visual Web Developer自动创建的Default.aspx。在默认情况下,Visual Web Developer并不会为你生成母版页,因此需要按下面的练习自己创建。
练习:创建主Web页面
(1) 点击菜单栏Website(网站)→Add New Item(添加新项)(或按Ctrl+Shift+A键)。在打开的对话框中,从Visual Studio已安装的模板中选择Master Page(母版页)。
(2) 在Language(语言)栏中选择Visual C#,选中Place code in a separate file,(将代码放在单独的文件中)复选框,然后将页面的名称修改成BalloonShop.master(默认的MasterPage.master不太合适)。Add New Item对话框现在如图2-11所示。
图2-11 往项目中添加一个母版页
(3) 点击Add按钮就可以往项目中添加一个新的母版页。在Source View(源代码视图)中,你可以看到这个新的母版页已经包含了一些默认的代码。如果你切换到Design View(设计视图),则会看到它包含了一个ContentPlaceHolder对象。在源代码视图中,将代码修改为:
(4) 然后再切换到设计视图;这时你所看到的将如图2-12所示。如果你没有修改Visual Web Developer的默认行为,那么会看到ContentPlaceHolder对象上标有一个很小的绿色箭头符号。这个标记说明该控件将在服务器端执行。所有服务器端控件(包括Label、TextBox等)在页面上都会标上这个绿色箭头。如果你查看ContentPlaceHolder的HTML代码,则会看到runat="server"子句。
图2-12 设计视图中的新母版页
母版页并非设计成让用户直接访问的,你将使用这个刚创建的母版页来作为Default.aspx这个Web窗体的模板。由于Visual Web Developer为你创建的Default.aspx页并未使用母版页(使用母版页就需要包含从母版页继承的代码),只需删除并重新创建它即可。
(5) 在Solution Explorer(解决方案资源管理器)窗口的Default.aspx上点击鼠标右键并选择Delete(删除),然后确认删除。
(6) 在Solution Explorer窗口的根节点上点击右键,然后选择Add New Item,选择Web Form模板,其名仍然为Default.aspx,同时确保选中了Place code in separate file(将代码放在单独的文件中)和Select Master Page(选择母版页)两个复选框,确认选择的语言是Visual C#,然后点击Add按钮。当要求指定母版页时,选择BalloonShop.master,然后点击OK按钮。就将完成新页面的创建,其中只有几行代码,其他都将从母版页中继承。
当你切换到设计视图时,Default.aspx看起来则如图2-13所示。
图2-13 在设计视图中的Default.aspx
(7) 将页面的标题从“Untitled Page”改为“Welcome to BalloonShop!”,可以使用设计视图中的属性窗口(参见图2-14),也可以通过源代码视图将代码改为:
(8) 按下F5键,执行该项目,这时你将看到一个类似于图2-15的页面。
注解 只有关闭浏览器窗口或手动停止项目的执行,才能够再次使用设计视图来修改窗体的内容。
图2-14 使用属性窗口来修改窗体名称 |
图2-15 执行后的Default.aspx |
解析:主Web页面
现在已经拥有了一个合适的BalloonShop页面骨架。或许现在还不明显,但基于母版页开发对于稍后扩展网站时,将省去许多头痛之事。
母版页为其实现页面确定了布局设计,而这些页面可以自由地更新ContentPlaceHolder元素的内容。在我们的例子中,标题区、门类列表、分类列表都是将在整个Web网站中每个页面都显示的标准元素(尽管分类列表有时是空白的,只有当门类列表被选择时才会显示——在下一章中会看到更详细的说明)。基于这个原因,我们将这三个元素直接加入母版页中,当你设置Default.aspx时这些部分是无法编辑的。Web网站每个部分(诸如搜索结构页、门类和分类页等)的实际内容将由独立的Web窗体来生成,它们将由ContentPlaceHolder对象的代码来区分。
注解 一个母版页中可以包含多个ContentPlaceHolder对象。
门类列表和分类列表将以Web用户控件的形式实现,它们将基于从数据库读取的数据来生成其输出。这些功能都将在第3、4章实现。
2.6.2 往主页添加标题区
在讲了这么多Web用户控件的有效性后,现在就将创建一个。Header控件将放在主页的右上角,其内容如图2-16所示。
为了保持网站文件夹的组织结构,可以为所有用户控件创建独立的文件夹。将其放在一个集中的位置是很有帮助的,特别是当项目不断增长、包含大量文件的时候。
练习:创建Web用户控件Header
按照以下步骤创建一个Web用户控件,并将其添加到母版页中:
(1) 从http://www.apress.com的源代码区下载本书的代码,并解压到磁盘的某个位置,并且只将图形文件夹Images复制到项目目录中(如果在创建该项目时采用了默认选项,那么其位置就是"Inetpub" wwwroot"BalloonShop)。在Images文件夹中包含一个名为BalloonShopLogo.png的文件,这就是Web网站的logo。现在如果你保存、关闭,然后再重新载入解决方案,就会发现Images文件夹将显示在Solution Explorer中。
(2) 确认项目不在运行态(如果在运行态,其编辑能力将受限制),解决方案资源管理器窗口是可见的(如果不可见,则点击菜单栏上的View(视图)→Solution Explorer或使用默认快捷键Ctrl+Alt+L)。然后在根项中点击右键,并选择Add Folder(添加文件夹)→Regular Folder。
(3) 输入UserControls作为新文件夹的名字,如图2-17所示。
(4) 在UserControls文件夹中创建用户控件Header.ascx。在Solution Explorer(解决方案资源管理器)的UserControls文件夹上点击鼠标右键,然后点击Add New Item(添加新项)。在其显示的窗体中,选择Web User Control(Web用户控件)模板,并将默认名称修改成Header.ascx。并正确地选择其他选项(如图2-18所示),然后点击Add(添加)按钮。
图2-17 在BalloonShop项目中添加一个新文件夹 |
图2-18 创建Web用户控件Header.ascx |
(5) Web用户控件Header将自动在源代码视图中打开。将HTML代码修改为:
注解 如果你现在就切换到设计视图,则无法看到图像,这是因为Images文件夹的相对路径在设计时和运行时所指向的绝对路径是不相同的。在运行时,该控件将包含并运行于BalloonShop.master中,而非当前位置(UserControls文件夹)。
(6) 在设计视图中打开BalloonShop.master,将Header.ascx从Solution Explorer(解决方案资源管理器)拖放到“Header”文本边上,然后将该单元格中的文本“Header”删除。BalloonShop.master的设计视图如图2-19所示。
图2-19 将Header.ascx添加到母版页中
(7) 点击Debug(调试)→Start(启动调试)(或按默认的快捷键F5),执行该项目。你将会看到如图2-20所示的Web页面。
图2-20 运行BalloonShop
解析:Web用户控件Header
再次祝贺你!你的Web网站已经有一个良好运转的标题区!如果你并不感到激动,那么就准备进入下一章,在那我们将编写一些真实的代码,并基于数据库的内容动态生成一些展现给访问者的页面。在本章中的最后一步则是创建BalloonShop数据库(在下一个练习中),创建商品目录所需的设置就全部完成了!
在此之前,要确保你对项目已完成的部分有清晰的理解。你刚才创建的Web用户控件包含在母版页BalloonShop.master中,因此它也就将应用于所有使用这个母版页的页面中,诸如Default.aspx。将这一小段HTML写成个独立的控件,就可以使得在网站其他部分重用更加容易。而且如果什么时候公司决定更改这个Logo,则只需要修改一个地方(即Header.ascx控件)就可以影响所有相关页面。
在此你是通过直接修改HTML源代码来创建该控件的,但通常可能是通过设计视图以可视化的形式来创建此控件。在Toolbox(工具箱)窗口的HTML页中包含了所有基本的HTML元素,包括生成HTML的img元素的Images。我们继续吧。
2.7 创建SQL Server数据库
本章的最后一步将创建SQL Server数据库,尽管直到下一章才会用到它。作为SQL Server的免费版本,SQL Server 2005 Express版本中并没有包含SQL Server Management Studio(也就是早期版本中的Enterprise Manager,企业管理器)。不过你现在也可以使用Visual Web Developer来创建数据库。
对于网站而言,所有的信息都需要存储,诸如商品、顾客等信息,我们将把数据存放在一个名为BalloonShop的数据库中。
练习:创建新的SQL Server数据库
以下操作步骤说明如何使用Visual Studio来创建BalloonShop数据库。不过,你可以自由地选择想使用的工具。
(1) 在Visual Web Developer项目中,确认Database Explorer(数据库资源管理器)窗口已打开。如果没有打开,则点击菜单项上的View→Database Explorer,或者按下默认的快捷键Ctrl+Alt+S。
(2) 在Database Explorer中,在Data Connections(数据连接)项上点击鼠标右键,然后选择Create New SQL Server Database(创建新的SQL Server数据库)。在其显示的窗口(如图2-21所示)中,输入SQL Server实例名称(可以使用local来代替本地计算机名)和要创建的数据库名称。如果在安装SQL Server Express时使用了附录A中所示的默认选项,那么你的服务器名就是(local)" SqlExpress;在安装过程中已经提供了连接数据库所需的数据。输入BalloonShop作为新数据库的名称。
注解 如果使用Windows验证,那么在登录到SQL Server时将会使用本地Windows账户。如果是你自己安装SQL Server,那么就具有SQL Server的所有权限,一切都会平稳运行;否则必须确认你拥有SQL Server实例的管理权限。如果基于SQL Server验证,则需要提供一个用户名和密码,但这种验证模式在默认情况下是禁用的。
解析:SQL Server数据库
这样你就创建了一个新的SQL Server数据库!在Visual Studio中的Database Explorer窗口中,提供了对SQL Server实例进行细节控制的手段。在创建了BalloonShop数据库之后,它会显示在Database Explorer中的Data Connections节点下。展开该节点,会显示出很多可以从Visual Web Developer中直接访问的功能(参见图2-22)。由于刚创建的数据库(显然)是空的,因此其子节点也是空的,在后续的章节中将会涉及这些细节。
图2-21 使用Visual Web Developer来创建一个新的SQL Server数据库 |
图2-22 从数据库资源管理器中访问BalloonShop数据库 |
2.8 下载源代码
刚才所编写的代码在Apress网站(http://www.apress.com)的Source Code(源代码)区可以下载得到,在作者的网站http://www.CristianDarie.ro也可以下载得到。通读本书或一步步地构建该解决方案是容易的;但是如果你想从工作版本中检验什么,那么可以使用这个下载版本。在下载文件的Welcome.html文档中指出了其对应的章节。你也可以在http://web.cristiandarie.ro/BalloonShop中查看BalloonShop的联机版本。
2.9 小结
本章我们介绍了许多东西,不是吗?我们谈及了三层架构,说明它如何帮助我们创建灵活性好、可伸缩性强的应用系统。同时也看到在书中使用了哪些适用于三层架构的开发技术。
到此为止,你拥有一个很灵活和高伸缩性的应用系统,因为整个网站只有一个主Web页面,它是由一个Web窗体、一个母版页和一个名为Header的Web用户控件组成的,在下一章中你将会从这种规范开发途径中得到好处。在本章中,只完成了表示中最为基本的、静态部分的编码,并创建了为数据层提供支持的BalloonShop数据库。在下一章中,我们将开始实现商品目录,并学习许多基于存储在数据库中的数据动态生成可视化内容的方法,以及有帮助的中间层,智能、高效的表示层控件和组件。