ASP系列講座(十二)傳送內容
作者:Eve Cole
更新時間:2009-05-30 19:59:00
在處理ASP 腳本時,任何沒有包含在ASP 定界符或<SCRIPT> 標籤中的文字或圖形都會簡單地傳回給瀏覽器。可以透過使用Response 物件顯示地把內容傳送給瀏覽器。
傳送內容要將內容從ASP 定界符內部或程序傳送給瀏覽器,可以使用Response 物件的Write 方法。例如,下面的語句可以根據使用者是否造訪過此頁而發送不同的問候語:
<%
If FirstTime = True Then
Response.Write "<H3 ALIGN=CENTER>Welcome to the Overview Page</H3>"
Else
Response.Write "<H3 ALIGN=CENTER>Welcome Back to the Overview Page</H3>"
End If
%>
在流程外部,不必使用Response.Write 將內容送回使用者。不在腳本定界符內部的內容直接傳送給瀏覽器,瀏覽器將其格式化和顯示。例如,下面的腳本過程與上面的腳本輸出相同:
<H3 ALIGN=CENTER>
<% If FirstTime Then %>
Welcome to the Overview Page.
<% Else %>
Welcome Back to the Overview Page.
<% End If %>
</H3>
當您只需要將輸出傳回一次或很方便地在現有HTML 文字中加入語句時,可使用混合腳本指令和HTML。當您不想用定界符號分隔一條語句或當您想要建立傳回給瀏覽器的字串時,可使用Response.Write。例如,可建立一個文字的字串,用從一個HTML 表送回的值建立表格的一行:
Response.Write "<TR><TD>" & Request.Form("FirstName") _
& "</TD><TD>" & Request.Form("LastName") & "</TD></TR>"
設定內容的類型當Web 伺服器將檔案傳回瀏覽器時,會同時告訴瀏覽器檔案中包含的內容的類型。這使瀏覽器能夠決定是否它能自行顯示檔案或必須呼叫另一個應用程式。例如,如果網頁伺服器傳回Microsoft Excel 表格,則瀏覽器必須呼叫Microsoft Excel 的副本顯示此頁。 Web 伺服器透過將檔案的副檔名對應到MIME 類型表來識別檔案類型。
可以使用Response 物件的ContentType 屬性為傳送給使用者的內容設定HTTP 內容類型字串。例如,下面的命令為通道定義設定內容類型:
<% Response.ContentType = "application/x-cdf" %>
有關通道的詳細信息,請參閱本主題中的「建立動態通道」。
其他的通用內容類型是text/plain(用於作為文字內容傳回而不是已解釋的HTML 語句)、text/gif(用於GIF 影像)和video/quicktime(用於Apple QuickTime® 格式的影片)。一套標準的MIME 類型已經定義,另外,Web 伺服器或Web 瀏覽器都支援MIME 類型。若要查看您的Microsoft Web 伺服器支援哪些內容類型,可使用Internet 服務管理員開啟您的Web 網站的屬性頁,按一下「HTTP 標題」選項卡,然後按一下「檔案類型」標籤。
重定向瀏覽器用Redirect 方法可將瀏覽器重新導向到另一個URL,而不是將內容傳送給使用者。例如,如果您想確認用戶是否已從主頁進入了您的應用程序,以便能收到一個客戶ID,則可以檢驗他們是否有客戶ID 號;如果沒有,就可以將其重定向到主頁。
<%
If Session("CustomerID") = 0 Then
Response.Redirect "homepage.asp"
End If
%>
除非緩衝區已經打開,否則,在任何內容或標題傳回瀏覽器之前,您必須重新導向瀏覽器。將Response.Redirect 語句放在頁的頂部和<HTML> 標記之前可確保沒有任何內容回傳給瀏覽器。如果在傳回給瀏覽器的內容或標題後使用Response.Redirect,將會看到一個錯誤訊息。
如果在頁的中間使用Response.Redirect,請將其與Response.Buffer 屬性一起使用,下面的部分將進行解釋。
緩衝內容預設情況下,Web 伺服器會傳回HTML 和在處理ASP 頁時的腳本處理結果。但是,您可以設定Response 物件的Buffer 屬性以便在向使用者發送任何內容之前,先處理頁面上的所有的伺服器腳本命令。
可以使用緩衝技術來確定在頁處理過程中的某個點,而您並不想將該點之前的內容傳送給使用者。也可以用Response 物件的Redirect 方法將使用者重新導向到另一頁,或用Response 物件的Clear 方法清除緩衝區並將不同的內容傳送給使用者。下面的例子使用了以上兩種方法。
<%
'Turn on buffering. This statement must appear before the <HTML> tag.
Response.Buffer = True %>
<html>
<body>
.
.
.
<%
If Request("FName") = "" Then
Response.Clear
Response.Redirect "/samples/test.html"
Else
Response.Write Request("FName")
End If
%>
</body>
</html>
也可以使用Response.Buffer 避免Web 伺服器在腳本修改HTTP 標題之前將其傳回。有些屬性和方法,例如Response.Expires 和Response.Redirect 可修改HTTP 標題。
當在腳本中設定Buffer 屬性並且沒有呼叫Flush 方法時,伺服器將保持使用者發出的Keep-Alive 請求。養成這樣的腳本編寫習慣有益於提高伺服器的效能,因為,伺服器不必為每個使用者請求創建新的連線(假定伺服器、使用者和任何代理伺服器都支援Keep-Alive 要求)。但是,這種方法的一個潛在的不利因素是:在使用者處理完目前的asp 檔案的所有的腳本之前,緩衝區不顯示任何回應給使用者。對於較長的和較複雜的腳本,用戶可能要被迫等待很長一段時間才能看到這一頁。
預設情況下,緩衝區對於ASP 應用程式是關閉的。可以使用Internet 服務管理員為整個ASP 應用程式開啟緩衝區。
允許代理伺服器快取頁通過代理伺服器,應用程式可以發送頁給使用者。代理伺服器取代使用者瀏覽器從Web 網站請求網頁。代理伺服器快取HTML 頁以便相同頁面的重複請求能夠快速有效地傳回瀏覽器。代理伺服器執行請求並快取網頁,並減輕網路和Web 伺服器的負荷。
儘管快取對HTML 頁都能很好地運行,但對包含動態產生資訊的ASP 頁則不盡人意。例如,報告股市行情或顯示大量業務的存貨清單需要提供即時資訊。一小時前的資訊對目前來講是很不準確的。如果應用程式傳回個人的訊息,例如,自訂的主頁,希望使用者不能看到另一個使用者的個人資訊。
預設情況下,ASP 命令代理伺服器本身無法快取ASP 頁(儘管快取影像、點陣圖、小型應用程序,和其他快取頁上的參考項目)。可以使用Response.CacheControl 屬性設定快取控制HTTP 標題欄位允許快取某一頁。 Response.CacheControl 的預設值是字串"Private",它避免代理伺服器快取此頁。若要允許緩存,可將快取控制標題欄位設為Public:
<% Response.CacheControl = "Public" %>
因為在任何頁面的內容被傳送之前,HTTP 標題必須被送到瀏覽器或代理伺服器,所以,可在任何HTML 標記之前設定Response.CacheControl 屬性或使用Response.Buffer 快取此頁。
快取控制標題欄位是HTTP 1.1 規格的一部分。在只支援HTTP 1.0 的代理伺服器上不能快取ASP 頁,因為沒有到期的標題欄位發送。
避免瀏覽器快取頁每個瀏覽器版本都有它自己的規格來規定是否快取頁。若要避免瀏覽器快取ASP 頁,可使用Response.Expires 設定到期標題:
<% Response.Expires = 0 %>
值為0 強迫快取頁到期。因為在任何頁面被傳送之前,HTTP 標題必須被送給瀏覽器,所以可透過將Response.Expires 屬性放在HTML 標記之前或使用Response.Buffer 快取該頁。
建立動態通道
Internet Explorer 4.0 有一個新的特性,Web 規劃人員可以使用該屬性將帶有公用主題的Web 頁併入一個通道。在瀏覽器中,通道被顯示在通道標題列上;使用者透過點擊圖示存取通道。通道會在背景自動更新;使用者不必造訪網站就可以在自己的瀏覽器上下載最新的頁面。通道為使用者提供了一條瀏覽一組相關的Web 頁的快速而直接的渠道,並且這些Web 頁是自動更新的。
使用ASP,可以編寫腳本來收集使用者的首選項,然後動態地建立通道。通道定義檔(.cdf) 建立了通道內容的組織和順序。在.cdf 檔案中的指令使用與HTML 標記相同的語法,以便於掌握和從腳本中產生。在編寫ASP 腳本來建立通道定義檔時,腳本用.cdx 副檔名。當ASP 讀取以.cdx 為副檔名的檔案時,將自動傳送application/x-cdf 內容類型,它告訴瀏覽器用通道定義來解釋位元組。如果不使用.cdx 作為副檔名,則腳本必須以Response.ContentType 手動將內容類型設為application/x-cdf。
下面是一個有關如何使用通道的範例。下面的HTML 表格要求使用者選擇通道。提交時,該表格會呼叫.cdx 檔案的腳本去建立通道的定義。
<P> Choose the channels you want. </P>
<FORM METHOD="POST" ACTION="chan.cdx">
<P><INPUT TYPE=CHECKBOX NAME=Movies> Movies
<P><INPUT TYPE=CHECKBOX NAME=Sports> Sports
<P><INPUT TYPE="SUBMIT" VALUE="SUBMIT">
</FORM>
Chan.cdx 中的腳本根據與請求一起提交的表格的值建立通道定義。
<% If Request.Form("Movies") <> "" Then %>
<CHANNEL>
channel definition statements for the movie pages
</CHANNEL>
<% End If %>
<% If Request.Form("Sports") <> "" Then %>
<CHANNEL>
channel definition statements for the sports pages
</CHANNEL>
<% End If %>
向伺服器發送文件瀏覽器可以使用Posting Acceptor 應用程式將文件傳送給Web 伺服器。當Posting Acceptor 上載檔案時,將會傳送列出每一個收到的檔案名稱和位置的URL-encoded 表格欄位。可以將郵遞處理的URL 新增到腳本中,此腳本上載檔案去呼叫ASP 腳本來處理這些欄位名稱。例如,可以編寫一個腳本,自動地透過文件的名稱和位置發送e-mail 給系統管理員。