仓酷云
标题:
ASP网页编程之怎样加强ASP程序功能
[打印本页]
作者:
小魔女
时间:
2015-1-16 22:54
标题:
ASP网页编程之怎样加强ASP程序功能
结论:和PHP一样,ASP简单而易于维护,很适合小型网站应用,通过DCOM和MTS技术,ASP甚至还可以完成小规模的企业应用,但ASP的致命缺点就是不支持跨平台的系统,在大型项目开发和维护上非常困难。程序|功能
功能是一个很主要的特性。你必要事前计划好功能目标,不然往后就要为此从头编写程序。就是说:要假想好如何最好化地实行ASP程序?
本文提出了一些优化ASP使用和VBScript的技能,很多技能和缺点都经由了研究。这里列出的倡议已在http://www.microsoft.com和其他站点长进行了测试,都事情得十分好。本文假定你具有ASP开辟的基础常识,包含VBScript大概JScript,ASP使用程序,ASPSession,和其他ASP内置工具(Request,Response和Server)。
一般,ASP的实行功能远远不单单依附ASP代码自己!在本文的尾部列出了与功能相干的资本,它们含概了ASP和非ASP的部分,包括ActiveXDataObjects(ADO),ComponentObjectModel(COM),数据库(Database),和Internet信息服务器(IIS)的设置。除这些,另有一些十分好的链接值得你一看。
技能1:在Web服务器上缓存常常利用的数据
典范的情形是:ASP页面从背景存储中取回数据,然后以超文本标志言语(HTML)的情势构成了局。不论数据库的速率怎样,从内存中取回数据要比从背景存储设备中快很多。从当地硬盘读取数据一般也十分快。以是,进步功能能够经由过程缓存服务器上的数据来完成,不管是将数据缓存在内存中,大概当地硬盘中。
缓存是典范的“空间换工夫”的折衷体例。假如缓存得得当,就能够看到明显的功能提拔。为了让缓存无效,必需包管缓存数据是常常要重用的,并且也是盘算起来烦琐的。装满陈腐数据的缓存是对内存的华侈。
不常常改动的数据是缓存的较好工具,由于不必要随时思索这些数据更新后的同步操纵。组合框、参考表格、DHTML代码、扩大标志言语串、菜单和站点设置变量(包含数据源名字DSNS,Internet协定地点IP和Web路径)都是很好的缓存工具。注重:要缓存数据表达式而不是数据自己。假如一个ASP页面常常变更而且很吃力往缓存(好比全部产物目次),就要思索预发生HTML,而不是每次产生哀求时再形貌它。
技能2:在Application或Session工具中缓存常常利用的数据
ASP中的Application和Session工具是在内存中缓存数据的便当容器。你能够将数据赋值给Application和Session工具,这些数据在HTTP挪用时代将一向坚持在内存中。Session中的数据是?一个用户服务的,Application中的数据是一切用户共享的。
什么时候必要在Application和Session中装进数据?一般,当使用程序启动大概会话入手下手时,数据就被装进了。为了在这时候装进数据,在ApplicationOnStart()大概SessionOnStart()平分别增加得当的代码。这些函数位于文件Global.asa中,假如本来不存在,就增加上。也能够在数据初次必要的时分调进,在ASP页面中增加代码,反省数据是不是存在,假如没有发明,就调进它。这里有一个例子,它代表了被称为“lazyevalution”的典范功能处置手艺:直到必要时,再往盘算。例子以下:
$#@60;%FunctionGetEmploymentStatusListDimdd=Application("EmploymentStatusList")Ifd=""ThenFetchEmploymentStatusListfunction(notshown)fetchesdatafromDB,returnsanArrayd=FetchEmploymentStatusList()Application("EmploymentStatusList")=dEndIfGetEmploymentStatusList=dEndFunction%$#@62;
复制代码
关于分歧的数据,能够编写相似的函数代码。
数据应当按甚么格局保留?任何变量范例都能够,由于一切的剧本变量都是分歧的。好比说,能够保留为字符串、整型大概数据。一般,将ADO纪录集的内容存储到这些变量范例中一个。为了从ADO纪录会合掏出数据,必要手工地拷贝数据到VBScript变量中,每次一个字段。利用恣意一个ADO纪录集的函数functionsGetRows(),GetString()大概Save()(ADO2.5)都十分得疾速并且复杂,这里有个函数,形貌了怎样利用GetRows()前往纪录集数据的数组:
GetRecordset,returnasanArrayFunctionFetchEmploymentStatusListDimrsSetrs=CreateObject("ADODB.Recordset")rs.Open"selectStatusName,StatusIDfromEmployeeStatus",_"dsn=employees;uid=sa;pwd=;"FetchEmploymentStatusList=rs.GetRows()"ReturndataasanArrayrs.CloseSetrs=NothingEndFunction
复制代码
上述代码的一个更深的技能是为列表缓存了HTML。上面是个复杂的例子:
GetRecordset,returnasHTMLOptionlistFunctionFetchEmploymentStatusListDimrs,fldName,sSetrs=CreateObject("ADODB.Recordset")rs.Open"selectStatusName,StatusIDfromEmployeeStatus",_"dsn=employees;uid=sa;pwd=;"s="$#@60;selectname=""EmploymentStatus"$#@62;"&vbCrLfSetfldName=rs.Fields("StatusName")ADOFieldBindingDoUntilrs.EOFNextlineviolatesDontDoStringConcats,butitsOKbecausewearebuildingacaches=s&"$#@60;option$#@62;"&fldName&"$#@60;/option$#@62;"&vbCrLfrs.MoveNextLoops=s&"$#@60;/select$#@62;"&vbCrLfrs.CloseSetrs=NothingSeeReleaseEarlyFetchEmploymentStatusList=sReturndataasaStringEndFunction
复制代码
在符合的情况下,能够在Application大概Session中缓存ADO纪录集自己,可是有2点提醒:
ADO必需是自在线程标志的
必要利用disconnectedrecordset体例
假如不克不及包管上述2个前提,就不要缓存ADO纪录集,由于这会发生很年夜的伤害性。
当在Application或Session中保留数据后,数据将一向坚持,除非程序改动它、Session变量到期大概Web使用程序从头启动。假如数据必要更新,怎样办?能够挪用只要办理员才干会见的ASP页面来更新数据,大概,经由过程函数周期性的主动更新数据。上面的例子中,与缓存数据一同保留了时钟标志,过一段工夫后,就革新数据。
$#@60;%errorhandingnotshown...ConstUPDATE_INTERVAL=300Refreshinterval,insecondsFunctiontoreturntheemploymentstatuslistFunctionGetEmploymentStatusListUpdateEmploymentStatusGetEmploymentStatusList=Application("EmploymentStatusList")EndFunctionPeriodicallyupdatethecacheddataSubUpdateEmploymentStatusListDimd,strLastUpdatestrLastUpdate=Application("LastUpdate")If(strLastUpdate="")Or_(UPDATE_INTERVAL$#@60;DateDiff("s",strLastUpdate,Now))ThenNote:twoormorecallsmightgetinhere.Thisisokayandwillsimplyresultinafewunnecessaryfetches(thereisaworkaroundforthis)FetchEmploymentStatusListfunction(notshown)fetchesdatafromDB,returnsanArrayd=FetchEmploymentStatusList()UpdatetheApplicationobject.UseApplication.Lock()toensureconsistentdataApplication.LockApplication("EmploymentStatusList")=dApplication("LastUpdate")=CStr(Now)Application.UnlockEndIfEndSub
复制代码
有别的一个例子,请参阅World’sFastestListBoxwithApplicationData。
必需意想到,在Session大概Application工具中缓存年夜容量的数组不是一个好的办法。存取数组中任何元素前,剧本言语的划定规矩请求起首要创建全部数组的一时备份。好比,假如在Application工具中缓存一个100,000个元素的数组,个中包括U.S.邮政编码与当地景象站的对应干系,ASP就必需起首拷贝一切100,000个景象站信息光临时数组中,然后才干选择个中一个字符串举行处置。在这类情形下,创立一个定制的组件,编写一个办法存储景象站信息,长短常好的办法。
技能3:在Web服务器磁盘上缓存数据和HTML页面
偶然候,有“很多”数据要在内存中缓存。“很多”是绝对而言的,它取决于能损耗几内存、缓存项目标数目和取回数据的频度。任何情形下,假如必要在内存中缓存大批的数据,请思索以text大概XML文件格局在Web服务器硬盘上做缓存。固然,也能够夹杂利用硬盘缓存数据和内存缓存数据,从而到达最好缓存。
注重:当测试一个单一ASP页面的功能时,从磁盘取回数据纷歧定比从收集数据库中取回数据快,可是缓存削减了收集数据库的挪用。在年夜范围挪用时,这将分明地进步收集的吞吐才能。缓存一个费时的查询了局长短常有效的,好比关于一个庞大的存储历程,大概大批的了局数据。
ASP和COM供应了几种创建基于磁盘缓冲设置的工具。ADO纪录集的Save()和Open()函数卖力保留和调进磁盘上的纪录集。别的另有一些组件:
Scripting.FileSystemObject同意你创立、读取和写文件
MSXML,MicrosoftXML剖析器随InternetExplorer而来,撑持保留和装进XML文档
LookupTable工具(好比在MSN上利用)是从磁盘调进复杂列表的很好选择。
最初,思索缓存磁盘数据的表达式,而不是数据自己。预处置的HTML能够存储为.htm大概.asp文件,链接间接指向它们。利用诸如XBuilder大概MicrosoftSQLServerInternet公布类的贸易工具,可以主动处置这些历程。并且,也能够在.asp文件中包括HTML程序片段。一样,也可以使用FileSystemObject从磁盘上读取HTML文件,大概利用XMLforearlyrendering来做这个事情。
技能4:制止在Application或Session工具中缓存非轻盈型组件
在Application或Session工具中缓存数据是一个很好的办法,可是,缓存COM工具却有严峻的缺点。在Application或Session工具中缓存常常利用的COM工具这个事情长短常吸惹人的,可是很不幸,很多COM工具,包含用VisualBasic6.0大概之前版本编写的工具组件,当存储在Application或Session工具中后,城市发生严峻的瓶颈成绩。
出格地,当组件编写得不是很轻便时,就很可能发生瓶颈成绩。一个轻型组件就是标志了ThreadingModel=Both的组件,个中算计了自在线程的分列(FTM),大概标志了ThreadingModel=Neutral(Neutral形式是Windows2000和COM+中的新特性)。上面的组件不是轻型的:
Free-threaded组件(除非被汇合成FTM)
Apartment-threaded组件
Single-threaded组件
Configuredcomponents不是轻型组件,除非它们是Neutral-threaded的。Apartment-threaded组件和其他非轻型组件在页局限内事情得很好,就是说,它们是在一个单一ASP页面中创立并开释的。
假如缓存了非轻型组件,将会产生甚么毛病?在Session工具中缓存的非轻型组件将会“锁住”会话。ASP保护着一个呼应哀求的事情线程池,一般,新的哀求被第一个可用的事情线程把持。假如一个会话被锁在一个线程中,那末哀求就自愿守候到相干的线程变成可用。这里有一个类比:你前去一个超等市场,选择了一些食物,并在3号付款台付款。从那今后,只需在谁人超等市场买食物付款,你就会常常到3号付款台往,固然其他的付款台人少些乃至没有人。
技能5:不要在Application或Session工具中缓存数据库毗连
缓存ADO毗连一般不是一个好的战略。假如一个毗连工具被存储在Application工具中,并在一切的页面利用,那末一切页面将会争取该毗连的利用。假如存储在ASPSession工具中,那末将要为每个用户都翻开数据库毗连。这将挫败毗连池的利用企图,而且在Web服务器和数据库上都施加了不用要的高价值压力。
为了替换缓存数据库毗连,能够在利用ADO的每一个ASP页面中创立并开释ADO工具。这将十分无效,由于IIS具有内建的数据库毗连池。更正确地说,IIS主动处置OLEDB和ODBC毗连池,这将包管在每一个页面创立而且开释毗连的事情高效举行。
因为毗连的纪录集存储了数据库毗连的参考,以是,不要在Application或Session工具中缓存毗连的纪录集。但是,能够平安地缓存disconnected范例的纪录集,它们其实不保留响应数据库毗连的参考。为了断开纪录集,实行上面2步:
Setrs=Server.CreateObject("ADODB.RecordSet")rs.CursorLocation=[b]adUseClient[/b]step1Populatetherecordsetwithdatars.OpenstrQuery,strProvNowdisconnecttherecordsetfromthedataprovideranddatasourcers.[b]ActiveConnection[/b]=Nothingstep2
复制代码
更多的关于毗连池的信息请会见ADOandSQLServer。
asp可以使用微软的activeX使得网页功能无比强大,不过安全性也较差,而且是基于的windows服务器,所以性能稳定性也一般
作者:
若天明
时间:
2015-1-20 06:05
运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写,使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行。
作者:
不帅
时间:
2015-1-27 23:52
完全不知道到底自己学的是什么。最后,除了教程里面说的几个例子,还是什么都不会。
作者:
飘灵儿
时间:
2015-2-5 11:08
代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
作者:
海妖
时间:
2015-2-11 11:11
他的语法和设计思路和VB完全相同,导致很多ASP的书都留一句“相关内容请参考VB的相关教材....”更糟糕的是,相当多的ASP教程混合了Javascript,VBscript等等脚本语言,搞的初学者。
作者:
小女巫
时间:
2015-3-2 11:21
不能只是将它停留在纸上谈兵的程度上。
作者:
山那边是海
时间:
2015-3-11 03:22
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
作者:
活着的死人
时间:
2015-3-17 19:30
虽然ASP也有很多网络教程。但是这些都不系统。都是半路出家,只是从一个例子告诉你怎么用。不会深入讨论,更不会将没有出现在例子里的方法都一一列举出来。
作者:
简单生活
时间:
2015-3-24 22:11
如何学好ASP,以前也有人问过,把回答给你转过来看看能否对你有帮助:
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2