概述
本文简要描述了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的中小型项目或者开发人员提供一个更高层次的帮助。