六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

ASP 3.0高級編程(14)

[摘要]4.3.3 執(zhí)行其他的網(wǎng)頁 ASP 3.0和IIS 5.0的新特性之一就是引入了可編程的服務器端重定向(server-side redirection)的概念。這意味著,可以把一個網(wǎng)頁的控制和執(zhí)行轉(zhuǎn)到另外一個網(wǎng)頁,而不需要在客戶端使用Response.Rdedirect方法。1. 客...
4.3.3 執(zhí)行其他的網(wǎng)頁
       ASP 3.0和IIS 5.0的新特性之一就是引入了可編程的服務器端重定向(server-side redirection)的概念。這意味著,可以把一個網(wǎng)頁的控制和執(zhí)行轉(zhuǎn)到另外一個網(wǎng)頁,而不需要在客戶端使用Response.Rdedirect方法。
1.  客戶端重定向帶來的問題
ASP編程人員通常使用Response.Redirect語句把一個頁面載入到當前正在執(zhí)行的網(wǎng)頁。然而,許多人沒有意識到這條語句不會自動地使服務器立即裝入和執(zhí)行新的網(wǎng)頁。其真正做的是把一個HTTP重定向報頭(redirection header)增加到由Web服務器發(fā)送給客戶的輸出流中。這個報頭如下:
HTTP/1.1 302 Object Moved
Location newpage.asp
在這個報頭中的標準HTTP狀態(tài)信息“302 Object Moved”,告知瀏覽器所要求的資源已經(jīng)發(fā)生移動。Location報頭提供相應的網(wǎng)頁地址。當然這個地址不一定是真實的,現(xiàn)在正在做的事情就是“欺騙”瀏覽器,使瀏覽器認為可在另一個位置上找到所需要的網(wǎng)頁。實際發(fā)生的是,服務器將執(zhí)行所請求的網(wǎng)頁,但是通知瀏覽器需要的網(wǎng)頁已經(jīng)發(fā)生移動。這就是在發(fā)送任何頁面的內(nèi)容到瀏覽器之前必須執(zhí)行Redirect方法的原因。
當一個瀏覽器接受到“302 Object Moved”信息時,中斷當前的請求并為Location值中指定的網(wǎng)頁發(fā)送一個新的請求。這與在網(wǎng)頁的<HEAD>段使用一個META HTTP-EQUIV標記時的工作方式相同,前面給出的HTTP報頭還可寫為:
<META HTTP-EQUIV=”REFRESH” CONTENT=”0;URL=newpage.asp”>
因此重定向?qū)嶋H上發(fā)生在客戶機端,而不是在服務器上。如果在這個連接的客戶端有一個代理服務器在使用的話,可能會引起顯示虛假消息。這就是在使用Response.Redirect時,“The object you requested has been moved and can be found here”消息經(jīng)常在客戶機上顯示的原因,正確地使用緩沖通常可以防止這個問題。
在IIS 4.0或更早的版本中使用Response.Redirect時,應該在ASP網(wǎng)頁的開頭打開緩沖,然后在執(zhí)行Response.Redirect方法之前調(diào)用Response.Clear。當然,在ASP 3.0中網(wǎng)頁緩沖的缺省狀態(tài)為打開,因此這不成問題。只要在執(zhí)行該語句之前使用Response.Clear,以前產(chǎn)生的輸出將不會發(fā)送給客戶。
2.  在ASP 3.0中服務器端的重定向
在ASP 3.0和IIS 5.0中,在幾乎所有情況下,通過使用兩個新的Server對象方法Execute和Transfer,可以避免使用客戶端重定向。這兩個方法使控制立即轉(zhuǎn)到另一個網(wǎng)頁,該網(wǎng)頁可以是一個ASP網(wǎng)頁或者是任何其他的資源,例如一個HTTP網(wǎng)頁、壓縮文件或其他類型的文件。
它們之間的不同之處是:Execute方法“調(diào)用”另一個的網(wǎng)頁,與在腳本代碼中調(diào)用一個子程序或函數(shù)非常相似。當另一個網(wǎng)頁或資源已經(jīng)執(zhí)行完畢或傳送到客戶端時,控制返回到原網(wǎng)頁中調(diào)用Execute方法的語句的下一條語句,并繼續(xù)執(zhí)行。而使用Transfer方法時,控制不再返回到原頁面中,在控制傳送到的網(wǎng)頁或資源的末尾處,執(zhí)行過程停止。
當前網(wǎng)頁的環(huán)境也傳送給了目標網(wǎng)頁或資源,因此這兩個方法更有用。網(wǎng)頁環(huán)境包含了原有的ASP對象中的所有變量的值,例如Request、Response和Session對象的集合以及它們的所有屬性。即使該網(wǎng)頁不在同一個虛擬應用程序中,也將傳送Application對象的環(huán)境。
結(jié)果是瀏覽器認為它仍在接收原先的頁面,它并不了解服務器所做的事情。瀏覽器的地址欄一直顯示相同的URL,并且Back、Forward和Refresh按鈕正常地工作。在使用客戶端重定向時,尤其是使用HTML META元素時,情況通常不是這樣的。
傳送到新的頁面或資源的環(huán)境包括所有現(xiàn)存的事務狀態(tài)(transaction state)。當前網(wǎng)頁的環(huán)境用ASP的ObjectContext對象(在第1章中已經(jīng)討論過)進行封裝。如果需要將這個對象作為一個正在進行的事務的一部分,可以在傳送控制的目的頁面中使用這個對象。
(1)    Server對象的Execute和Transfer方法的使用
在前面的示例頁面中,可以試驗使用Excute和Transfer方法。該頁面包含了在示例中已經(jīng)提供的另一個文件名字another_page.asp,它作為這兩個方法的缺省參數(shù)值,如圖4-13所示:

圖4-13  使用Execute和Transfer方法的屏幕
單擊Server.Execute和Server.Transfer方法的按鈕,提交到此窗體并重新裝載該窗體。在這個頁面頂部的腳本代碼查看是哪個按扭被單擊。如果是cmdExecute或cmdTransfer按鈕,則把當前網(wǎng)頁的路徑寫入到輸出流中,然后調(diào)用相應的方法,并傳送與該按鈕相聯(lián)系的文本框中的值,然后再把當前頁面的路徑寫到輸出流中。

If Len(Request.Form("cmdExecute")) Then
   strPath = Request.Form("txtExecPath")
   Response.Write "Currently executing the page: <B>" _
                  & Request.ServerVariables("SCRIPT_NAME") & "</B><BR>"
   Server.Execute (strPath)
   Response.Write "Currently executing the page: <B>" _
                  & Request.ServerVariables("SCRIPT_NAME") & "</B><BR>"
End If

If Len(Request.Form("cmdTransfer")) Then
   strPath = Request.Form("txtTransferPath")
   Response.Write "Currently executing the page: <B>" _
                  & Request.ServerVariables("SCRIPT_NAME") & "</B><BR>"
   Server.Transfer (strPath)
End If

當單擊Server.Excute方法的按鈕時,會看到當前頁面的路徑,這是由上面代碼中的第一條Response.Write語句創(chuàng)建并顯示的。后面接著的內(nèi)容是來自被執(zhí)行的網(wǎng)頁(another_page.asp)的一些輸出內(nèi)容。在這之后是第二個Response.Write語句的輸出內(nèi)容,這表明控制又回到了原先的網(wǎng)頁,屏幕如圖4-14所示:

       圖4-14  Server.Excute方法的演示
頁面的兩條水平線之間的段落(顯示當前執(zhí)行的網(wǎng)頁為show_server.asp)來自原先的網(wǎng)頁。在接下來的段落來自被執(zhí)行的網(wǎng)頁another_page.asp。下面是該頁面的完整代碼:
<%@ LANGUAGE=VBSCRIPT %>
<HR>
Currently executing the page: <B>another_page.asp</B><BR>
However the value of <B>Request.ServerVariables("SCRIPT_NAME")</B> is still <BR>
<B><% = Request.ServerVariables("SCRIPT_NAME") %></B>
because the <B>Request</B> collections hold<BR>
the same values as they had in the page that executed this one.<BR>

<FORM ACTION="<% = Request.ServerVariables("HTTP_REFERER") %>" METHOD="POST">
<INPUT TYPE="SUBMIT" NAME="cmdOK" VALUE="&nbsp;&nbsp;&nbsp;">
&nbsp; Return to the previous page<P>
</FORM>
<HR>
注意,該頁面執(zhí)行時,不能使用Request.ServerVariables(“SCRIPT_NAME”)獲取它的路徑,因為環(huán)境仍然是原網(wǎng)頁的。我們不得不把頁面名作為文本寫入,因為實在沒有辦法可以從ASP環(huán)境中直接獲取。
這里包括了一個返回前一個網(wǎng)頁的按鈕的原因是,通過在主網(wǎng)頁中單擊相對應的按鈕,可以使用Server.Transfer方法調(diào)用這個頁面。這次看到了完全相同的輸出,只是沒有第二次路徑輸出,因為是“傳送”這個頁面而不是“執(zhí)行”該頁面,所以控制不會回傳給原先的網(wǎng)頁,如圖4-15所示:

圖4-15  Server.Transfer的演示
(2)    從ASP執(zhí)行SSI網(wǎng)頁
目前有了一個方法,如果需要的話可在ASP網(wǎng)頁中成功地使用SSI指令。雖然這種要求不常出現(xiàn),但可實現(xiàn)。過去的問題是,由于在SSI網(wǎng)頁(文件擴展名是.stm、.shtml和.shtm)中不能包含ASP代碼,所以程序不能“無縫”地重定向回到原先的網(wǎng)頁,必須增加一個按鈕或鏈接,以裝載原先的或另外的ASP網(wǎng)頁。
現(xiàn)在,由于有了Server.Execute方法,可以執(zhí)行一個SSI網(wǎng)頁并且將控制自動返回到原先的網(wǎng)頁,客戶端意識不到這些過程正在進行。客戶端只是看到原先的ASP網(wǎng)頁和執(zhí)行結(jié)果。來自于SSI網(wǎng)頁的任何輸出都“無縫”地插入到流中。當然,如果在SSI網(wǎng)頁完成后,不想使原先的網(wǎng)頁繼續(xù)執(zhí)行,可以使用Server.Transfer方法。
為了看到這個技術(shù)的執(zhí)行,把前面使用過的CGI-SSI例子網(wǎng)頁的虛擬路徑輸入到Server.Excute方法(或Server.Transfer方法)的文本框中。這個路徑是“../ssi_cgi/ssi_cgi.stm”。在單擊按鈕對Execute或Transfer方法進行調(diào)用以后,將看到.stm網(wǎng)頁已經(jīng)執(zhí)行,其中有SSI指令的結(jié)果。在來自ssi_cgi.stm的內(nèi)容之后出現(xiàn)的是原先的網(wǎng)頁的其余部分,雖然在圖4-16中看不到,但可通過滾動條看到該內(nèi)容。

圖4-16  執(zhí)行Server.Excute方法后的屏幕
3.  SSI #exec指令的不足
遺憾的是Execute和Transfer方法一般不能與SSI的#exec指令一起工作,因為包含這個指令的.stm網(wǎng)頁會在調(diào)用它的ASP網(wǎng)頁的環(huán)境中運行。在大多數(shù)情況下,它需要運行于直接引用該網(wǎng)頁的一個獨立的環(huán)境中。
存在這樣的限制真是遺憾,如果沒有這種限制,我們通過Server.Execute執(zhí)行的網(wǎng)頁可以“不可見地”包含來自于ASP網(wǎng)頁的#exec指令。對前面的通過net stop和net start命令停止和啟動Indexing Service的示例來說,它可能是一種理想的解決方案。
但是,我們必須求助于老的和已經(jīng)驗證的方法。當用戶單擊一個按鈕時,簡單地使用Response.Redirect方法來打開相關(guān)的網(wǎng)頁:
<%
‘Look for a command sent from the FORM section buttons
If Len(Request.Form(“cmdStop”)) Then
       Response.Redirect(“exec/stop_cisvc.stm”)
End If

If Len(Request.Form(“cmdStart”)) Then
       Response.Redirect(“exec/start_cisvc.stm”)
End If
%>
可以試著把使用#exec指令的一個SSI網(wǎng)頁的虛擬路徑輸入到示例頁面的Server.Execute和Server.Transfer方法的文本框中。前面使用過的#exec示例的虛擬路徑是“../ssi_cgi/exe/start_cisvc.stm”和“../ssi_cgi/exec/stop_cisvc.stm”。





主站蜘蛛池模板: 中文字幕在线视频不卡 | 婷婷六月天在线 | 日产精品卡二卡三卡四卡乱码视频 | 日韩欧美中字 | 人人干在线 | 天天曰夜夜曰 | 亚洲国产成人久久笫一页 | 亚洲成av人影片在线观看 | 特级淫片欧美高清视频蜜桃 | 色在线网| 日本欧美色 | 一级毛片一级毛片一级毛片一级毛片 | 网站在线观看mv视频 | 五月综合激情久久婷婷 | 中文有码中文字幕免费视频 | 日本高清不卡免费 | 人人爽天天碰天天躁夜夜躁 | 五月天久久婷婷 | 婷婷网五月天天综合天天爱 | 亚洲 欧美 日韩 另类 | 亚洲国产欧洲精品路线久久 | 欧美性猛交乱大交xxxx | 天堂综合 | 午夜高清在线观看免费6 | 日本综合欧美一区二区三区 | 青草伊人网 | 色综合久久五月 | 色成人亚洲| 日本五级床片全部免费午夜 | 日韩欧美小视频 | 一级淫片免费看 | 欧美综合另类 | 在线人成精品免费视频 | 桃花视频在线观看免费迅雷 | 青青在线视频免费观看 | 欧美一卡二卡3卡4卡无卡六卡七卡科普 | 日韩第一页在线 | 又爽又黄无遮挡高清免费视频 | 亚洲人成网站在线观看播放 | 手机看片福利盒子久久青 | 午夜大片免费完整在线看 |