作者:mechiland (http://www.jzchen.net)
动笔时间:2003年4月21日
完成时间:2003年4月29日
目录:
概述
历史
先进的技术与好用的技术:
asp到了尽头吗?
组件化的Web程序
一个实例
小技巧
结束语
概述
本文简要描述了Web开发的历史,并主要对jsp, ASP, 以及asp.net进行了比较。最后,较为详细的提出了一种概念模型并做出了简单的实现。这种模型将使得ASP这种简单易用的技术上升一个高度,成为中小企业或者中小项目开发的较好选择。本文适合ASP的中高级开发者。
历史
如今的Web应用程序越来越流行,基于B/S结构的软件也日渐增多。这也不难想象,正如Sun公司总裁Scott所说,“计算机就是网络”,随着互联网技术的发展,知识在世界范围内得到充分的传播。从90年代很原始静态HTML页面(现在还能在旧书摊看到讲解HTML3.2的书,配上16位的Internet Explorer或者Netscape Navigator插图,那时候的网页美观水平跟现在已经不能相提并论了),到复杂而缺乏定制性的CGI,然后是WindowNT的兴起,出现一种叫IDC,IDA, IDQ的东西(当然,现在那些东西已经不存在了,只是作者当年还兴致勃勃的研究过他们,但是现在什么也记不住了),然后就是基于VBScript的ASP2.0。这是后,java逐渐侵入Internet编程领域,Servlet、JSP也出现了。其他的,如php, Perl, 等,到现在微软大行其道的以ASP.NET为核心的.Net技术,如今的Web开发领域可谓百花齐放,各有千秋。
技术出现了这么多,无论是ASP、JSP还是PHP等,在出现的早期,他们的编程模型不外乎是下面的模式:客户机向服务器提交一个HTTP/GET或者HTTP/POST请求,服务器得到这个请求后,要么请求数据库,将结果响应给客户端,要么直接响应一个结果给客户端。也就是简单的“请求-响应”模型。这种模型的唯一的一个优点就是简单。随着大型的Web应用的出现,这种模型很快出现不足。例如,无法实现代码的重用(在Web开发中,出现冗余代码似乎是难以避免的事),很多页面具有相似的功能与相似的代码,在需求改变的时候,代码的更改显得如此的不便,以至于让人很恼火。无法实现复杂的业务逻辑,简单的结构决定了这种模型无法胜任复杂的逻辑。等等,诸如此类的问题,使得Web开发的前辈们开始考虑更为有效的模式。
这时候值得一提的是JSP Model2, 也就是SmallTalk语言中一种很常见的模式:Model-View-Controller。有关这种模式的有相关的专业文章介绍,这里就不再赘述。总而言之,这种模式的出现改变了大多数Web开发人员的观念,使他们以一种软件结构的高度上来考虑B/S软件,而不是原来的“流式开发”。实现了MVC模式的Apache Struts,一时成为开发人员了与学习和接受的一种新的技术。(有关JSP与Servlet,请看我翻译的另外一篇文章:《Servlet与JSP, 最佳实践》)
ASP.NET的推出可以说是又是一个进步。Code-Behind技术与页面回调等,姑且不论其效率如何,单单从这些技术本身而言,又将我们的Web开发观念提高了一个层次。服务器HTML组件可以直接与C#代码交互,而且如此的自然,不得不佩服微软的结构设计了。
现在我们来谈一谈这篇文章的主题:ASP。
先进的技术与好用的技术
目前在Web开发领域,几乎没有人看好ASP。CSDN上总有人在抱怨ASP开发者的薪水太少。而且ASP确实存在这样和那样的问题,最大的问题莫过于它是非编译的脚本,所有的脚本都是通过解释执行,这让他的效率大打折扣。另外,它的弱类型变量定义降低学习的难度与他的效率。种种的问题显示,放弃ASP吧,不要在追寻一个落魄的技术了。
然而,我想没有一个有经验的Web开发者会说,ASP不好用,ASP不好学。现在的ASP高手很多,然而JSP,ASP.NET的高手却很难培养。在CSDN的JSP版上,问“怎么配置JSP运行环境”一类的问题不在少数,另外一些例如“字符编码”、“数据库连接”等在ASP种基本不用考虑问题在JSP中确实屡见不鲜。这里我无意比较ASP与JSP,我也不敢攻击JSP或者说JSP的坏话。从纯粹的技术的角度,我认为,在易用性上,ASP要稍胜一筹,而且在中小型项目的把握上,抛开个人或者技术界的虚荣心,ASP要比JSP把握大。如果读者是一位有多年经验并且熟知ASP与JSP的话,应该不至于反对我的观点。
然而,JSP的优点比比皆是。从软件结构的高度来看,它太优秀了。拥有JavaBean技术与扩展标记库技术,使得JSP的概念已经远远超过了它本身。组件化容易,高效率,扩展方便,容易实现多层结构,等等。
从现在Web开发领域的走势(或者说整个软件的走势)来说,组件化的思想越来越重要了。现在的问题是,基本的ASP功能很明显是无法满足现在日益复杂的需求,如何在ASP中实现组件思想呢?
关于组件我们能够想到最直接的办法就是使用VisualBasic或者VisualC++或者任何一种其他的Windows环境下的编程工具。然后,几乎所有人都会说:VC开发组件是效率最高的,但是很慢;VB开发式最快的,效率也不错。的确,VB具备简单通用,支持COM, COM+,等优点,而且开发速度快,调试方便。这样,VB就成为开发ASP组件的首选。另外一个不得不提的东西就是xml。使用XML的好处多多,这里也不多说了。
我的基本思想是:用VB来写组件,用XML来配置应用程序。这里的组件的概念已经不是过去的那种功能性组件(例如,SAFileUpload, jmail等等,只是为了实现某一个功能而实现的组件。目前这类组件占据了大多数的ASP服务器端组件市场。),更多的是实现某一个实体(Entity)。也就是说,在面向对象的ASP技术中,提倡两种组件的存在:功能组件与实体组件。
功能组件主要用于实现某一个或者一组功能。当然,这些功能也应当是按照面向对象的思想组织在一起。例如,一个名为LoginControl的功能组件包含以下方法:CheckLogin, UpdateLogin, LoginOut等,更为常见的例子就是数据库操作。您可以将数据库操作写成组件的方法,在ASP页面中进行调用。而实体组件仅仅实现基本的对象及其属性和方法。最普通的应用的例子莫过于User 组件,它可能有Name, Account, PassWord等等属性。使用用户组件最显著的好处是:充分利用廉价资源――内存来存储逻辑上独立的一个复杂对象,从而减少昂贵资源(例如数据库链接)的使用。
而XML的作用是提供应用的简单配置,在ASP页面与组件之间建立一种松散联系。有了这种联系,应用程序就可以以一种非常随意而轻松的方式进行分工、拆卸和组装。这种想法来自于现在的MVC Struts中的struts-config.xml和ASP.NET中的web.config。
关于VB组件的注册一直是一个大问题。现在的Web应用已经远远超过了过去的概念。原来只是做做网站,现在却可以做复杂的应用系统,而且不仅禁止运行在ISP的虚拟主机上,越来越多的应用被部署到企业的内部网络。既然如此,VB中组件的注册已经不成为问题,一般来说,除非必要,否则在一个项目中使用一个dll足够了。当然,在开发过程中的调试也许是非常枯燥的。在本文的最后,有一些组件调试的小技巧,如果你真的打算用这种方式来开发Web应用的话,你可以参考一下。
下面是一个实际的例子。由于时间、环境的原因,作者仅仅在自己的机器上对代码进行了运行和测试,由于篇幅所限,作者也不提供整个样例的代码(如果读者熟知ASP与VB的话,实际上代码是非常简单的),下面的例子仅仅是一个简单的开发原型。在实际的系统使用中需要考虑更多的因素。
一个会员注册、登录、注销的例子:
下面这个例子采用上面提到的面向对象的思想。在这个小型示例中,包括了以下几个部分:
User类 用来模拟在应用系统中的一个实体
DataPRovider类 提供所有的数据库操作
Globals类 读取配置xml文件
(以上类被封装到ExtendPortal.dll中。)
一些相关的asp文件
假定我们的站点名称为ExtendPortal
1、 定义xml文件(app-config.xml)
<?xml version="1.0" encoding="gb2312"?>
<app-config>
<!--Define the site infomation-->
<site-info>
<name>ExtendPortal</name>
</site-info>
<!--Define data source informations-->
<data-sources >
<data-source>
<name>accessDB</name>
<value>DSN=ep</value>
</data-source>
</data-sources >
<!--Define the resources-->
<resources>
<resource key="urlHome" value="/index.asp" />
</resources>
</app-config>
上面只是一个例子,你可在实际的项目中根据需求进行定义。
类图如下所示:
(图1)
系统的处理流程如下:
根据上图所示,一个完成的Web开发的项目就可以以一种结构化程度很高的方式进行组织和搭建,而且在整个系统的模型中,处处体现着面向对象的思想,用这种模型实现的多层结构模块之间联结松散,分工、组织都非常容易。当然,这种模型的最大的“缺点”就是在初期的时候需要花较多的时间分析用户的需求,并且由此分析出相应的实体组件和功能组件。然而,这似乎是所有正常运转的项目的通用特点。
开发技巧
到此,读者应该对作者提出的这种模型有了一定的了解。但是,在实际的开发中还需要注意很多问题,这其中最大的问题莫过于组件的调试。每次重新编译组件都要重新注册,甚至有可能要IIS重启。下面的一些小技巧也许能够帮你减少这些烦恼:
1 小心的编程!不要让编译器帮你找到那些简单的错误,例如变量未定义,函数用错等等。这些错误往往占据了调试的大多数时间。
2 选择一种合适的线程模型。千万不要用单线程编译你的组件,原因自己想吧。
3 通过将Web程序的进程环境设置“高”,然后你可以通过卸载应用程序的方式来重新注册组件,而不用重新启动IIS.
结束语:
本文论述了一种新的ASP编程模型,它与一般的COM组件并不一样,而在其中提出了实体组件的概念。希望这篇文章能够帮助那些为了降低开发风险而使用ASP的中小型项目或者开发人员提供一个更高层次的帮助。