[點晴永久免費OA]ASP腳本的執(zhí)行順序詳細說明
首先我們先來了解一下ASP頁面執(zhí)行的流程
1、IIS找到ASP文件,提交給ASP引擎(一般是ASP.DLL)處理。 2、引擎打開這個ASP文件,找出<%和%>之間的內(nèi)容,當然還有<script runAt="server">和對應的</script>之間的內(nèi)容,這些內(nèi)容稱為腳本塊。只有腳本塊里的內(nèi)容被引擎解析,其他內(nèi)容不管,作為沒有意義的字符插在腳本塊之間。有必要說明一下的是,其實被解析的內(nèi)容還不止這些,<!--#include ***-->類的服務器端包含文件也是由引擎包含進來并加以處理的。如果你讀的程序比較多,你還會知道有的runAt屬性標注為"Server"的<object>對象也是會被處理的,這里不做深入討論。 3、引擎執(zhí)行腳本塊中的腳本,這些服務器端的腳本是作為一個整體被執(zhí)行的,也就是說,可以寫出如下的代碼: 代碼如下: <% Dim i For i=1 to 5 %> Hello World! Next %> 引擎并不會將這些腳本塊分開解析,而使兩個腳本塊都發(fā)生語法錯誤。所以我們得到如下結(jié)論:并非所有非服務器腳本的代碼都會被發(fā)送到客戶端,有可能這段非服務器腳本的代碼被腳本塊限制了。服務器是一定不會操心客戶端腳本的執(zhí)行問題的,但是可以通過服務器端的腳本輸出不同的客戶端腳本。
4、最終引擎產(chǎn)生了一個文本流,或者說是腳本的執(zhí)行結(jié)果,可以認為這是一個字符串,就是發(fā)送到客戶端瀏覽器的網(wǎng)頁的代碼??蛻舳藶g覽器將頁面顯示出來,此時頁面的源代碼(源文件)是不包含服務器端的腳本的,但包含了服務器端腳本的執(zhí)行結(jié)果(這是顯然的)。 <% … %> 與 <script runat="server">…</script> 它們都是服務器端的腳本,同時被處理執(zhí)行。他們執(zhí)行時是作為一個整體的。 <% … %> 與 <script language="…">…</script> 前者是服務器端腳本,后者是客戶端腳本。前者先執(zhí)行,后者后執(zhí)行。 其實也不盡然,二者的腳本是有可能在同時被執(zhí)行的,但空間不同,仍然是:前者在服務器上執(zhí)行,后者在客戶端瀏覽器里執(zhí)行。前者在邏輯上一定提前于后者執(zhí)行。同時我們也得到結(jié)論:在同一個頁面的執(zhí)行中,客戶端腳本無論如何不能反饋給服務器端腳本,也就是說,客戶端瀏覽你的留言本并且提交新留言或者是任何客戶端腳本獲取的值都不可能在同一次服務器響應中被處理。 關于組件的調(diào)用 注意服務器端腳本和客戶端腳本都是腳本,自然都可以創(chuàng)建xmlhttp組件、ADODB.Connection組件等,但是并不是放在哪里都可以的。 xmlhttp如果用于服務器的抓取網(wǎng)頁(比如采集)就要在服務器腳本里創(chuàng)建了,而如果是用于客戶端的ajax無刷新而后臺訪問服務器端的頁面,那么就是運行于客戶端的了,自然在客戶端創(chuàng)建。 ADODB.Connection組件用于訪問數(shù)據(jù)庫,一般來說在服務器端創(chuàng)建,畢竟是服務器端的asp程序在跑數(shù)據(jù)庫的數(shù)據(jù),但如果你的數(shù)據(jù)庫真的是在客戶端連接的,那么就毫無疑問在客戶端腳本里創(chuàng)建了。 總之,矛盾著的事物及其每一個側(cè)面各有其特點。不同事物有不同的矛盾;同一事物在發(fā)展的不同過程和不同階段上有不同的矛盾;同一事物中的不同矛盾、同一矛盾的兩個不同方面各有其特殊性(看不懂的可以略去不看……)。這一原理要求我們堅持具體問題具體分析原則,在矛盾普遍性原理的指導下,具體分析矛盾的特殊性,并找出解決矛盾的正確方法。反對千篇一律地采用一種方法解決不同事物的矛盾?!耙话谚€匙開一把鎖,到什么山唱什么歌”講的就是這個道理。 服務器端VBscript腳本創(chuàng)建對象使用Server.createObject(className)方法,客戶端VBscript腳本創(chuàng)建對象使用createObject(className)方法。 典型錯誤 代碼如下: <% Function TSize(b) '這是我自定義的函數(shù) TSize="中國" end function %> <a href="javascript:<%TSize('變量')%>">點這里要使用我定義的函數(shù)</a> 錯誤分析: 混淆了服務器端腳本和客戶端腳本的區(qū)別。實際執(zhí)行時我們會發(fā)現(xiàn),客戶端根本沒有收到什么TSize之類的代碼,因為TSize是服務器端的程序,被引擎處理之后(注意引擎對于函數(shù)的處理,純粹是給服務器端腳本調(diào)用的,不會發(fā)回到客戶端)就消失了,不可能在客戶端起作用。這就是說,客戶端腳本無法直接調(diào)用服務器端腳本的函數(shù)。 前面已經(jīng)說過了,服務器端腳本在邏輯上是提前于客戶端腳本的執(zhí)行的,因此這樣的代碼是可行的: 代碼如下: <% Dim i For i=1 to 5 Response.Write "<script type=""text/javascript"">alert('Hello World!" & i & "')</script>" Next %> 該文章在 2022/6/21 16:49:58 編輯過 |
關鍵字查詢
相關文章
正在查詢... |