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
From:http://tw.wingwit.com/Article/program/net/201311/13107.html