- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > web開(kāi)發(fā) > ASP >
- ASP腳本的執行順序詳細說(shuō)明
首先我們先來(lái)了解一下ASP頁(yè)面執行的流程
1.IIS找到ASP文件,提交給ASP引擎(一般是ASP.DLL)處理。
2.引擎打開(kāi)這個(gè)ASP文件,找出<%和%>之間的內容,當然還有<script runAt="server">和對應的</script>之間的內容,這些內容稱(chēng)為腳本塊。只有腳本塊里的內容被引擎解析,其他內容不管,作為沒(méi)有意義的字符插在腳本塊之間。有必要說(shuō)明一下的是,其實(shí)被解析的內容還不止這些,<!--#include ***-->類(lèi)的服務(wù)器端包含文件也是由引擎包含進(jìn)來(lái)并加以處理的。如果你讀的程序比較多,你還會(huì )知道有的runAt屬性標注為"Server"的<object>對象也是會(huì )被處理的,這里不做深入討論。
3.引擎執行腳本塊中的腳本,這些服務(wù)器端的腳本是作為一個(gè)整體被執行的,也就是說(shuō),可以寫(xiě)出如下的代碼:
代碼如下:
<%
Dim i
For i=1 to 5
%> Hello World!
<% Next %>
引擎并不會(huì )將這些腳本塊分開(kāi)解析,而使兩個(gè)腳本塊都發(fā)生語(yǔ)法錯誤。所以我們得到如下結論:并非所有非服務(wù)器腳本的代碼都會(huì )被發(fā)送到客戶(hù)端,有可能這段非服務(wù)器腳本的代碼被腳本塊限制了。服務(wù)器是一定不會(huì )操心客戶(hù)端腳本的執行問(wèn)題的,但是可以通過(guò)服務(wù)器端的腳本輸出不同的客戶(hù)端腳本。
4.最終引擎產(chǎn)生了一個(gè)文本流,或者說(shuō)是腳本的執行結果,可以認為這是一個(gè)字符串,就是發(fā)送到客戶(hù)端瀏覽器的網(wǎng)頁(yè)的代碼??蛻?hù)端瀏覽器將頁(yè)面顯示出來(lái),此時(shí)頁(yè)面的源代碼(源文件)是不包含服務(wù)器端的腳本的,但包含了服務(wù)器端腳本的執行結果(這是顯然的)。
<% … %> 與 <script runat="server">…</script>
它們都是服務(wù)器端的腳本,同時(shí)被處理執行。他們執行時(shí)是作為一個(gè)整體的。
<% … %> 與 <script language="…">…</script>
前者是服務(wù)器端腳本,后者是客戶(hù)端腳本。前者先執行,后者后執行。
其實(shí)也不盡然,二者的腳本是有可能在同時(shí)被執行的,但空間不同,仍然是:前者在服務(wù)器上執行,后者在客戶(hù)端瀏覽器里執行。前者在邏輯上一定提前于后者執行。同時(shí)我們也得到結論:在同一個(gè)頁(yè)面的執行中,客戶(hù)端腳本無(wú)論如何不能反饋給服務(wù)器端腳本,也就是說(shuō),客戶(hù)端瀏覽你的留言本并且提交新留言或者是任何客戶(hù)端腳本獲取的值都不可能在同一次服務(wù)器響應中被處理。
關(guān)于組件的調用
注意服務(wù)器端腳本和客戶(hù)端腳本都是腳本,自然都可以創(chuàng )建xmlhttp組件、ADODB.Connection組件等,但是并不是放在哪里都可以的。
xmlhttp如果用于服務(wù)器的抓取網(wǎng)頁(yè)(比如采集)就要在服務(wù)器腳本里創(chuàng )建了,而如果是用于客戶(hù)端的ajax無(wú)刷新而后臺訪(fǎng)問(wèn)服務(wù)器端的頁(yè)面,那么就是運行于客戶(hù)端的了,自然在客戶(hù)端創(chuàng )建。
ADODB.Connection組件用于訪(fǎng)問(wèn)數據庫,一般來(lái)說(shuō)在服務(wù)器端創(chuàng )建,畢竟是服務(wù)器端的asp程序在跑數據庫的數據,但如果你的數據庫真的是在客戶(hù)端連接的,那么就毫無(wú)疑問(wèn)在客戶(hù)端腳本里創(chuàng )建了。
總之,矛盾著(zhù)的事物及其每一個(gè)側面各有其特點(diǎn)。不同事物有不同的矛盾;同一事物在發(fā)展的不同過(guò)程和不同階段上有不同的矛盾;同一事物中的不同矛盾、同一矛盾的兩個(gè)不同方面各有其特殊性(看不懂的可以略去不看……)。這一原理要求我們堅持具體問(wèn)題具體分析原則,在矛盾普遍性原理的指導下,具體分析矛盾的特殊性,并找出解決矛盾的正確方法。反對千篇一律地采用一種方法解決不同事物的矛盾?!耙话谚€匙開(kāi)一把鎖,到什么山唱什么歌”講的就是這個(gè)道理。
服務(wù)器端VBScript腳本創(chuàng )建對象使用Server.CreateObject(className)方法,客戶(hù)端VBScript腳本創(chuàng )建對象使用CreateObject(className)方法。
典型錯誤
代碼如下:
<%
Function TSize(b)
'這是我自定義的函數
TSize="中國"
end function
%>
<a href="javascript:<%TSize('變量')%>" >點(diǎn)這里要使用我定義的函數</a>
錯誤分析:
混淆了服務(wù)器端腳本和客戶(hù)端腳本的區別。實(shí)際執行時(shí)我們會(huì )發(fā)現,客戶(hù)端根本沒(méi)有收到什么TSize之類(lèi)的代碼,因為T(mén)Size是服務(wù)器端的程序,被引擎處理之后(注意引擎對于函數的處理,純粹是給服務(wù)器端腳本調用的,不會(huì )發(fā)回到客戶(hù)端)就消失了,不可能在客戶(hù)端起作用。這就是說(shuō),客戶(hù)端腳本無(wú)法直接調用服務(wù)器端腳本的函數。
事實(shí)上,這個(gè)程序是有語(yǔ)法錯誤的,引擎處理這段內容的時(shí)候先找到了<%和%>之間的內容,也就是<%TSize('變量')%>,顯然這段內容不符合VBScript的語(yǔ)法規則。嗯,改成<%=TSize("變量")%>在服務(wù)器端腳本就沒(méi)有語(yǔ)法錯誤了,這時(shí)TSize函數可以正常返回值"中國",于是客戶(hù)端收到的href屬性是這樣寫(xiě)的:"javascript:中國",是無(wú)法執行的。
服務(wù)器端腳本對客戶(hù)端腳本的影響
前面已經(jīng)說(shuō)過(guò)了,服務(wù)器端腳本在邏輯上是提前于客戶(hù)端腳本的執行的,因此這樣的代碼是可行的:
代碼如下:
<%
Dim i
For i=1 to 5
Response.Write "<script type=""text/javascript"">" _
& "alert('Hello World!" & i & "')</script>"
Next
%>
關(guān)于Response.Redirect與javascript的執行問(wèn)題
注意以下代碼的寫(xiě)法是錯誤的:
代碼如下:
<%
Response.Redirect "index.asp"
Response.Write "<script type=""text/javascript"">" _
& "alert('密碼錯誤!')</script>"
%>
這是一種常見(jiàn)的錯誤,編寫(xiě)者常常以為,這樣寫(xiě)代碼可以使客戶(hù)端先彈出“密碼錯誤”的提示然后轉向到index.asp,事實(shí)上這不可能發(fā)生,即使將兩行代碼順序交換,也不可能達到這種效果。
究其原因,和服務(wù)器對于兩行代碼的處理方式有關(guān)。這兩行代碼不可能同時(shí)起作用。
Response.Write是向客戶(hù)端發(fā)送一段文本,這段文本的內容可以是一段腳本,那么客戶(hù)端瀏覽器收到后可以執行這段腳本,注意,要收到之后才能執行。
而Response.Redirect是向客戶(hù)端發(fā)送了一個(gè)HTTP頭信息(什么是HTTP頭信息?這么說(shuō)吧,比如對客戶(hù)端Cookies的寫(xiě)入是HTTP頭信息,HTTP頭信息在HTTP的主體之前發(fā)回客戶(hù)端瀏覽器,這就是為什么有時(shí)我們把服務(wù)器的緩沖關(guān)閉之后修改Cookies會(huì )出錯的原因,因為主體已經(jīng)開(kāi)始傳送,不允許發(fā)送HTTP頭信息了。),信息的內容告訴客戶(hù)端瀏覽器應該跳轉頁(yè)面瀏覽,注意,這個(gè)Redirect信息是立刻起作用的,也就是說(shuō)這個(gè)Redirect信息具有排他性,在緩沖打開(kāi)的情況下,無(wú)論已經(jīng)使用Response.Write向緩沖里寫(xiě)入了多少內容,一旦調用Response.Redirect,將會(huì )清空緩沖,并且向客戶(hù)端瀏覽器發(fā)送這個(gè)頭指令。如果動(dòng)態(tài)跟蹤一下程序的執行,我們還會(huì )發(fā)現,在調用了Response.Redirect之后,程序停止執行了,所以注意服務(wù)器端程序在調用Response.Redirect之前要做好數據連接的關(guān)閉等操作。
那么上面的例子應該怎樣修改呢?如果你不愿意修改那個(gè)index.asp以加入腳本提示的話(huà),那么只能將轉向指令放到客戶(hù)端腳本中執行,就像這樣:
代碼如下:
<%
Response.Write "<script type=""text/javascript"">" _
& "alert('!');location.href='index.asp'</script>"
%>
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站