ASP(Active Server Page)是Microsoft公司推出的基于PWS(Personal Web Server)&IIS(Internet Information Server)平台的基于ISAPI(InternetServiceAPI)原理的动态网页开发技术目前日趋成熟完善在这里仅就代码优化进行一些简单讨论
声明VBScript变量
在ASP中对vbscript提供了强劲的支持能够无缝集成vbscript的函数方法这样给扩展ASP的现有功能提供了很大便利由于ASP中已经模糊了变量类型的概念所以在进行ASP与vbscript交互的过程中很多程序员也惯于不声明vbscript的变量这样加重了服务器的解析负担进而影响服务器的响应请求速度
鑒于此我们可以象在VB中强制用户进行变量声明一样在vbscript中强制用户进行变量声明实现方法是在ASP程序行首放置<% option explicit%>
对URL地址进行编码 在我们使用asp动态生成一个带参数URL地址并进行跳转时在IE中解析很正常但在NetScrape浏览时却有错误如下
HTTP Error Bad Request
Due to malformed syntax the request could not be understood by the server
The client should not repeat the request without modifications
解决方法是对生成的URL参数使用ASP内置server对象的URLencode方法进行URL编码例子如下
<% URL=xurasp
var=username= & serverURLencode(xur)
var=&company= & serverURLencode(xurstudio)
var=&phone= & serverURLencode()
responseredirect URL & ? & var & var & var
%>
清空对象
当使用完对象后首先使用Close方法来释放对象所占用的系统资源然后设置对象值为nothing释放对象占用内存当年我就是在一张页面上创建了百余个没有清空对象的记录集而崩溃了我的IIS 下面的代码使用数据库内容建立一个下拉列表代码示例如下
<% myDSN=DSN=xur;uid=xur;pwd=xur mySQL=select * from authors where AU_ID<
set conntemp=servercreateobject(nnection)
conntempopen myDSN
set rstemp=conntempexecute(mySQL)
if rstempeof then
responsewrite 数据库为空
responsewrite mySQL
conntempclose
set conntemp=nothing
responseend
end if%>
<%do until rstempeof %>
<%
rstempmovenext
loop
rstempclose
set rstemp=nothing
conntempclose
set conntemp=nothing
%>
使用字符串建立SQL查询
使用字符串来建立查询并不能加快服务器的解析速度相反它还会增加服务器的解析时间但在这里仍然推荐使用字符串代替简单的查询语句来进行查询这样做的好处是可以迅速发现程序问题所在从而便利高效地生成程序示例如下
<%mySQL= select * mySQL= mySQL & from publishers
mySQL= mySQL & where state=NY
responsewrite mySQL
set rstemp=conntempexecute(mySQL)
rstempclose
set rstemp=nothing
%>
使用case进行条件选择
在进行条件选择的时候尽量使用case语句避免使用if语句使用case语句可以使程序流程化执行起来也比if语句来的快示例如下
<% FOR i = TO
n = i
ResponseWrite AddSuffix(n) & <br>
NEXT
%>
<%
Function AddSuffix(num)
numpart = RIGHT(num)
SELECT CASE numpart
CASE
IF InStr(num) THEN
num = num & th
ELSE
num = num & st
END IF
CASE
IF InStr(num) THEN
num = num & th
ELSE
num = num & nd
END IF
CASE
IF InStr(num) THEN
num = num & th
ELSE
num = num & rd
END IF
CASE
num = num & th
CASE ELSE
num = num & th
END SELECT
AddSuffix = num
END FUNCTION
%>
使用adovbsinc文件中定义的常量打开记录集 打开记录集时可以定义记录集打开的游标类型和锁定类型在adovbsinc文件中定义了一些常量来定义这些类型adovbsinc文件保存在\inetpub\iissamples\IISamples目录下面下面列举几个常用的游标类型和锁定类型
游标类型adOpenFowardOnly游标只能向前adOpenKeyset游标可向前或者向后如一用户添加记录新记录不会出现在记录集中adOpenDynamic游标动态随意adOpenStatic记录集不对其他用户造成的记录修改有所反映
锁定类型adLockReadOney不能修改记录集中的记录adLockPessimistic在编辑一条记录时锁定它adLockOptimstic调用记录集Update方法时才锁定记录adLockBatchOpeimstic记录只能成批更新
<!#INCLUDE VIRTUAL=/ADOVBSINC > <%
connectme=DSN=xur;uid=xur;pwd=xur
sqltemp=select * from publishers where name=xur
set rstemp=ServerCreateObject(adodbRecordset)
rstempopen sqltemp connectme adOpenStaticadLockOptimstic
responsewrite rstemprecordcount & records in<br> & sqltemp
rstempclose
set rstemp=nothing
%>
避免在使用globalasa文件中进行对象定义
由于globalasa文件中的内容可以为站点内所有文件引用无疑在globalasa文件中进行对象定义可以省去很多重复工作比如在globalasa中的application_onstart函数中进行如下定义
<%SUB application_onstart set application(theCONN)=servercreateobject(nnection)
END SUB %>;
这样就可以在站点任何代码中做类似引用
<% mySQL=select * from publishers where state=xur
set rstemp=application(theconn)execute(mySQL)
%>
同样地可以在session_onstart函数中创建记录集对象
<%SUB session_onstart set session(rstemp)=servercreateobject(adodbrecordset)
END SUB %>
然后在站点也面中进行如下引用
<% mySQL=select * from publishers where state=xur
set session(rstemp)=conntempexecute(mySQL)
%>
但这样做的同时也有很大的负面影响由于Application和session变量都只有在关闭网站的时候才释放占用的资源所以session参数会浪费大量不必要内存而且此时application变量成为服务器性能的瓶颈
解决方法建立定义对象asp页面在需要进行调用这些对象的页面上引入这张asp页面假设定义对象的asp页面名称为defineasp则只要在对应asp页面中加入以下语句就能引入该页面
<!#INCLUDE VIRTUAL=/defineasp >
在进行页面引进时最好在待引进的asp文件中不要包含<%@LANGUAGE=VBSCRIPT%>语句因为在asp文件中只能有一句由@来定义的脚本解析语言
安全防护 asp提供了很好的代码保护机制所有的asp代码都在服务器端执行而只返回给客户端代码执行结果即便这样在老版本的IIS中还可以在文件名后面家::$DATA来查看asp的源代码这已经属于Web Server安全范畴不在本文讨论范围内下面提出两点简单的安全注意事项
虽然在asp中建议引入文件以inc作为扩展名在这里仍建议以asp作为引文件的扩展名当这些代码在安全机制不好的Web Server上运行时只需在地址栏上输入引入文件的地址(inc为扩展名)就可以浏览该引入文件的内容这是由于在Web Server上如果没有定义好解析某类型(比如inc)的动态连接库时该文件以源码方式显示
不要把数据库文件放在网站结构内部这样当恶意人士获取数据库路径后就可以轻易获取该数据库进而肆意更改数据库内容比较好的做法是为数据库建立DSN(Date Source Name)而在进行数据库访问时直接访问该DSN