ASP(Active Server Page) Note

本網頁以打造無障礙閱讀為目標,可以任何瀏覽器來觀看本網頁


簡介

ASP(Active Server Pages) 是由 Microsoft 所開發出來的一種技術,這種技術透過伺服器端執行描述語言 (Server-Side Scripting) 程式碼的運算邏輯,供各種瀏覽器閱覽。


通常在撰寫 ASP 程式時,會選定使用某一程式語言來撰寫程式碼,如:VBScript, JavaScript, Perl, Tcl, Python等,然後用特別的標籤來區隔這些程式碼,置入一般的HTML文件中。一旦使用者透過瀏覽器來讀取 ASP 檔案(即副檔名為 .asp 的檔案)時,伺服器就會執行檔案中的程式碼,然後在運算結束後,把運算的結果以標準的HTML格式傳回到瀏覽器。

ASP仍侷限在安裝IIS的網路伺服器和安裝Microsoft的PWS(Personal Web Server)才能使用,但Chili!Soft公司已經研發可以在Unix及Linux使用的ASP伺服器, 新版的BigApache套件也同時支援ASP了,還有InstantASP。

研讀背景

Web server架設

目前支援 ASP 的Web Server 有 MicroSoft WinNT/2000/XP 的IIS 4.0/5.0/5.1 及 Windows 98/SE/ME 的 PWS(Personal Web Server)。

安裝PWS

安裝IIS

Windwos 2000 Professional 版的 IIS 也和 PWS 一樣小器,有10個連線上限的限制。真的要架設 IIS 網站伺服器,應該在有安裝 Win2000 Server 版的機器上安裝 IIS。

控制台
 新增/移除程式
  新增/移除Windows元件
   Internet Information Services(IIS)
    詳細資料 //SMTP Service, 檔案轉換通訊協定(FTP)伺服器)

效能調整

網路上的芳鄰/右鍵/內容
 區域網路/右鍵/內容
  點選File and Printer Sharing for Microsoft Netowrks/內容
   點選網路應用程式的資料傳送量最大化/確定
   

啟動iis

利用Internet服務管理員 利用瀏覽器
控制台
 系統管理工具
  Internet 服務管理員

http://localhost:2008/iis.asp

localhost : 亦可代換成ip
2008 : 系統管理Web站台的連接埠號碼
iis.asp : 主機名稱.asp

WEB站台可能的組成

名詞解釋

宣告

使用的語言

雖然你可以使用各種程式語言,來撰寫 ASP 的程式碼,但 Microsoft 的網站伺服器程式已設定好VBScript及JavaScript的直譯核心程式(或稱為引擎)。如果要使用其他語言,則您須另行安裝這些語言的直譯核心程式,然後在網站伺服器中作適當的設定。

開頭宣告 (宣告server side使用的script類型)

利用@(一個ASP程式只能有一個@,且要放在html標籤之上)
宣告使用vbscript
宣告使用jscript
<%@language="vbscript"%> //ASP若採vbscript可省略宣告

<%@language="javascript"%>

行內段落宣告 ( 動態指定server side使用的script類型)

宣告使用vbscript
宣告使用jscript
<script language="vbscript" runat="Server">
<script language="javascript" runat="Server">

變數宣告(無須指定資料型態)

vbscript
jscript
全域變數
區域變數
全域變數
區域變數
public x=1 dim x=1
private y=1
x=1; var x=1;

強迫宣告

vbscript的變數使用無須宣告, 但若要強迫宣告可用

< %Option Explicit%>

變數

VBscript

資料型態(Data Type)

註解

HTML
vbscript
jscript
CSS
<!-- -->
' , rem
//
/* */

函數

vbscript
jscript
無傳回值
有傳回值
無傳回值
有傳回值
sub 函數名
  return 回傳值
end sub
function 函數名 (參數)
  函數名=回傳值
end function
function 函數名 (參數)
{
  
}
function 函數名 (參數)
{
  return 回傳值
}

範例 : 以vbscript為主的asp程式, 呼叫vbscript或javascript函數的方法

<html>
< head>
< %
sub vbproc(num1,num2)
Response.Write(num1*num2)
end sub
%>

< script language="javascript" runat="server">
function jsproc(num1,num2)
{
Response.Write(num1*num2)
}
< /script>
< /head>

<body>
< p>Result: <%call vbproc(3,4)%></p>
< p>Result: <%call jsproc(3,4)%></p>
< p>Result: <%vbproc 3,4%></p>
< p>Result: <%jsproc 3,4%></p>
< /body>

</html>

陣列

vbscript
jscript
編譯期間定義陣列
執行期間定義陣列
編譯期間定義陣列
執行期間定義陣列

dim myarray(10,10)
'注意此時的10一定要是數字常數,不能代變數

Dim famname(6) , i
famname(1) = "Jan Egil"
famname(2) = "Tove"
famname(3) = "Hege"
famname(4) = "Stale"
famname(5) = "Kai Jim"
famname(6) = "Borge"

For i = 1 to 6
response.write(famname(i) & "<br />")
Next

redim myarray(變數名)
'變數代入陣列需在redim才能使用
dim sick()
redim sick(rst("totalrec")) //根據資料庫筆數定義陣列大小
i=0
do while Not rst1.eof
  sick( i ) = rst1("disease_cname") //將欄位資料循序丟入陣列中
  rst1.movenext
  i=i+1
loop
myarray=new Array(10);
var myarray=new Array(10);
 

ASP物件

當我們打開瀏覽器並輸入網址,也就是對Web Server送出 Request 要求,Web Server會自動進行 MIME 判別,並採取Windows一貫慣用的方法,也就是從檔案的附加檔名去判斷要交給哪個 DLL 來執行或解譯。 如果發現要處理的檔案附檔名是 .ASP 類型的檔案,就將此檔案交給 ASP.DLL 這個動態連結函式庫處理,它會將先將 Web Server 所收到的 URI 處理好,並儲存到記憶體裡面。

ASP 動態函式庫一旦執行,就會常駐在記憶體內,一直到關機為止才結束(稱為 in-process),因此它的執行效能遠高於附加檔名是 exe 或 com 的應用程式(通常這一類應用程式的執行方式就稱為 out-process)。由於使用 in-process 方式處理,所以 ASP 的內建物件 Application 才有辦法運作。也正因為ASP屬於 in-process 的關係,所以如果想要變更 ASP 相關的系統設定,必須將伺服器重新開機才會生效。

ASP 僅能以 IUSR_WebServer 這個帳號來執行,造成許多伺服器管理的工作必須以 administrator 權限來執行,所以 ASP 無法呼叫 WindowsAPI 來取得系統帳號和應用在伺服器管理工作上,例如:帳號管理、設定檔案目錄權限、修改系統登錄......等等。

ASP 提供了六個內建的物件,程式設計師透過這些物件的介面,來撰寫 ASP 程式。以下是這六個物件的簡介:

Response 提供你輸出運算結果到瀏覽器的介面。
Request 提供你讀取瀏覽器所傳來的資料及與伺服器有關變數的介面。
Server

與伺服器有關的相關設定,則是透過 Server 物件來與 Web Server 溝通,例如:呼叫自家的函式庫、修改 Timeout 設定、讀取主目錄的絕對路徑、使用 HTML 或 URL 編碼(Encode) 法來處理 Response 變數等。
提供與設定伺服器本身有關的介面,更重要的是提供了產生其他物件的介面。

Session Session 物件用來維護每個瀏覽器連線的資訊,當我們要讓ASP程式能夠根據不同身分執行不同功能的時候,就會使用 Session 變數。此變數的有效時間預設是20分鐘,但是有〝連選得連任〞的特性,也就是說當網頁重新整理(Reload)後,Session的有效時間也跟著延長。但最長也只能維持到瀏覽器關閉,或清除 cookie 為止。
當使用者與伺服器連線時,提供存取有關這次連線所使用變數的介面。
Application

當Web Server開機跑起來後,首先執行的是 Application物件,它定義了啟動IIS後Web站台運作所需的整體變數,並且會把這些變數一直放在記憶體中,等待ASP程式存取,一直到IIS Shutdown才消失。
這裡的 Application 指的是整個網站,或被設定為 Application 的虛擬目錄。這個物件提供存取與 Application 變數的介面。所有的使用者共用 Application 的變數。

ObjectContext ObjectContext 物件則是與 CGI 運作機制不相干的物件,它用來管理 MTS(Microsoft Transaction Server)。MTS 允許在執行程式前先紀錄伺服器狀態,如果有部分程式執行失敗,則可以退回到 先前的狀態,只有當所有相關程式跑完且執行成功後,才會真正登錄改變後的伺服器狀態,就像是我們為 ASP 程式設定了還原點一樣,可以避免程式執行失敗之後,要自行復原伺服器狀態的麻煩。
MTS 通常使用在有需要較高的安全性、和多個程式需要作〝同步〞的場合,一般我們是用不到的。由於 MTS 對於記憶體的需求較高,如果我們網站設計上沒有這個需要,卻故意去使用它,那麼將會白白浪費許多Web Server 的系統資源。
提供使用 Microsoft Transaction Server 物件的介面。

Response

Response.Write(輸出)

可簡寫為<%="輸出"%>

vbscript
jscript
word="您好"
response.write word
word="您好";
response.write(word);
Tips1 : 使用 Server.HtmlEncode() 來顯示html字元
response.write Server.HtmlEncode("We sell the <<Best!>> products!")
Tips2 : 可使用2種方式來顯示雙引號
使用連續的雙引號, 會被視為一個雙引號 <% response.write "He said, ""This doesn't work!"" " %>
使用 chr(34) 代替雙引號並以 & 來連接字串 <% response.write "He said," & chr(34) & "This doesn't work!" & chr(34) %>

Response.Redirect(轉向)

vbscript
jscript
response.redirect "abc.htm" response.redirect("abc.htm");

Response.End(結束)

vbscript
jscript
response.end response.end();

Response.Cookies(在client端的browser加上cookies)

Cookies是由Netscape發展來修正Web Server與Browser之間互動不足的問題, 包含了Session cookie及Persistent cookie(永久)兩種型態 , 並有限制如下

Session cookie Persistent cookie
response.cookies("name") = "Peter" response.cookies("name") = "Peter"
response.cookies("name").expires = "July 4, 2005"

Request

<%=request("上個網頁傳來的變數")%> ,若遇有相同變數名稱,其collection的優先順序為

  1. QueryString
  2. Form
  3. Cookies
  4. ClientCertificate
  5. ServerVariables

QueryString collection

利用 a 標籤將變數以url傳送 接收變數

<a href="answer.asp?apple=red&orange=blue"> 水果</a>

str="this is a apple"
str=Server.UrlEncode(str) //含有空格要進行url編碼
< a href="answer.asp?fruit=<%=str%>"> 水果</a>

apple=request.querystring("apple")
orange=request.querystring("orange")

fruit=request.querystring("fruit")

Form collection

利用表單傳送變數 接收變數

<form method="post" action="login.asp">
帳號 :<input type="text" name="account" />
密碼 :<input type="password" name="password" />
<input type="submit" name="Submit" value="送出" />
</form>

<%
account=request.form("account")
password=request.form("password")
%>

Tips : 傳回所有表單欄位,減少使用者重複輸入

<form method="post" action="login.asp">
<% for each item in request.form %>
<input type="hidden" name="<%=item%>" value="<%=server.htmlencode(request.form(item))%>"/>
<% next %>
<p> <input type="submit" name="Submit" value="重填" /></p>
</form>

ServerVariables collection

目前網頁的程式名稱 script_name
  傳回虛擬路徑與程式名稱

若要傳回真實路徑,有2種方法

  1. Request.ServerVariable("path_translated")
  2. Server.MapPath()

<% request.ServerVariables("script_name") %>

<%
response.write request.ServerVariables("path_translated")

response.write Server.MapPath(request.ServerVariables("script_name"))
%>

登入者前一個瀏覽的網頁 http_referer
  傳回網頁名稱
<% request.ServerVariables("http_referer") %>
登入者的IP remote_addr
  傳回IP
<% request.ServerVariables("remote_addr") %>
登入者的瀏覽器 http_user_agent
  傳回瀏覽器型態
<% request.ServerVariables("http_user_agent") %>

Cookies collection

name = request.cookies("name")
or
name = request("name") //此法需注意request對collection的處理順序

Session

變數 陣列
<% session("name") = "Peter" %>

//如何取用呢
<%
response.write session("name")
%>
<%
dim cart(20)
cart(0) = "光碟片"
cart(1) = "燒錄機"
session("cart") = cart
%>
//如何取用呢
<%
response.write session("cart")(1)
%>

Session 物件提供四種屬性(Properties)、兩個事件(Events)、一種方法(Method)與兩個集合(Collections),列表如下:

Session 物件的屬性
性質 說明 範例
CodePage CodePage的識別碼  
LCID LCID的識別碼  
SessionID 用戶端的SessionID,具唯一性 <%= Session.SessionID %>
Timeout Session物件的有效時間(以分鐘為單位),預設為20分鐘 <% Session.Timeout = 60 %>
Session 物件提供的事件
事件 說明 範例
OnStart 啟動一個 Session 物件時所觸發的函式,此函式必須放在 global.asa 檔案  
OnEnd 結束一個 Session 物件時所觸發的函式,此函式必須放在 global.asa 檔案  
Session 物件提供的方法
方法 說明 範例
Abandon 刪除 Session 物件所含的所有資訊 <% Session.Abandon %>
Contents.Remove(item or index) 刪除 Contents 集合中的某一個項目  
Contents.RemoveAll 刪除 Contents 集合中的所有項目  
Session 物件提供的集合
集合 說明 範例
Contents 所有加在 Session 物件的變數集合  
StaticObjects 所有在使用者層級(Session Scope)所宣告的物件集合  

Application

Recordset

資料庫的使用

存取資料庫要先建立connection物件

vbscript set conn=server.createobject("adodb.connection")
conn.open "driver={SQL SERVER};server=163.17.1.25;uid=root;pwd=root;database=test"
jscript conn=server.createobject("adodb.connection");
conn.open("driver={SQL SERVER};server=163.17.1.25;uid=root;pwd=root;database=test");

執行sql查詢的3種方法

使用recordset物件的open方法

vbscript sql_str="select * from score.dbo.asco"&y1&" a "
set rst=server.createobject("adodb.recordset")
rst.open sql_str,conn,1
jscript sql_str="select * from score.dbo.asco"&y1&" a ";
rst=server.createobject("adodb.recordset");
rst.open(sql_str,conn,1);

使用connection物件的execute方法

vbscript sql_str="select * from score.dbo.asco91"
set rst=conn.execute(sql_str)
jscript sql_str="select * from score.dbo.asco91";
rst=conn.execute(sql_str);

使用command物件的execute方法

關閉資料庫

vbscript rst.Close;
set rst=null;
conn.Close;
set conn=null;
jscript rst.Close();
rst=null;
conn.Close();
conn=null;

回傳記錄在第幾筆

vbscript

sql_str="select * from score.dbo.asco91"
set rst=CreateObject("ADODB.RECORDSET")
rst.CursorLocation=3 'cursor位於瀏覽器端
rst.open sql_str,conn,1
rst.find "stuid='9154610'"
if not rst.eof then
    response.Write rst.absoluteposition
else
    response.Write "你尚無此學期排名!"
end if

常用的sql指令

CASE

SQL CASE 是一種通用的條件表達式,類似於其他語言裡的 if/else 語句. CASE 子句可以用於任何可以有效存在的地方。

CASE WHEN condition THEN result [ WHEN ... ] [ ELSE result ] END

condition 是一個傳回 boolean 的表達式. 如果結果為真,那麼 CASE 表達式的結果就是 result . 如果結果為假,那麼以相同方式搜尋任何隨後的 WHEN 子句. 如果沒有 WHEN condition 為真,那麼 case 表達式的結果就是在 ELSE 子句裡的值. 如果省略了 ELSE 子句而且沒有相符的條件, 結果為 NULL.

範例:

SELECT a , b, c=
  CASE WHEN a=1 THEN 'one'
     WHEN a=2 THEN 'two'
      ELSE 'other'
   END
FROM test ;

所有 result 表達式的資料的類型 都必須可以轉換成單一的輸出類型。

CASE expression WHEN value THEN result [ WHEN ... ] [ ELSE result ] END

這個 "簡單的" CASE 表達式是上面 的通用形式的一個特殊的變種. 先計算 expression 的值, 然後與所有在 WHEN 子句裡的 value 對比,直到找到一個相等的. 如果沒有找到相符的,則傳回在 ELSE 子句裡的 result (或者 NULL). 這個類似於 C 裡的 switch 語句.

範例:

SELECT a ,
  CASE a WHEN 1 THEN 'one'
      WHEN 2 THEN 'two'
      ELSE 'other'
   END
FROM test

查詢記錄

顯示會員記錄: SELECT * FROM tblMember
顯示男性會員記錄, 並依出生日期排序, 年紀愈小的先顯示 : SELECT * FROM tblMember WHERE i_Sex = 1 ORDER BY dt_Birth DESC

新增記錄

新增會員記錄 : INSERT INTO tblMember(vch_Name,i_Sex,dt_Birth) VALUES ('ALLEN',0,'1999/12/25')

更新記錄

將姓名為 ALLEN 的會員, 性別變更為 1 (男性) : UPDATE tblMember SET i_SEX=1 WHERE vch_Name='ALLEN'

刪除記錄

刪除 ALLEN 會員記錄 : DELETE FROM tblMember WHERE vch_Name='ALLEN'
刪除所有男性記錄 : DELETE FROM tblMember WHERE i_Sex=1
刪除出生日期在2000/1/18 以後的會員記錄 : DELETE FROM tblMember WHERE dt_Birth > '2002/1/18'

檢查SQL語法

對於SQL語法錯誤的部分,我們可印出SQL字串來判斷。例如:

..........略..........
sql = "select stdno,classno,student,count(correct) as total from award_answer where correct=1 group by stdno,classno,student order by total desc,classno"
response.wriet sql //印出SQL字串
response.end //結束不執行
Set rs2=conn.execute(sql)
.........略...........

清除交易紀錄檔

若sql的交易紀錄一直沒有去清除的話,會導致整個資料庫都不能使用,此時我們可以在 Query Analyzer 中鍵入下列指令

backup log 資料庫名 with NO_LOG | TRUNCATE_ONLY

此指令之用意為備份資料庫的Log檔,由於我們在上述語法中沒有指定備份的裝置為何,Sql Server即會認為此動作為單純要把已交易完成的Log資料清空(已交易完成的資料所指即為已commit的資料),而Truncate_Only的選項則是告訴Sql Server目的在清空Log之空間,至於清出的空間則由Sql Server管理,不還給OS。 NO_LOG 與 TRUNCATE_ONLY 是同義字。

壓縮指定資料庫中資料檔的大小

dbcc shrinkdatabase (資料庫名 , { NOTRUNCATE | TRUNCATEONLY } )

壓縮目前資料庫指定的資料檔或記錄檔的大小

dbcc shrinkfile ( 指定檔名 [ , { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY } ] )

backup log education with NO_LOG
dbcc shrinkfile (education_log , truncateonly)

可參考 sql2000 的線上叢書

使用技巧

同一個表單根據要求遞交到不同ASP

<form method="POST" name="form1">
......
<input type="button" value="del" name="B1" onclick="document.form1.action='del.asp'; document.form1.submit()" >
<input type="button" value="view" name="B2" onclick="document.form1.action='view.asp';document.form1.submit()">
<input type="button" value="addnew" name="B3" onclick="document.form1.action='addnew.asp'; document.form1.submit()">
</form>

太長的敘述要以 &_ 斷行

response.write "this is a" &_
"asp program test."

偵測使用者IP

如果光是用Remote_Host或Remote_Addr, 那你拿到的只是實際存取的主機而已, 如果別人透過Proxy來讀取你的程式那你就偵測不到正確的IP了. Request.ServerVariables("HTTP_X_FORWARDED_FOR") , 這段語法代表的是偵測這台主機後端使用的IP, 如Proxy後端的使用者就可以用這個語法偵測, 如果Remote_Addr偵測的是真的IP那這個值會是空的.

dim ip
if Request.ServerVariables("HTTP_X_FORWARDED_FOR")<>"" then
 ip=Request.ServerVariables("HTTP_X_FORWARDED_FOR")
else
 ip=Request.ServerVariables("REMOTE_ADDR")
end if

ASP的global.asa

內含ASP唯一的4個事件程序

  1. Application_OnStart
  2. Application_OnEnd
  3. Session_OnStart
  4. Session_OnEnd

<script language="vbscript" runat="Server"> //此範例僅供參考, 因為不應該在session中進行application的存取
Sub Application_OnStart
 Application("OnlineCount") = 0
End Sub
Sub Application_OnEnd
End Sub
Sub Session_OnStart
 Application.Lock
 Application("OnlineCount") = Application("OnlineCount") + 1
 Application.UnLock
End Sub
Sub Session_OnEnd
 Application.Lock
 Application("OnlineCount") = Application("OnlineCount") - 1
 Application.UnLock
End Sub
</script>

注意事項

網路資源

本網頁最後更新日期為 2004-07-05 內容陸續增加中............
回首頁 Main Page

主 網 站:http://www2.cyut.edu.tw/~s9154610/
映射網站1:http://chinyi.ncit.edu.tw/~peterju/(速度較快)
映射網站2:http://my.so-net.net.tw/peterju/(速度中等)
映射網站3:http://peterju.adsldns.org/(速度較慢)
Bobby WorldWide Approved AAA | [歡迎使用任何作業系統、瀏覽器觀看!] | [本網站符合 XHTML 1.0 標準!] | [本網站符合 CSS 1.0 標準!] | [創意公眾許可証]
This work is licensed under a Creative Commons License