12-3 嚙緘嚙踝蕭洏嚙?ASP 嚙踝蕭 HTML

ASP 檔案通常以 asp 為副檔名,它是一個文字檔,除了包含基本的 HTML 標記外,還可以包含 ASP 的程式碼。ASP 的程式碼是以 <% ... %> 的標記來和 HTML 區分,伺服器發覺用戶端要求的檔案是以「asp」為副檔名,就會尋找 ASP 程式碼並執行之。事實上,ASP 的標記 <% ... %> 是一個簡寫,若要使用不同的語言,就必須使用完整的表示方式。例如,若要使用 JScript 來撰寫 ASP,就必須使用下列格式:
<script language=jscript runat=server>
	JScript 的程式碼
</script>
其中要特別注意的是「runat=server」,若沒加上這一句,伺服器就不會執行這一段程式碼,而將之直接送回用戶端,結果這段程式碼會變成由用戶端的瀏覽器來執行,那就完全大錯特錯了!

Hint
事實上,包含 ASP 程式碼的網頁,可以不用 asp 為副檔名,例如,你可以選用 hi 為 ASP 網頁的副檔名,只要在 IIS 伺服器進行相關設定即可。

使用上述的方式,你可以在一個 ASP 網頁內混合使用不同的語言,只要你有加上 language 的屬性即可。若要在一個 ASP 網頁內全部使用 JScript,一個更簡單的作法是直接設定整個網頁的 language 屬性,只要在網頁的第一列加入下述程式碼即可:

<%@ language=jscript %>
其後在此網頁由 <% ... %> 包住的程式碼,都會被視為是 JScript 的程式碼,並由伺服器呼叫 JScript 的直譯器來執行之。

Hint
為了避免轉變程式語言所帶來的困擾,在本課程中,我們其後的 asp 程式範例,都會盡量以 JScript 來撰寫。

若要印出變數 x 的值,可用下列兩種方法:

  1. <%Response.Write(x)%>
  2. <%=x%>
其中 Response 是 ASP 的內建物件,Write() 則是其中一種方法。由於 Response.Write 常被用到,因此就發展出第二種更簡便的列印方式。 舉例來說,若要在 HTML 中印出「Hello World!」,下列數種方式可達到同樣的效果:
  1. <%Response.Write("Hello World!")%>
  2. <%="Hello World!"%>
  3. <%x = "Hello World!"%><%Response.Write(x)%>
  4. <%x = "Hello World!"%><%=x%>
在下列範例中,我們以上述方法印出四列「Hello World!」:

Example(hello01.asp):

上述範例的原始檔如下:

原始檔(hello01.asp):(灰色區域按兩下即可拷貝)
<%@language=jscript%>

<%title="ASP 印出「Hello World!」的四種方法"%>
<!--#include file="head.inc"-->
<hr>

Four methods to print "Hello World!" in server-side VBScript:
<p>
<%Response.Write("Hello World!")%><br> 
<%="Hello World!"%><br>
<%x = "Hello World!"%><%Response.Write(x)%><br>
<%x = "Hello World!"%><%=x%><br>

<hr>
<!--#include file="foot.inc"-->

在本書的其它 ASP 網頁範例中,我們都使用 head.inc 來代表相同的網頁開始部分,並使用 「<!--#include file="head.inc"-->」的方式來將 head.inc 檔案包含進來此範例網頁。head.inc 的內容如下:

原始檔(head.inc):(灰色區域按兩下即可拷貝)
<html>
<head>
	<title><%=title%></title>
	<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
	<style>
		td {font-family: "標楷體", "helvetica,arial", "Tahoma"}
		A:link {text-decoration: none}
		A:hover {text-decoration: underline}
	</style>
</head>
<body>
<h2 align=center><%=title%></h2>

同樣的,foot.inc 是代表相同的網頁結束部分,我們使用 「<!--#include file="foot.inc"-->」的方式來將 foot.inc 檔案包含進來,foot.inc 的內容如下:

原始檔(foot.inc):(灰色區域按兩下即可拷貝)
<script>function viewSource() {window.location="view-source:"+window.location} </script>
<%
fso=Server.CreateObject("Scripting.FileSystemObject");
parentDir=Request.ServerVariables("URL")+"";
parentDir=fso.GetParentFolderName(parentDir);
if (parentDir.indexOf("example")!=parentDir.length-7){
//	Response.Write(parentDir+"<br>");
	parentDir=fso.GetParentFolderName(parentDir);
}
showCodePage=parentDir+"/showcode.asp";		// showCodePage="/jsBook/asp/example/showcode.asp"
%>
View source:
[<a target=_blank href="<%=showCodePage%>?source=<%=Request.ServerVariables("PATH_INFO")%>">Server-side script</a>]
[Client-side script (ctrl+u)]
<br>回到「<a href="/jang/books/asp">JScript 程式設計與應用:伺服器端</a>」</b>
</html>

Hint
使用 <!--#include file="fileName"--> 來加入檔案 fileName 的方式稱為 Sever-Side Include,簡稱 SSI,將會在後面有詳細的說明。

若要使用 ASP 印出數列「Hello World!」並逐次增大其字體,可見下列範例:

Example(hello02.asp):

上述範例的原始檔如下:

原始檔(hello02.asp):(灰色區域按兩下即可拷貝)
<%@language=jscript%>
<%title="利用 ASP 印出大小不同的「Hello World!」"%>
<!--#include file="head.inc"-->
<hr>

<% for (i=1; i<=5; i++) {%>
	<font size=<%=i%>> Hello World! </font><br>
<%}%>

<hr>
<!--#include file="foot.inc"-->

Hint
為節省篇幅,在後續的程式碼列表裡,將不再顯示這些 ASP 範例網頁所用到的標準檔頭與檔尾,而以「...」取代之。

在上述範例中的 for 迴圈,我們交叉使用了 ASP 的程式碼和 HTML 的原始碼,這種交叉的方式若使用太多,會造成程式碼效率的降低,因此我們也可以直接將之改寫成完全是 ASP 的程式碼,其呈現效果完全相同,原始碼如下:

原始檔(hello03.asp):(灰色區域按兩下即可拷貝)
<%@language=jscript%>
<%title="利用 ASP 印出大小不同的「Hello World!」"%>
<!--#include file="head.inc"-->
<hr>

<%
for (i=1; i<=5; i++){
	Response.Write("<font size=" + i + "> Hello World! </font><br>");
}
%>

<hr>
<!--#include file="foot.inc"-->

在 Client Script,<script> 標籤的預設語言即為 JavaScript 或 JScript。而在 Server Script,<script runat=server> 標籤的預設語言即為 VBScript。可整理如下表:


Client-side Scripts Server-side Scripts
JavaScript
(JScript)
<script>...</script>
<script runat=server language=jscript>...</script>
VBScript <script language=vbscript>
<% ... %>
<script runat=server>...</script>

此外,JScript 和 VBScript 有下列不同之處,在撰寫 ASP 程式碼時,要特別小心:

為了便於比較,對於本小節的各個範例,我們也提供相關的 VBScript 程式碼,例如 hello01.asp 是使用 JavaScript 的 ASP 網頁,則 hello01_vbs.asp 則是使用 VBScript 的 ASP 網頁,請依此類推。
JScript 程式設計與應用:用於伺服器端的 ASP 環境