編程|進階 4.3.5 擷取Server對象的路徑資訊
在對儲存在Web網站上的檔案進行操作時,需要獲得檔案的實際的實體路徑,而不是使用虛擬路徑或URL,儘管在其他網頁中能用它們正常地定位檔案。下一章中有一個例子,它使用FileSystemObject對Web網站的InetPub\WWWRoot檔案夾中的檔案進行讀寫。當建立自己的定製組件或者使用商業化的組件對檔案系統進行訪問時,經常需要為其提供一個檔案的實體路徑。
Server對象的MapPath方法
可以從Request.ServerVariables集合中提取HTTP前序變數,它們包含了當前檔案的實體路徑(在DOCUMENT_NAME和PATH_TRANSLATED前序中)。Server對象提供了一個方法MapPath,可以使用這個方法對我們能夠提供一個有效虛擬路徑的任何檔案提取相應的實體路徑。可以在已經使用過的樣本網頁中看到使用MapPath方法,並可實驗使用該方法。
如圖4-24所示,在頁面的底部的Miscellaneous Methods部分,有一個按鈕執行Server.MapPath方法,並提供給它靠近該按鈕的文字框中的值。在該網頁的原始碼中已經把這個值設定為“/iishelp/default.htm”,這個檔案應該自動地安裝在電腦上。也可以輸入另一個網頁的URL。
圖4-24 使用Server.MapPath的螢幕
單擊該按鈕重新裝載這個網頁,執行該方法並在頂部顯示結果,在下部顯示原頁面的其餘部分,如圖4-25所示:
圖4-25 顯示Server.MapPath的結果
(1) 樣本網頁代碼的功能
處理這個過程的代碼是與前面在相似的樣本檔案中已經使用過的代碼十分相似。
在該頁面頂部的ASP指令碼地區中,對單擊的按鈕的名字進行檢查。在這種情況下,該按鈕的名字將是cmdMapPath,簡單地把相匹配的文字框中的值txtMapPath傳送給Server.MapPath方法,並顯示得到的結果:
If Len(Request.Form(“cmdMapPath”)) Then
StrValue = Request.Form(“txtMapPath”)
Response.Write “<B>Results:</B><BR>Server.MapPath (“ & QUOT & strValue _
& QUOT & “ ) returned <B>” & QUOT & Server.MapPath(strValue) _
& QUOT & “</B><HR>”
End If
(2) MapPath和虛擬應用程式目錄
注意,MapPath方法為/iishelp/default.htm檔案擷取的結果在Web伺服器目錄外,並在主winnt目錄的help目錄中。這清楚地證明了MapPath方法是非常有用的。
對於在預設的Web網站目錄中的檔案,其URL的路徑部分與實體路徑通常是相同的。例如,一個檔案儲存體在Web伺服器上:
c:\InetPub\WWWRoot\yourfiles\thisfile.asp
如果安裝時已經在預設目錄中安裝了的Web根目錄,則URL如下:
http://yoursite.com/yourfiles/thisfile.asp
然而,IIS Help檔案安裝在預設Web網站目錄外的一個虛擬目錄中,所以用於對其進行訪問的URL和實體路徑之間沒有直接的關聯。只有通過使用Server.MapPath方法才能擷取真實的實體路徑。
4.3..6 使用Server對象格式化資料
當前面討論示範SSI指令的網頁的代碼時,碰巧遇到了使用HTML的一個老問題。在一個HTML網頁中如何顯示HTML代碼?如果“照現在的樣子”使用,也就是在相應的位置上使用所有的HTML字元,會被瀏覽器當作HTML解釋和執行。這樣當下列內容在瀏覽器中顯示時:
This is the syntax of a <TABLE> element:
將不會顯示文本<TABLE>,因為瀏覽器將其作為一個資料表的一個開始標記,並照此來執行。為了避免這種情況,必須把在HTML中非法或無效的所有字元轉換到等價的HTML字元實體(character entity)。多數常見的字元如表4-5所示:
表4-5 字元與等價的HTML實體的關係
字 符
等價的HTML實體
字 符
等價的HTML實體
<
<
>
>
&
&
“
"
©
©
®
®
所有的實體以&號開始並以分號結束,是在一些語言中表明一個實體的標準方法的一部分,這些語言是基於SGML(標準化常規標識語言)規則的,如HTML語言。
1. 數位HTML實體等價字串
注意最後一個例子,已經註冊的商標®是一個以“#”字元為首碼的數字值,而不是相應含義的一個文本縮寫(如copy對應著作權符號©)。具有一個大於126的ANSI代碼值的所有字元在HTML中被表示為十進位字元的ANSI代碼,以&#為首碼,以分號為尾碼。
事實上,需要留心的是使用數字實體等價字串要優先於一些較少被支援文本實體字串。一個例子是商標字元(™),該字元的實體等價字串為“™”但不是所有瀏覽器(例如Navigator)都能識別這個字串,這種情況下,將在網頁中顯示該實體字串。相反,使用™在所有瀏覽器中都能很好地工作。
2. Server對象的HTMLEncode方法
把HTML轉換為文本是進行有效顯示需要的,否則HTML會被瀏覽器當成HTML來對待和執行,這意味著必須對無效的字元進行編碼,使其成為等價的HTML實體字串。為管理這種轉換,Server對象提供了HTMLEncode方法。可以在本書提供的ASP Server Object樣本網頁中練習使用這個方法。
簡單地把一些文本輸入到HTMLEncode對應的文字框中並單擊按鈕。樣本中提供了一些真實的HTML作為預設的文本,如圖4-26所示:
圖4-26 使用HTMLEncode方法的螢幕
重新載入該頁面時,在該頁面的頂部顯示結果。HTMLEncode方法把角括弧轉換成了“<”和“>”,而且把雙引號轉換成為“";”,如圖4-27所示:
圖4-27 使用HTMLEncode方法1
(1) 樣本網頁代碼的功能
關於得到的結果,有幾個有趣的地方。
首先,在方法名字後面的括弧中已經丟掉了<B>和</B>標記,相應增加了一個粗體文本部分。在網頁中顯示原有的值時,<B>和</B>被當成HTML提交了,所以<B>和</B>標記消失了,相關內容以粗體文本顯示。
可以十分容易地避免這種情況。事實上,這就是設計HTMLEncode方法的原因。原範例程式碼如下:
…
Response.Write “Server.HTMLEncode (“ & QUOT & strValue & QUOT & “) returned”
…
現在所能做的就是把HTMLEncode方法應用於正在輸出的值上:
…
strResult = Server.HTMLEncode(strValue)
Response.Write “Server.HTMLEncode (“ & QUOT & strResult & QUOT & “) returned”
現在輸出了一個十分有用的結果,如圖4-28所示:
圖4-28 使用HTMLEncode方法的結果2
現在已經解決了不提交HTML而顯示HTML的問題。但是如果要在HTML中顯示HTMLEncode方法的結果,而又不提交和處理這些結果,又會發生什麼情況?為瞭解決這個問題,要從HTMLEncod