本網頁以打造無障礙閱讀為目標,可以任何瀏覽器來觀看本網頁
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。
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/內容
點選網路應用程式的資料傳送量最大化/確定
利用Internet服務管理員 | 利用瀏覽器 |
---|---|
控制台 系統管理工具 Internet 服務管理員 |
http://localhost:2008/iis.asp
|
宣告使用vbscript |
宣告使用jscript |
<%@language="vbscript"%> //ASP若採vbscript可省略宣告 |
<%@language="javascript"%> |
宣告使用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的變數使用無須宣告, 但若要強迫宣告可用
Empty | 數字=0 ; 字串="" | |
Null | N/A | |
Boolean | True / False | |
Byte | 0~255 | |
Interger | -32768~32768 | |
Currency | ||
Long | ||
Single | ||
Double | ||
Date/Time | 日期/時間 | 西元100年1月1日~西元9999年12月31日 |
String | 字串 | 若字串中包含有雙引號則 my name is "peter". => "my name is ""peter""." |
Object | 物件 | N/A |
Error | 錯誤代碼 | N/A |
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) Dim famname(6) , i For i = 1 to 6 |
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); |
當我們打開瀏覽器並輸入網址,也就是對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才消失。 |
ObjectContext | ObjectContext 物件則是與 CGI 運作機制不相干的物件,它用來管理 MTS(Microsoft Transaction
Server)。MTS 允許在執行程式前先紀錄伺服器狀態,如果有部分程式執行失敗,則可以退回到
先前的狀態,只有當所有相關程式跑完且執行成功後,才會真正登錄改變後的伺服器狀態,就像是我們為 ASP
程式設定了還原點一樣,可以避免程式執行失敗之後,要自行復原伺服器狀態的麻煩。 MTS 通常使用在有需要較高的安全性、和多個程式需要作〝同步〞的場合,一般我們是用不到的。由於 MTS 對於記憶體的需求較高,如果我們網站設計上沒有這個需要,卻故意去使用它,那麼將會白白浪費許多Web Server 的系統資源。 提供使用 Microsoft Transaction Server 物件的介面。 |
可簡寫為<%="輸出"%>
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) %> |
vbscript |
jscript |
response.redirect "abc.htm" | response.redirect("abc.htm"); |
vbscript |
jscript |
response.end | response.end(); |
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("上個網頁傳來的變數")%> ,若遇有相同變數名稱,其collection的優先順序為
利用 a 標籤將變數以url傳送 | 接收變數 |
---|---|
<a href="answer.asp?apple=red&orange=blue"> 水果</a> str="this is a apple" |
apple=request.querystring("apple") fruit=request.querystring("fruit") |
利用表單傳送變數 | 接收變數 |
---|---|
<form method="post" action="login.asp"> |
<% |
Tips : 傳回所有表單欄位,減少使用者重複輸入 |
---|
<form method="post" action="login.asp"> |
目前網頁的程式名稱 script_name 若要傳回真實路徑,有2種方法
|
<% 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") %> |
變數 | 陣列 |
---|---|
<% 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),列表如下:
性質 | 說明 | 範例 |
---|---|---|
CodePage | CodePage的識別碼 | |
LCID | LCID的識別碼 | |
SessionID | 用戶端的SessionID,具唯一性 | <%= Session.SessionID %> |
Timeout | Session物件的有效時間(以分鐘為單位),預設為20分鐘 | <% Session.Timeout = 60 %> |
事件 | 說明 | 範例 |
---|---|---|
OnStart | 啟動一個 Session 物件時所觸發的函式,此函式必須放在 global.asa 檔案 | |
OnEnd | 結束一個 Session 物件時所觸發的函式,此函式必須放在 global.asa 檔案 |
方法 | 說明 | 範例 |
---|---|---|
Abandon | 刪除 Session 物件所含的所有資訊 | <% Session.Abandon %> |
Contents.Remove(item or index) | 刪除 Contents 集合中的某一個項目 | |
Contents.RemoveAll | 刪除 Contents 集合中的所有項目 |
集合 | 說明 | 範例 |
---|---|---|
Contents | 所有加在 Session 物件的變數集合 | |
StaticObjects | 所有在使用者層級(Session Scope)所宣告的物件集合 |
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"); |
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); |
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); |
vbscript | rst.Close; set rst=null; conn.Close; set conn=null; |
jscript | rst.Close(); rst=null; conn.Close(); conn=null; |
SQL CASE 是一種通用的條件表達式,類似於其他語言裡的 if/else 語句. CASE 子句可以用於任何可以有效存在的地方。
CASE WHEN condition THEN result [ WHEN ... ] [ ELSE result ] ENDcondition 是一個傳回 boolean 的表達式. 如果結果為真,那麼 CASE 表達式的結果就是 result . 如果結果為假,那麼以相同方式搜尋任何隨後的 WHEN 子句. 如果沒有 WHEN condition 為真,那麼 case 表達式的結果就是在 ELSE 子句裡的值. 如果省略了 ELSE 子句而且沒有相符的條件, 結果為 NULL.
範例:
所有 result 表達式的資料的類型 都必須可以轉換成單一的輸出類型。
CASE expression WHEN value THEN result [ WHEN ... ] [ ELSE result ] END這個 "簡單的" CASE 表達式是上面 的通用形式的一個特殊的變種. 先計算 expression 的值, 然後與所有在 WHEN 子句裡的 value 對比,直到找到一個相等的. 如果沒有找到相符的,則傳回在 ELSE 子句裡的 result (或者 NULL). 這個類似於 C 裡的 switch 語句.
範例:
刪除 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的交易紀錄一直沒有去清除的話,會導致整個資料庫都不能使用,此時我們可以在 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 的線上叢書
<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."
如果光是用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唯一的4個事件程序
<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>