直播中
圖4-13 使用Execute和Transfer方法的屏幕
單擊Server.Execute和Server.Transfer方法的按鈕,提交到此窗體并重新裝載該窗體。在這個(gè)頁(yè)面頂部的腳本代碼查看是哪個(gè)按扭被單擊。如果是cmdExecute或cmdTransfer按鈕,則把當(dāng)前網(wǎng)頁(yè)的路徑寫(xiě)入到輸出流中,然后調(diào)用相應(yīng)的方法,并傳送與該按鈕相聯(lián)系的文本框中的值,然后再把當(dāng)前頁(yè)面的路徑寫(xiě)到輸出流中。
…
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
…
當(dāng)單擊Server.Excute方法的按鈕時(shí),會(huì)看到當(dāng)前頁(yè)面的路徑,這是由上面代碼中的第一條Response.Write語(yǔ)句創(chuàng)建并顯示的。后面接著的內(nèi)容是來(lái)自被執(zhí)行的網(wǎng)頁(yè)(another_page.asp)的一些輸出內(nèi)容。在這之后是第二個(gè)Response.Write語(yǔ)句的輸出內(nèi)容,這表明控制又回到了原先的網(wǎng)頁(yè),屏幕如圖4-14所示:
圖4-14 Server.Excute方法的演示
頁(yè)面的兩條水平線之間的段落(顯示當(dāng)前執(zhí)行的網(wǎng)頁(yè)為show_server.asp)來(lái)自原先的網(wǎng)頁(yè)。在接下來(lái)的段落來(lái)自被執(zhí)行的網(wǎng)頁(yè)another_page.asp。下面是該頁(yè)面的完整代碼:
<%@ 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=" ">
Return to the previous page<P>
</FORM>
<HR>
注意,該頁(yè)面執(zhí)行時(shí),不能使用Request.ServerVariables(“SCRIPT_NAME”)獲取它的路徑,因?yàn)榄h(huán)境仍然是原網(wǎng)頁(yè)的。我們不得不把頁(yè)面名作為文本寫(xiě)入,因?yàn)閷?shí)在沒(méi)有辦法可以從ASP環(huán)境中直接獲取。
這里包括了一個(gè)返回前一個(gè)網(wǎng)頁(yè)的按鈕的原因是,通過(guò)在主網(wǎng)頁(yè)中單擊相對(duì)應(yīng)的按鈕,可以使用Server.Transfer方法調(diào)用這個(gè)頁(yè)面。這次看到了完全相同的輸出,只是沒(méi)有第二次路徑輸出,因?yàn)槭恰皞魉汀边@個(gè)頁(yè)面而不是“執(zhí)行”該頁(yè)面,所以控制不會(huì)回傳給原先的網(wǎng)頁(yè),如圖4-15所示:
圖4-15 Server.Transfer的演示
(2) 從ASP執(zhí)行SSI網(wǎng)頁(yè)
目前有了一個(gè)方法,如果需要的話可在ASP網(wǎng)頁(yè)中成功地使用SSI指令。雖然這種要求不常出現(xiàn),但可實(shí)現(xiàn)。過(guò)去的問(wèn)題是,由于在SSI網(wǎng)頁(yè)(文件擴(kuò)展名是.stm、.shtml和.shtm)中不能包含ASP代碼,所以程序不能“無(wú)縫”地重定向回到原先的網(wǎng)頁(yè),必須增加一個(gè)按鈕或鏈接,以裝載原先的或另外的ASP網(wǎng)頁(yè)。
現(xiàn)在,由于有了Server.Execute方法,可以執(zhí)行一個(gè)SSI網(wǎng)頁(yè)并且將控制自動(dòng)返回到原先的網(wǎng)頁(yè),客戶端意識(shí)不到這些過(guò)程正在進(jìn)行??蛻舳酥皇强吹皆鹊腁SP網(wǎng)頁(yè)和執(zhí)行結(jié)果。來(lái)自于SSI網(wǎng)頁(yè)的任何輸出都“無(wú)縫”地插入到流中。當(dāng)然,如果在SSI網(wǎng)頁(yè)完成后,不想使原先的網(wǎng)頁(yè)繼續(xù)執(zhí)行,可以使用Server.Transfer方法。
為了看到這個(gè)技術(shù)的執(zhí)行,把前面使用過(guò)的CGI-SSI例子網(wǎng)頁(yè)的虛擬路徑輸入到Server.Excute方法(或Server.Transfer方法)的文本框中。這個(gè)路徑是“../ssi_cgi/ssi_cgi.stm”。在單擊按鈕對(duì)Execute或Transfer方法進(jìn)行調(diào)用以后,將看到.stm網(wǎng)頁(yè)已經(jīng)執(zhí)行,其中有SSI指令的結(jié)果。在來(lái)自ssi_cgi.stm的內(nèi)容之后出現(xiàn)的是原先的網(wǎng)頁(yè)的其余部分,雖然在圖4-16中看不到,但可通過(guò)滾動(dòng)條看到該內(nèi)容。
圖4-16 執(zhí)行Server.Excute方法后的屏幕
3. SSI #exec指令的不足
遺憾的是Execute和Transfer方法一般不能與SSI的#exec指令一起工作,因?yàn)榘@個(gè)指令的.stm網(wǎng)頁(yè)會(huì)在調(diào)用它的ASP網(wǎng)頁(yè)的環(huán)境中運(yùn)行。在大多數(shù)情況下,它需要運(yùn)行于直接引用該網(wǎng)頁(yè)的一個(gè)獨(dú)立的環(huán)境中。
存在這樣的限制真是遺憾,如果沒(méi)有這種限制,我們通過(guò)Server.Execute執(zhí)行的網(wǎng)頁(yè)可以“不可見(jiàn)地”包含來(lái)自于ASP網(wǎng)頁(yè)的#exec指令。對(duì)前面的通過(guò)net stop和net start命令停止和啟動(dòng)Indexing Service的示例來(lái)說(shuō),它可能是一種理想的解決方案。
但是,我們必須求助于老的和已經(jīng)驗(yàn)證的方法。當(dāng)用戶單擊一個(gè)按鈕時(shí),簡(jiǎn)單地使用Response.Redirect方法來(lái)打開(kāi)相關(guān)的網(wǎng)頁(yè):
<%
‘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指令的一個(gè)SSI網(wǎng)頁(yè)的虛擬路徑輸入到示例頁(yè)面的Server.Execute和Server.Transfer方法的文本框中。前面使用過(guò)的#exec示例的虛擬路徑是“../ssi_cgi/exe/start_cisvc.stm”和“../ssi_cgi/exec/stop_cisvc.stm”。