ASP教程之进步ASP功能的22个技能(二)
ASP一般认为只能运行在IIS上,正如前面所提到的,这并不是十分正确,事实上,ASP也能运行在Apache上。ApacheASP可在任意Apache服务器上运行有限的ASP功能,所需做的,只需打开mod_perl。技能|功能 技能12:将经常使用数据复制到剧本变量中当会见ASP中的COM工具时,应当将经常使用工具数据复制到剧本变量中。着将削减COM办法挪用。而COM办法挪用价值绝对比会见剧本数据更高。当会见Collection和
Dictonary工具时,这项手艺也能消减奋发的查询价值。
一般,当筹办不止一次会见一个工具数据时,应当将这个数据放当一个剧本工具中。
这项优化的次要方针是Request变量(Form和QueryString变量)。比方,你的站点传送一个叫UserID的QueryString变量,假定在一个特定页UserID被援用十次。在ASP页面的顶部,将UserID的值赋给一个变量,来替换十次的挪用Request
("UserID"),将接生9次COM挪用。
在实践中,会见COM属性或办法的高贵价值大概对照潜伏。上面是一个例子,显现一段一般的代码:
Foo.bar.blah.baz=Foo.bar.blah.qaz(1)
IfFoo.bar.blah.zaq=Foo.bar.blah.abcThen...
上面是这段代码运转的步骤:
1.变量Foo被剖析为一个全局工具
2.变量bar被剖析为Foo的一个成员。这触发一次COM办法挪用
3.变量blash被剖析为Foo.bar的一个成员。一样,这也触发一次COM办法挪用
4.变量qaz被剖析为Foo.bar.blash的一个成员。对,这也触发一次COM办法挪用
5.挪用Foo.bar.blah.qaz(1)。一个或多个COM办法挪用。猎取图片?
6.反复步骤1到步骤3来剖析baz。体系不晓得挪用qaz是不是会改动工具模子,以是步骤1到步骤3又实行了一次,来剖析baz
7.剖析出baz是Foo.bar.blah的一个成员,实行属性put.
8.反复步骤1到步骤3来剖析zaq
9.反复步骤1到步骤3来剖析abc
正如你所看到的,这是何等低效(而且慢)。疾速的办法是按以下代码写VBScript:
Setmyobj=Foo.bar.blahdotheresolutionofblahONCE
Myobj.baz=myobj.qaz(1)
IfMyobj.zaq=Myobj.abcThen...
假如你用的是VBScript5.0或更后的版本,可使用With语句:
WithFoo.bar.blah
.baz=.qaz(1)
If.zaq=.abcThen...
...
EndWith
技能13:制止利用可变数组
只管制止利用可变数组。既然体贴功能,最好仍是在数组初始化的时分就设置好它大概的最年夜巨细。固然,这不是说你明知不必要几M的内存,但仍是应当给数组分派了那末多。
上面的代码是一个在理利用Redim的树模:
<%
DimMyArray()
RedimMyArray(2)
MyArray(0)="hello"
MyArray(1)="good-bye"
MyArray(2)="farewell"
...
RedimPreserveMyArray(5)
MyArray(3)="morestuff"
MyArray(4)="evenmorestuff"
MyArray(5)="yetmorestuff"
%>
复杂地将数组初始化的时分界说成准确的巨细(这里应当是5)远比Redim数组使它变年夜好。你大概会华侈一些内存(假如你最初没有效完一切的元素),但失掉的是速率!
技能14:利用呼应缓冲(ResponseBuffering)
翻开“呼应缓冲”就能够缓冲全部页面的输入,如许能够削减向扫瞄器写的次数,进步了整体功能。每次写扫瞄器都要泯灭必定的工夫和资本,因而削减写扫瞄器次数能进步功能;同时,TCP/IP协定发送少的年夜块数据比发送多的小块数据效力更高。
有两种办法能够翻开呼应缓冲。起首,可使用InternetServiceManager来翻开全部使用的呼应缓冲。这是保举的办法。在IIS4.0和IIS5.0中,新建一个使用时,呼应缓冲缺省是翻开的。第二种办法:针对每一个自力的ASP页面,能够经由过程在页面顶部安排以下代码来翻开呼应缓冲:
<%Response.Buffer=True%>
这行语句必需在一切缓冲数据写之前实行(就是说,在一切HTML和经由过程Response.Cookies设置Cookie之前)。一般,最好是为全部使用翻开呼应缓冲;如许你就不必在每一个ASP页面顶部写下面那条语句了。
Response.Flush
关于呼应缓冲,由于用户在看到器材之前必需守候全部页面熟成,以是用户大概够感到到ASP页面呼应对照慢(固然全体呼应工夫延长了);对一个运转工夫较长的页面,能够同过Response.Buffer=False来关失落呼应缓冲;但更好的战略是利用Reponse.Flush办法。这个办法把一切已由ASP天生的HTML输入到扫瞄器中。比方,一个1,000行的年夜表,在写完100行以后,ASP能够挪用Response.Flush来强迫把了局写到扫瞄器中,如许,用户就能够在其他行天生之前先看到100行数据。这个手艺能让你一举两得―呼应缓冲和渐进式地在扫瞄器体现数据。
(注重,在下面的1,000行表的例子中,良多扫瞄器在碰到</table>标志之前大概其实不画出全部表。假如想让扫瞄器慢慢显现出数据,能够将一个年夜表分红多个小表,然后对每一个小表挪用Response.Flush。新版本的IE会鄙人载完全个表之前显现表,而且假如指定了表的列宽,显现的速率会更快。)
别的,当发生一个十分年夜的页面时,呼应缓冲大概会损耗失落很多的服务器内存。这个成绩也能够经由过程利用Response.Flush来办理。
技能15:剧本年夜块化和Response.Write语句
VBScript语法<%=表达式%>把“表达式”的值写到ASP输入流中;但假如呼应缓冲没有翻开,每一个如许的语句城市想扫瞄器写数据,就把收集流分红良多小的包。如许会慢。一样,零散的小段剧本和HTML招致频仍的在剧本引擎和HTML之间切换,下降了功能。因而,应当利用以下技能:把小块内嵌表达式改成挪用Response.Write。比方,鄙人面的例子中,每行的每一个字段都向呼应流中写数据,而且每行都在VBScript和HTML中切换:
<table>
<%ForEachfldinrs.Fields%>
<th><%=fld.Name%></th>
<%
Next
WhileNotrs.EOF
%>
<tr>
<%ForEachfldinrs.Fields%>
<td><%=fld.value%></td>
<%Next
</tr>
<%rs.MoveNext
Wend%>
</table>
上面是更无效的代码,每行只向呼应流中写一次。一切的代码包括在一个VBScript块中:
<table>
<%
Foreachfldinrs.Fields
Response.Write("<th>"&fld.Name&"</th>"&vbCrLf)
Next
WhileNotrs.EOF
Response.Write("<tr>")
ForEachfldinrs.Fields%>
Response.Write("<td>"&fld.value&"</td>"&vbCrLf)
Next
Response.Write"</tr>"
Wend
%>
</table>
当呼应缓冲被克制时,这个技能非成的无效。最好翻开呼应缓冲,然后再看看批量地Response.Write对功能的进步。
技能16:在进进长时运算之前利用Resonse.IsClientConnected
假如用户感应不耐心,他们大概在ASP页面盘算他们的哀求之前分开这个页面。假如他们点击革新或是跳到服务器上的另外一个页面,新的哀求将位于ASP哀求行列尾部,而中止的哀求却在哀求行列的中部;一般服务器在高负载情形下大概产生这类情形(服务器有很长的哀求行列,同时哀求次数也良多);而这类情形又使服务器的负载情形变得加倍卑劣。假如用户已断失落毗连,没有需要再实行这个ASP页面(特别当这是一个很慢、很耗资本的页面时);Response.IsClientConnected属功能反省出这类情形;假如属性前往False,就应当挪用Resonse.End来停止残剩的页面。现实上,IIS5.0使这类反省纪律划--不管甚么时分ASP筹办实行一个新的哀求,他先反省哀求行列有多长;假如行列已凌驾3秒钟,ASP就会反省客户端是不是毗连;假如客户端已断开,ASP当即停止这个哀求。可使用AspQueueConnectionTestTime设置来调剂3秒的超时。
假如有一个十分耗时的页面要实行,也能够在页面中反省
Response.IsClientConnected。当呼应缓冲翻开时,在页面运转中利用
Response.Flush也能给用户操纵正在实行的感到。
注重:在IIS4.0上,除非你先实行了Response.Write,不然Response.IsClientConnected的了局有大概不准确;假如呼应缓冲已翻开,还必需先实行Response.Flush。在IIS5.0上,就没有这个需要了,Response.IsClientConnected事情得很一般。不管任何情形,Response.IsClientConnected总要损耗一些工夫,因而,只应当在实行耗时最少凌驾500ms的页面中实行。主要准绳是,不要在一个严密的轮回中重复挪用这个属性。
技能17:用<OBJECT>标志来实例化工具
假如你想在Global.asa中援用一个不在一切的代码路径中利用的工具(特定的服务器-或使用-局限工具),利用<objectrunat=serverid=objname>标志界说比用Server.CreateObject办法界说更加符合一点。由于Server.CreateObject当即创立工具,但假如过你今后不利用这个工具,则华侈了资本。<objectid=objname>只是声明objname,但objname并没有真正创立;objname在第一次利用时才创立。
技能18:为ADO和其他组件利用范例库声明
当利用ADO时,开辟者常常经由过程包括adovbs.txt来会见ADO常量。这个文件必需包括在每一个利用常量的页面里;而常量文件还想相称的年夜,年夜年夜增添了处置每页泯灭的工夫和资本。
IIS5.0引进了绑定组件范例库的才能;同意只援用范例库一次,然后就能够在每一个ASP页面中利用。每一个页面不必在为编译常量文件而损耗资本;组件开辟者也不必为ASP筹办VBScript包括文件了。
能够在Global.asa中放进以下语句,来会见ADO范例库:
<!--METADATANAME="MicrosoftActiveXDataObjects2.5Library"
TYPE="TypeLib"UUID="{00000205-0000-0010-8000-00AA006D2EA4}"-->
或
<!--METADATATYPE="TypeLib"
FILE="C:ProgramFilesCommonFilessystemadomsado15.dll"-->
技能19:在轮回中制止举行字符串联接
良多人喜好用以下的轮回天生字符串:
s="<table>"&vbCrLf
ForEachfldinrs.Fields
s=s&"<th>"&fld.Name&"</th>"
Next
WhileNotrs.EOF
s=s&vbCrLf&"<tr>"
ForEachfldinrs.Fields
s=s&"<td>"&fld.value&"</td>"
Next
s=s&"</tr>"
rs.MoveNext
Wend
s=s&vbCrLf&"</table>"&vbCrLf
Response.Writes
这类办法有一些成绩。第一个就是在轮回中毗连字符串会使工夫成二次方(quadratic)发展;大概说,运转这个轮回的工夫同纪录的字段数量平方成反比。
上面复杂的例子能更分明地瞥见实质:
s=""
Fori=Asc("A")toAsc("Z")
s=s&Chr(i)
Next
在第一次轮回中,s即是"A";在第二次轮回中,VBScript必需从头分派s的空间,并把字符串"AB"赋给s;在第三次轮回中,又从头分派s的空间,从头赋值。在第N(26)次轮回中,VBScript从头分派并复制了N次字符串给s,以是,统共是1+2+3+...+N=N*(N+1)/2次复制。
在下面例子中,假如有100笔记录,每一个纪录有5个字段,则内轮回实行100*5=500次,一切复制和从头分派空间的次数响应的就是500*500=250,000次;这还只是对一个很小的纪录集。
在这中情形下,能够经由过程用Response.Write或是内嵌剧本(<%=fld.value%>)来交换字符串联接来进步功能。假如呼应缓冲已(也应当被)翻开,Response.Write只是向呼应缓冲尾部增加数据,没有从头分派内存,因而十分高效。
在一些特定的将ADO纪录集转换为HTML表的情形中,能够思索利用GetRows或GetString函数。
假如利用JScript毗连字符串,激烈保举利用+=操纵符;就是说,用s+="somestring",不要利用s=s+"somestring"。
技能20:利用Server.Transfer取代Response.Redirect
Response.Redirect告知扫瞄器哀求别的一页。这个函数常常用来把用户跳转到登录页面或毛病页面。既然redirect强迫发生新的页面哀求,了局就是扫瞄器和Web服务器间做了两次交互,Web服务器不能不多处置一次分外的哀求。IIS5.0引进了一个新的函数:Server.Transfer;这个函数间接把运转权交给统一个服务器上的另外一个页面;制止了分外的扫瞄器到Web服务器的交互,进步了功能。
技能21:在目次URL的尾部加上斜杠(/)
假如省略了尾部的斜杠,扫瞄器回发送一个哀求给服务器,原告知它的哀求是一个目次;然后扫瞄器再发送一个二次哀求,不外此次URL尾部加上了斜杠,然后服务器再次呼应扫瞄器。假如一入手下手就给URL加上斜杠,即可以省往无用的哀求;固然,为了用户友爱性,你能够在显现名字时省略尾部斜杠。
比方,按以下的写法:
<ahref=http://www.webjx.com/;;title="webjx.com">http://www.webjx.com<;;/a>
技能22:制止利用服务器端变量
会见服务器端变量将使站点给服务器发送一个特别哀求,搜集一切的服务器端变量,不单单是你所会见的那一个。
实现规模效益。与传统的用户拥有硬件软件所有权和使用权以及传统的应用服务商提供一对一的服务模式不同,ASP拥有应用系统所有权,用户拥有使用权,应用系统集中放在ASP的数据中心中,集中管理,分散使用,以一对多的租赁的形式为众多用户提供有品质保证的应用技术服务,实现规模效益。 另外因为asp需要使用组件,所以了解一点组件的知识(ADODB也是组件) 最近在学asp,不要问我为什么不直接学.net,因为公司网站是asp做的所以有这个需要,卖了本书asp入门到精通,对里面的六大内置对象老是记不住,还有很多属性和方法看的头晕。 如何学好ASP,以前也有人问过,把回答给你转过来看看能否对你有帮助: 以HTML语言整合(HTML负责界面上,ASP则负责功能上)形成一个B/S(浏览器/服务器)模式的网页程序。 在平时的学习过程中要注意现学现用,注重运用,在掌握了一定的基础知识后,我们可以尝试做一些网页,也许在开始的时候我们可能会遇到很多问题,比如说如何很好的构建基本框架。 我就感觉到ASP和一些常用的数据库编程以及软件工程方面的思想是非常重要的。我现在也在尝试自己做网页,这其中就用到了ASP,我想它的作用是可想而知的。 我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标. 完全不知道到底自己学的是什么。最后,除了教程里面说的几个例子,还是什么都不会。
页:
[1]