台灣最大程式設計社群網站
線上人數
501
 
會員總數:245463
討論主題:189220
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> 參數間在各種環境下的傳遞
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
參數間在各種環境下的傳遞
價值 : 0 QP  點閱數:2244 回應數:0

樓主

站務人員 站長
門外漢
0 1580
542 9
發送站內信

捐贈 VP 給 站務人員
傳送內容到瀏覽器

ASP 網頁中的指令接受處理時,任何不在 ASP 分隔字元或 <SCRIPT> 標記之間的文字或圖形都會被送回瀏覽器。 您也可以特意利用 Response 物件將內容傳送給瀏覽器。
傳送內容

如果要從 ASP 分隔字元內或者從程序中傳送內容到瀏覽器,請使用 Response 物件的 Write 方法。 例如,底下的陳述會根據使用者以前是否造訪過網頁,而傳送不同的歡迎訊息:
<%

If blnFirstTime 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 blnFirstTime 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>"

Request.Form 會傳回 HTML 表單傳送的值 (請參閱處理使用者輸入)。

注意事項 & 符號是 VBScript 的字串連結字元。 底線 (_) 是 VBScript 的指令行接續字元。



設定內容的類型

Web 伺服器將檔案傳回瀏覽器時,會告訴瀏覽器檔案內容的類型。
這樣瀏覽器才知道它是否能夠自己顯示檔案,或者需要呼叫另一個應用程式。
例如,如果 Web 伺服器傳回一個 Microsoft Excel 工作表,瀏覽器就必須能夠啟動 Microsoft Excel 以顯示頁面。
Web 伺服器辨識檔案類型時要將副檔名跟 MIME (多功能 Internet 郵件副檔名) 類型清單進行對照。
例如,如果要啟動 Microsoft Excel,瀏覽器需要認得 application/vnd.ms-excel MIME 類型。

您可以用 Response 物件的 ContentType 屬性,為您傳送給使用者的內容設定 HTTP 內容類型字串。 例如,下列指令會為頻道定義設定內容類型:

<% Response.ContentType = "application/x-cdf" %>

若需有關頻道的其他資訊,請參閱本主題中的建立動態頻道。

其他常見的內容類型有 text/plain (以文字形式而非解譯的 HTML 陳述式傳回的內容)、image/gif (GIF 影像)、image/jpeg (JPEG 影像)、video/quicktime (Apple QuickTime 格式的影片)、以及 text/xml (XML 文件)。 除此之外,Web 伺服器或者 Web 瀏覽器也可以支援自訂的 MIME 類型。 如果想看看您的 Microsoft Web 伺服器已經定義好的內容類型,請使用 Internet Information Services 嵌入式管理單元, 來開啟您的 Web 站台的內容頁,請按一下 [HTTP 標題] 索引標籤,然後按一下 [檔案類型] 索引標籤。 當您選擇以 ASP 自行設定內容類型時,可以用這些檔案類型作為參考。

重新導向瀏覽器

您可以不將內容傳送給使用者,而用 Redirect 方法將瀏覽器重新導向至另一個 URL。 例如,如果您希望使用者從首頁進入您的應用程式,讓他們接受一個客戶識別碼,可以檢查看看他們是否有客戶識別碼,如果沒有,便可以將他們重新導向至首頁。

<%

If Session("CustomerID") = "" Then

Response.Redirect "Register.asp"

End If

%>

伺服器端的指令會在任何內容被傳送給使用者之前被處理,這就是所謂的緩衝處理。 ASP 可以讓您開啟或關閉緩衝處理功能,這項設定會對 Redirect 方法的行為造成很大的影響。 尤其,如果您將緩衝處理功能關閉,就必須在您的頁面的 HTTP 標題傳回瀏覽器之前,重新導向瀏覽器。

請將 Response.Redirect 陳述式擺在頁面頂端,而且要擺在任何文字或 <HTML> 標記的前面,以確保不會有任何東西被傳回瀏覽器。 如果您在內容或標題被傳回瀏覽器之後使用 Response.Redirect,便會看到一個錯誤訊息。 此外要注意的是,Response.Redirect 後面不需要有 一個 Response.End。

如果您要從頁面中間使用 Response.Redirect,就要跟 Response.Buffer 屬性一起使用,一如本文中緩衝處理內容一節描述的那樣。

在 .ASP 檔案之間進行傳輸

用 Response.Redirect 重新導向瀏覽器需要來回傳輸 (round-trip),意思是說伺服器要傳送一個 HTTP 回應給瀏覽器,表明新 URL 的位置。 瀏覽器會自動離開伺服器的要求佇列,並為這個 URL 傳送一個新的 HTTP 要求。 然後伺服器會將這個要求跟其他同時到達的用戶端要求一起加入要求佇列中。 對於一個忙碌的 Web 站台來說,來回傳輸會浪費頻寬,降低伺服器的性能,尤其是當瀏覽器被重新導向到同一個伺服器上的檔案時。

您可以用 Server.Transfer 方法從一個 .asp 檔案傳輸到在同一個伺服器上的另一個檔案,而不是使用 Response.Redirect 方法。利用Server.Transfer,您可以直接為 .asp 檔案傳輸要求,而不必離開伺服器的要求佇列,這樣可以消除昂貴的來回傳輸代價。

例如,底下這個指令說明您可以怎樣利用 Server.Transfer,根據狀態資訊在應用程式的頁面之間跳躍:

<%

If Session("blnSaleCompleted") Then

Server.Transfer("/Order/ThankYou.asp")

Else

Server.Transfer("/Order/MoreInfo.asp")

End if

%>

Server.Transfer 會從一個執行中的 .asp 檔案傳送要求到另一個檔案。 傳輸進行期間,原先要求的 .asp 檔案會立刻終止執行,而不清除輸出緩衝區 (若需其他資訊,請參閱緩衝處理內容一節)。 當目的檔案開始執行時,便可以使用要求資訊。 執行進行期間,這個檔案跟原先提出要求的檔案一樣,可以存取原有的那些物件 (Request、Response、 Server、Session、以及 Application)。

您也可以用 Server.Transfer 在不同應用程式中的 .asp 檔案之間進行傳輸。 不過,當您傳輸到另一個應用程式中的 .asp 檔案時,檔案的行為會好像是起始傳輸動作的應用程式的一部分 (也就是說,檔案只能存取起始應用程式領域內的變數,而不是檔案實際所在處的應用程式的變數)。 例如,如果您從 Sales Application 中的一個檔案傳輸到 Personnel Application 中的一個檔案,Sales Application 實際上是從 Personnel Application 借用這個檔案,並將它當成是 Sales Application 的一部分來執行。

ASP 還提供 Server.Execute 指令,可以讓您用來傳輸到檔案、執行其內容、然後傳回起始傳輸的檔案。 如果您熟悉 VBScript,將 Server.Execute 看成是一種程序呼叫會很有幫助,不同的是,執行的不是程序,而是整個 .asp 檔案。

例如,底下的指令說明您可以怎樣利用 Server.Execute 以動態方式納入 .asp 檔案:
<%

.

.

.

If blnUseDHTML Then

Server.Execute("DHTML.asp")

Else

Server.Execute("HTML.asp")

End If

.

.

.

%>

只要目的檔案屬於同一個伺服器上的應用程式,發起的應用程式就會傳輸到這個檔案,執行其內容,然後恢復執行起始傳輸的檔案。 跟 Server.Transfer 一樣,被執行的 .asp 檔案的動作會有如發起應用程式的一部分。 不過,Server.Execute 不能跨伺服器使用。 若需其他資訊,請參閱 Server.Execute。

緩衝處理內容

根據預設,Web 伺服器會在處理頁面上的所有指令之後,才將內容傳送給使用者。 這種處理方式稱為緩衝處理。 您可以使用 Response 物件的 Buffer 屬性停用緩衝處理功能,使得 Web 伺服器在處理頁面時傳回 HTML 和指令的結果。

緩衝處理 .asp 檔案的好處是,萬一指令的處理進行不順利,或者某個使用者沒有適當的安全憑證,您便可以終止傳送 Web 網頁。 而改用 Server.Transfer 將使用者轉送到另一個頁面,或者清除緩衝區 (用 Response 物件的 Clear 方法)。 您可以在進行傳輸之前使用 Clear 方法,這要看您的應用程式而定。 以下的範例兩種方法都採用:
<HTML>

<BODY>

.

.

.

<%

If Request("CustomerStatus") = "" Then

Response.Clear

Server.Transfer("/CustomerInfo/Register.asp")

Else

Response.Write "Welcome back " & Request("FirstName") & "!"

.

.

.

End If

%>

</BODY>

</HTML>

您也可以用 Response.Buffer 防止 Web 伺服器在指令可以修改標題之前傳回 HTTP 標題。 有些屬性和方法,例如 Response.Expires 和 Response.Redirect,會修改 HTTP 標題。

如果指令中的 Buffer 屬性被設定為 TRUE,而沒有呼叫 Flush 方法將暫存的內容立即送到瀏覽器去,伺服器就會保存用戶端提出的「持續作用」(Keep-Alive) 要求。 用這種方式編寫指令的好處是可以改進伺服器的效能,因為伺服器不需要為各個用戶端要求建立一個新的連線 (假如伺服器、用戶端和任何 Proxy 伺服器都支援「持續作用」要求的話)。 不過,這種作法的一個潛在缺點是,緩衝處理會阻止伺服器的回應被傳送給使用者,直到伺服器完成整個指令的處理為止。 對於比較長或者比較複雜的指令,使用者可能要等久一點才能夠看到頁面。

ASP 應用程式預設是啟用緩衝處理功能。 您可以使用Internet Information Services 嵌入式管理單元, 將整個 ASP 應用程式的緩衝處理功能關閉。 若需其他資訊,請參閱設定 ASP 應用程式。

讓 Proxy 伺服器快取處理頁面

您的應用程式可能要透過一個 Proxy 伺服器傳送頁面給用戶端。 Proxy 伺服器會為用戶端瀏覽器向 Web 站台要求頁面。 Proxy 伺服器會快取處理 HTML 頁面,使得重複要求使用的頁面可以快速而且有效率地傳回瀏覽器。 讓 Proxy 伺服器處理要求和快取處理頁面,可以減少網路和 Web 伺服器的工作負荷。

雖然快取處理很適合用在很多 HTML 頁面上,卻往往不適用於含有經常要更新資訊的 ASP 網頁。 例如,提供股票行情、或者為高異動量的企業顯示庫存的頁面,都必須提供即時的資訊。 即使才出籠一個小時的資訊都可能已經不夠精確了。 如果您的應用程式會傳回個人化的資訊,例如自訂的首頁,就要確定使用者不會看到其他使用者的個人資訊。

根據預設,ASP 會要 Proxy 伺服器不要快取處理 ASP 網頁本身 (不過影像、影像地圖、applet 以及其他從頁面參照的項目都會被快取處理)。 您可以利用 Response.CacheControl 屬性來設定快取控制 HTTP 標題欄位,容許對某些頁面進行快取處理。 Response.CacheControl 的預設值是字串 "Private",可以防止 Proxy 伺服器快取處理頁面。 如果要容許快取處理,就要將快取控制標題欄位設定為 Public:
<% Response.CacheControl = "Public" %>

HTTP 標題必須在傳送任何頁面內容之前傳送給瀏覽器或 proxy 程式,因此您可以將 Response.CacheControl 屬性擺在任何 HTML 標記前面,或者如果您已經停用緩衝處理功能,就要用 Response.Buffer 來緩衝處理頁面。


快取控制標題欄位是 HTTP 1.1 規格的一部分。 ASP 網頁不會在只支援 HTTP 1.0 上的 proxy 伺服器上被快取處理,因為不會有「過期」(Expires) 標題欄位被送出去。

防止瀏覽器快取處理頁面

各個瀏覽器版本都各自有其是否要快取處理頁面的規則。 如果要防止瀏覽器快取處理 ASP 網頁,就要用 Response.Expires 來設定「過期」(Expires) 標題:

<% Response.Expires = 0 %>

數值 0 會迫使快取處理的頁面立即過期。 HTTP 標題必須在送出任何頁面內容之前送給瀏覽器,因此要將 Response.Expires 內容擺在任何 HTML 標記前面,或者緩衝處理頁面。

建立動態頻道

頻道是可以在 Microsoft Internet Explorer 4.0 或以後的版本上使用的一種 Web 技術,可以讓您用來自動傳送新的或者更新過的 Web 內容給使用者。 頻道可以排定讓使用者的電腦定期連線到伺服器去擷取更新的資訊。 (這種擷取處理通稱為用戶端拉取 (client pull) ,因為資訊是從伺服器「拉進來」或者說收集來的。) 當新的資訊可以從特定的 Web 站台取得時,內容就會被下載到瀏覽器的快取記憶體中,以便於離線閱覽。 善用頻道分送以 Web 為基礎的資訊 (尤其是在企業內部網路上),有助於將資訊集中化,而且可以減少伺服器的流量。 若需有關頻道的其他資訊,請到下列網址上的 Microsoft Internet Explorer 站台上去看看:http://www.microsoft.com/windows/ie/。

利用 ASP,您可以編寫指令,以產生一個頻道定義檔,以動態的方式建立頻道。 一個以 XML 為基礎的頻道定義檔 (.cdf) 描述了頻道內容的組織並更新排程。 .cdf 檔案中的指令採用類似 HTML 標記的語法,所以很容易學,也很容易從指令產生。 編寫伺服器端指令以建立頻道定義檔時,要以 .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>

<% End If %>

<% If Request.Form("Sports") <> "" Then %>

<CHANNEL>

運動頁面的頻道定義陳述式

</CHANNEL>

<% End If %>

以 WebDAV 存取伺服器資源

「分散式寫作和版本處理」(Distributed Authoring and Versioning, WebDAV) 是 HTTP 1.1 協定的一個強大的延伸功能,可以透過 HTTP 連線公開 Web 檔案儲存媒體,例如一個本機檔案系統。 WebDAV 很有可能使得 Web 成為一個天衣無縫的合作式寫作環境。 IIS 5.0 已經採用 WebDAV,您可以讓遠端的作者在您的 Web 伺服器上的檔案和目錄中建立、刪除、移動、搜尋或者套用屬性。 若需其他資訊,請參閱 WebDav 發行。

本篇文章發表於2001-01-15 00:00
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.