*ASP的輸入 *&*Request物件*
*Request 物件 :Request 物件與Response 物件是一對的的,為何如此
說呢?因為Response 物件是回應資料給瀏覽器,
而Request 物件是讀取瀏覽器的資料,通常包含了
使用者端的相關訊息,如瀏覽器的種類、表頭資訊、
*
表單參數及 Cookies....等,Request物件提供下列資料集合。
名稱
|
說明
|
Request.Form("變數名稱") | 取得客戶端利用表單所傳送 的資料 |
Request.QueryString ("變數名稱") | 取得附帶在網址後面的參數 |
Request.Cookies("變數名稱") | 取得存在於客戶端瀏覽器 的Cookies資料 |
Request.ServerVariables ("變數名稱") | 取得網頁伺服端的環境 變數資訊 |
*本單元將針對 Request.Form("變數名稱")
作介紹,其它部分將 Cookies 物件及 Server
*
*以簡單訪客留言為例 製作一表單,程式碼如下:(message.htm)
*
*
- <form> 標籤的 action (動作)屬性值
- 設定為 『go.asp』代表我們按下
- 『傳送』 按鈕後,將由伺服端的
- 『go.asp』接收由此網頁所傳出
- 的網頁資料並加以處理。
- <form> 標籤的 method (傳輸方式)
- 屬性值設定為『post』代表我們按下
- 『傳送』按鈕後,瀏覽器將不會立即
- 主動的將資料傳給伺服器,而會等候
- 伺服端來讀取資料並加以處理。另一
- 種method (傳輸方式)屬性值設定為
- 『get』代表我們按下『傳送』按鈕後,
- 瀏覽器將會立即主動的將資料傳給
- 伺服器,使用這種方式並不太好!
- 因為當我們按下『傳送』按鈕後,
- 表單中的資料將會附在網址之後
- 傳送到伺服器 **
執行結果如下:
*
**
**
- 文字輸入欄位<input>:『type』 屬性為
- 輸入欄位的類型,其文字欄位設定值有
- 三種,分別為:『Text』文字輸入欄位
- (只能輸入單行文字)、『Password』保密
- 輸入欄位(單行文字輸入,輸入的文字將
- 以星字號代替)、『Textarea』文字輸入
- 區塊(可輸入多行文字)。
- 文字輸入欄位<input>:『size』 屬性為
- 文字輸入欄位的寬度 **
*按下傳送鈕後會啟動Server端之ASP程式,
即原始碼中之action="go.asp" ,以下
為go.asp程式碼:
- 利用 request 物件取回 message.htm 網頁中
- 資料輸出識別名稱為欄位資料,並將其
- 資料放置到『name』 的變數中。
- 利用 request 物件取回 message.htm 網頁中
- 資料輸出識別名稱為『email』 的欄位資料,
- 並將其資料放置到『email』 的變數中。
- 利用 request 物件取回 message.htm 網頁中
- 資料輸出識別名稱為『memo』 的欄位資料,
- 並將其資料放置到『memo』 的變數中***
- 文字輸入欄位<input>:『name』 屬性為
- 資料輸出的識別名稱。
- 文字輸入欄位<input>:『cols』 屬性與
- 『rows』屬性分別為設定『Textarea』文字
- 輸入區塊的欄位數及行數。
- 若將『type』 屬性值設為『submit』,
- 則代表此一欄位為一按鈕(Button),按下
- 此按鈕則可將表單中的資料送出,
- 其『value』 屬性值適用來設定按鈕
- 的標題文字(Caption) ***
*注意:<%=顯示內容%>是<%response.write "
顯示內容"%> 的簡便寫法 !!*
*執行結果如下: *
* **
物件單元中介紹 *註:若單純只有取得表單之變數名稱,則
Request.Form("變數名稱"), 亦可寫成
Request("變數名稱") *
********************************************
*ASP的輸入 *&*Request物件*
*Request 物件 :Request 物件與Response 物件是一對的的,
為何如此說呢?因為Response 物件是回應
資料給瀏覽器,而Request 物件是讀取瀏覽
器的資料,通常包含了使用者端的相關訊息,
如瀏覽器的種類、表頭資訊、表單參數及
Cookies....等,Request物件提供下列資料集合 ***
*
*
名稱
|
說明
|
Request.Form("變數名稱") | 取得客戶端利用表單所 傳送的資料 |
Request.QueryString ("變數名稱") | 取得附帶在網址後面的參數 |
Request.Cookies("變數名稱") | 取得存在於客戶端瀏覽器 的Cookies資料 |
Request.ServerVariables ("變數名稱") | 取得網頁伺服端的 環境變數資訊 |
*本單元將針對 Request.Form("變數名稱")
作介紹,其它部分將 Cookies 物件及 Server
物件單元中介紹。註:若單純只有取得表單之變數名稱,
則 Request.Form("變數名稱"), 亦可寫成
Request("變數名稱")。 ***
*以簡單訪客留言為例 製作一表單,
程式碼如下:(message.htm) *
* **
*
- <form> 標籤的 action (動作)屬性值設定
- 『go.asp』代表我們按下『傳送』按鈕後,
- 將由伺服端的『go.asp』接收由此網頁所
- 傳出的網頁資料並加以處理。
- <form> 標籤的 method (傳輸方式)屬性值設
- 定為『post』代表我們按下『傳送』按鈕後
- ,瀏覽器將不會立即主動的將資料傳給
- 伺服器,而會等候伺服端來讀取資料並加以
- 處理。另一種method (傳輸方式)屬性值設定
- 為『get』代表我們按下『傳送』按鈕後,
- 瀏覽器將會立即主動的將資料傳給伺服器,
- 使用這種方式並不太好!因為當我們按下
- 『傳送』按鈕後,表單中的資料將會附
- 在網址 之後傳送到伺服器 ***
*
**
- 文字輸入欄位<input>:『type』 屬性
- 為輸入欄位的類型,其文字欄位設定值
- 有三種,分別為:『Text』文字輸入
- 欄位(只能輸入單行文字)、『Password』
- 保密輸入欄位(單行文字輸入,輸入的
- 文字將以星字號代替)、『Textarea』
- 文字輸入區塊(可輸入多行文字)。
- 文字輸入欄位<input>:『size』 屬性為
- 文字輸入欄位的寬度。
- 文字輸入欄位<input>:『name』 屬性
- 為資料輸出的識別名稱。
- 文字輸入欄位<input>:『cols』 屬性
- 與『rows』屬性分別為設定『Textarea』
- 文字輸入區塊的欄位數及行數。
- 若將『type』 屬性值設為『submit』,
- 則代表此一欄位為一按鈕(Button),按下
- 此按鈕則可將表單中的資料送出,其
- 『value』 屬性值適用來設定按鈕的
- 標題文字(Caption) ***
**
***按下傳送鈕後會啟動Server端之ASP程式,
即原始碼中之action="go.asp" ,以下
為go.asp程式碼:
- 利用 request 物件取回 message.htm 網頁
- 中資料輸出識別名稱為欄位資料,並將
- 其資料放置到『name』 的變數中。
- 利用 request 物件取回 message.htm 網頁
- 中資料輸出識別名稱為『email』 的欄位
- 資料,並將其資料放置到『email』 的
- 變數中。
- 利用 request 物件取回 message.htm 網頁
- 中資料輸出識別名稱為『memo』 的欄位
- 資料,並將其資料放置到『memo』 的
- 變數中。
注意:<%=顯示內容%>是<%response.write
"顯示內容"%> 的簡便寫法!
執行結果如下:
**
****************************************
*ASP的變數紀錄*&*Application物件 *
*
*Application 物件**Application 物件是用來管理整個應用程式,
可提供給客戶端使用者 共享資訊,在實務上
會被用來追蹤目前使用中的人數及針對特定
使用者顯示特定資料 *
*利用Application 物件來記錄變數內容,則網
頁結束執行時其變數內容仍可保留,也就是
說Application 物件是一個『靜態』變數,
如下所示:( App01.asp) *
*
*執行結果如下: **
*
************************************************
*Application 物件為『共用資訊』,在不同瀏覽器執行或按重新
整理時 ,其值是累加的,例如我們重新執行App01.asp 網頁,
我們可以清楚的發現:var 變數內的值仍然為上一
**
**Application 物件的生命週期 起始於 PWS/IIS 開始運作且有人開始連線時。
終止於 PWS/IIS 關閉或一定時間內
(預設為20分鐘)沒人連線時。 也就
是說 Application 物件並不是永遠存在的!
除非我們將 Application 物件中的資料
寫錄到檔案中將其保存起來,在後續
的單元中,我們將會特別介紹檔案
資料的寫錄與讀取**
**
*雖然 Application 物件可以在網頁
結束後,將其物件內的資料保留下來,
但是,當有兩位甚至兩位以上的
瀏覽者同時進行網頁鍊結時,
則它們所獲得的資料值將是相同的,
進而使我們統計的資料產生錯誤;
為了避免兩位甚至兩位以上的瀏覽者
同時進行網頁鍊結時造成ASP程式
執行錯誤,可以利用Application
物件的操作方法: Application.Lock
物件上鎖 與Application.Unlock 取消
物件上鎖 ,如下所示:(lock.asp)
如此可避免兩位瀏覽者同時瀏覽
網頁時,count值加總少加。 即程式
執行至『Application.lock』程式敘述後,
就把 Application 物件上鎖,如此一來
Application 物件便不能被其他程式
連線者所呼叫使用,須等到呼叫
『Application.lock』的程式連線者
再次呼叫了『Application.unlock』取消
Application 物件上鎖後,其它程式
連線者才可呼叫 Application***
********************************************
*ASP的變數紀錄*&*Session物件*
*Session 物件*
*Session 物件為紀錄使用者的相關
資訊,提供使用者再次對此網頁
伺服器要求時作確認,例如使用者
帳號與密碼的確認,有 Session 物件
的建立,來保留身分認證的結果,
則使用者不用於每一頁網頁 登錄
時都需輸入密碼作確認**
*Session 物件與 Application 物件相同,
都是用來記錄『變數』值的,
但是 Application 是一對多的;
Session 物件則是一對一的,對於所有
的連線瀏覽者而言,他們對於
Application 物件的使用是『共用』的,
但是每個瀏覽連線者卻個別擁有一個
『私用』的 Session 物件,若將
上節 app01.asp 例子中之內容
application 改以 session替代,
如下所示:(sess01.asp)***
**
* 執行結果同 app01.asp |
雖然在表面上看來,結果是相同的,
但是,Session 物件現在紀錄的變數
資料只與目前瀏覽連線者有關,與其他
的瀏覽連線者一點關係都沒有,也就是說
目前所讀取的 Session 物件內容是讀取
目前瀏覽連線者『私用』的 Session 物件 **
*Session 物件與 Application物件之
不同點 :Application物件為共用之資訊,
而Session卻是個別獨立 的,比較
下兩圖,不同瀏覽器執行sess01.asp,
其值是不累加的,由此更可證明:
Session 物件紀錄的變數資料只與目前
瀏覽連線者有關,與其他的瀏覽
連線者一點關係都沒有 **
************************
*Session 物件的生命週期 起始於
PWS/IIS 瀏覽器第一次與伺服器
連線時。 終止於 PWS/IIS 瀏覽器
結束執行時或瀏覽器一段時間沒有
向PWS/ IIS要求任何網頁時 **
*
- 當我們利用 Application 來作為進站人數的
- 計數器,是利用當有新的瀏覽連線者進入
- 時就呼叫 Application 物件,將 Application
- 物件所儲存的變數資料值加一來達到計數
- 的目的,但是,上網者只要按下瀏覽器上的
- 『重新整理』按鈕後,你會發現計數器將
- 會再次的自動加一,這似乎不是我們想要的。
- 單純的 Application 計數器程式碼與執行結果,
- 如下所列:
<% Application.Lock Application("counter") = Application("counter") + 1 Application.UnLock %> <HTML> <BODY> <CENTER><H2>Application計數器<HR></H2> 進站人數 <%=Application("counter")%> 位 </BODY> </HTML> |
- 那我們該如何防制連線者按下『重新整理』
- 按鈕使計數器自動加一所產生的錯誤呢?
- 我們可以利用具有『私用』特性的 Session
- 物件來判斷瀏覽連線者是否是新的連線者,
- 我們可以利用下列判斷式先檢驗一下,
- 如果是新的連線者,則其Session物件
- 是沒有任何資料的!If IsEmpty (Session("Conn")) Then 如果上列的判斷式是成立的(瀏覽連線者為
- 新連線的,Session物件內沒有任何的資料),
- 則我們就將Application 物件的紀錄資料加一
- ,同時將瀏覽連線者的Session("Conn")資料
- 值設為『True』,如此一來,當瀏覽連線者
- 再次按下『重新整理』按鈕後,
- 因為f IsEmpty (Session("Conn")) Then判斷式
- 不成立(Session物件內已有連線
- 紀錄的資料),則Application 物件的
- 紀錄資料就不會再自動加一。使用
- Application 物件與 Session 物件撰寫的
- 計數器程式碼與執行結果,如下所列:
<% If IsEmpty(Session("Conn")) Then Application.Lock Application("counter") = Application("counter") + 1 Application.UnLock End If Session("Conn") = True %> <HTML> <BODY> <CENTER><H2>Session計數器<HR></H2> 進站人數 <%=Application("counter")%> 位 </BODY> </HTML> |
*ASP的變數紀錄*&*Cookies物件*
(Cookies 物件*
Application 物件與 Session 物件將資訊
- 記錄在 Server端,而 Cookies物件會
- 藉由瀏覽器所提供之Cookies功能,
- 將資訊記錄在客戶端,也就是說:
- Cookies 物件是儲存在瀏覽連線
- 者的瀏覽器之中!
- 我們可用 Cookies 物件的紀錄來判斷
- 某個使用者是否曾經進入本網站。
- 奇怪!雖然Session 物件將資訊記錄
- 在 Server端,但是它也會個別紀錄連線
- 瀏覽者是否曾經進入本網站啊!
- 但是Session 物件的生存期限是很短的,
- 當瀏覽連線者的瀏覽器在設定時間內
- (預設為20分鐘)沒有向伺服器要求
- 任何資料的話,伺服器就會將Session
- 物件中的資料全數消除,而 Cookies
- 物件是存在於瀏覽連線者的瀏覽器中的,
- 即使是瀏覽者離線了,Cookies 物件
- 的資料記錄依然存在!
- Cookies 物件是 Response 物件及
- Request 物件之屬性,用法如下:
Response.cookies 寫入Cookies Request.cookies 讀取Cookies ***
連線者的瀏覽器之中?
- 將撰寫一含有 Cookies 的網頁, 如下所示 :(Cookies01.asp) *
*執行後會產生『型態不符合』的錯誤,如下圖: *
**
*
- 怎會如此呢?原因如下: Application物件
- 及Session物件其傳回值為empty而
- request.cookies卻是傳回 "" (空字串),
- empty可與數 值作運算,"" 卻不可以,
- 解決此一問可加入一判斷式, 如下所示:
if var="" then var=empty
| ' 如果var="",則將var設定成empty |
修改後還是有錯誤,錯誤為『已將HTTP標題
寫入用戶端瀏覽器。 對任何HTTP的標題所
做的修改必須要在寫入頁內容之前』。
- 原因 為瀏覽器與伺服端交換 Cookies資料
- 的時機需在伺服器尚未下載 資料給瀏覽器
- 之前就進行交換,否則會出現錯誤,解決
- 方法為用 緩衝區來裝下載的資料,
- 完整程式如下所示:
- 現在我們來檢驗一下:以IE 為例,建立
- 在瀏覽器中的 Cookies 物件將會放置在 『\WINDOWS\Temporary Internet Files』
- 目錄中,我們先將目錄中的所有資料
- 檔案清除乾淨:
接著啟動瀏覽器,開始瀏覽 cookies02.asp ,
此時我們將會發現在
『\WINDOWS\Temporary Internet Files』
目錄中多出了Cookies 的物件檔案,
這證明了Cookies 物件是存在於瀏覽連線者
的瀏覽器(客戶端)中無誤!
Cookies 物件的生命週期起始於瀏覽器
被執行時。終止於瀏覽器結束執行時。
那如果我們要延長Cookies 物件的生命週期呢?
若要延長Cookies 物件的生命週期我們可另用
『Expires』屬性來設定Cookies的生命週期,
Expires表失效 ,如下所示 :
response.cookies("yourID")="cookies" |
response.cookies("yourID").expires="2000/12/31/" |
經過expires設定後,yourID之使用
期限為2000/12/31*((^^
**********************************************
*伺服器資訊*&*Server物件 *
*Server 物件 Server 物件允許使用者取得伺服器提供的
各項功能,本單元將介紹 Request 物件的
ServerVariables方法及Server物件 ***
*Request.ServerVariables 方法:利用此
方法可取得伺服器提供的各項功能,
其敘述如下 :
Request.ServerVariables("環境變數")
環境變數有很多,在此將只介紹較實用的,
其他環境變數可參考 PWS/IIS提供之參考文件。
- 讀取IP位址的環境變數 "LOCAL_ADDR"serverID=request.servervariables("LOCAL_ADDR")
- 讀取Server端的IP位址
- "REEMOTE_ADDR" 讀取Client端的IP位址 clientID=request.servervariables("REMOTE_ADDR")
- 讀取附帶在網址後面的參數
- "QUERY_STRING" element=request.servervariables("QUERY_STRING") 亦可以下列方法替代,其結果是相同的。 element=request.querystring 假設所輸入的網址為 http://127.0.0.1/asp/ch01/elemenet.asp? name=kelvin&interest=play 則變數element="name=kelvin&interest=play" 我們可藉由split函
- 數解析element變數,如下所示:(element.asp)
Server 物件
- Server.MapPath:將網址路徑轉為真實的檔案
- 路徑 因為ASP規定必須指定檔案的真實
- 路徑,用法如下:
真實的路徑=Server.MapPath("虛擬路徑")
◎什麼叫做『虛擬路徑』?虛擬路徑其實就是
『網址』,當我們連結至某個網站的根目錄時,
我們就會在瀏覽器的網址輸入欄位中輸入網站
的網址,例如:http://www.twYYY.com/,這就
表示我們要鍊結至該網站的根目錄,但是實際
對應到該網站伺服器上硬碟根目錄卻是 『\Inetpub\wwwroot』,所以,說穿了
『網址』就是『假』的網站伺服器目錄,
只不過『假』很不好聽,因此我們就
稱之為『虛擬』!
◎如果我們所安裝的 PWS/IIS 網路伺服器模擬
機制的 www 根目錄(網址虛擬根目錄)為 『c:\Inetpub\wwwroot』,我們若使用
Server.MapPath("/")呼叫敘述,則回傳的資料值將是 『c:\Inetpub\wwwroot』;我們若使用
Server.MapPath("/test")呼叫敘述,則回傳的資料值將是 『c:\Inetpub\wwwroot\test』。
◎為何需轉換『虛擬路徑』為真實的路徑呢?
因為當我們需要開啟檔案或是資料庫時,
ASP 強硬的規定我們必須指定欲開啟檔案
(或資料庫)的『實際路徑』之故!
- 對特殊字元進行編碼 "HTMLEncode"
◎如果我們要在網頁中單純的顯示
『<b>粗體</b>』這些單純的文字時,
該如何編寫我們的ASP網頁呢?如果我們
撰寫的敘述如下圖a所編寫的內容一般,
則以瀏覽器瀏覽網頁時將會獲得如圖b的
錯誤答案:
◎怎麼會這樣呢?因為<b>與</b>輸出至
瀏覽器後都會被解譯為 HTML 網頁標籤了!
那怎麼辦啊!這個時候我們就必須利用
Server.HTMLEncode 來進行字元編碼,
其標準格式為:
Server.HTMLEncode ("要進行編碼的資料")
以剛剛要被單純輸出的資料為例:
Server.HTMLEncode ("<b>粗體</b>"),經過編碼之後
所得的答案將是『<b>粗體</b>』,
如此一來,當瀏覽器對網頁內容進行解譯時,
這些經過編碼過的資料瀏覽器就只會將它們
解碼回原來的特殊字元而不會解譯為 HTML
網頁標籤了!
執行結果:
*
*********************************************
*檔案存取~~**
物件(上)*
*File Access 元件 *
*File Access 元件允許ASP程式存取網頁伺服器
上的檔案,實務上大 部份以文字檔為主,
事實上,File Access元件是由FileSystemObject
物件及TextStream 物件所組成的。
FileSystemObject 物件負責開啟檔案或是目錄
的處裡,但若想讀取 檔案內容,則必須配合
TextStream 物件一起使用。 File Access元件已
包含在IIS4.0中,因此,不需重新安裝此元件
就可直接使用。 語法如下所示 :
set fs=CreateObject("Scripting.FileSystemObject") *
*FileSystemObject 物件
建立FileSystemObject
,程式如下:
檔案操作的方法:
CopyFile 複製檔案,語法如下:
FileSystemObject.copyfile source,
destination[,overwrite]
- source(來源檔案):必須是已存在的檔案,
- 否則會產生『找不到來 源檔案』的錯誤
- (err.numer=53)。
- destination(目的檔案):檔案若已存在,
- 則會被覆蓋,若為唯讀屬 性或被鎖定的
- 檔案,則會產生『沒有使用權限』的錯誤 (err .number=70)。
- overwrite(是否覆蓋):預設值為true,表示存
- 在的檔案將被覆蓋。
- 範例程式碼如下 :
DeleteFile:刪除檔案,語法如下
FileSystemObject.Deletefile Filename[,Flag]
- Filename(被刪除的檔案):必須為已存在的
- 檔案,否則會產生『找 不到來源檔』的錯誤(err.number=53)。
- Flag(true or false):預設值為false,true表可
- 以刪除唯讀屬性 設定的檔案,若不設為 true,
- 則遇到唯讀屬性檔案時將產 生『沒有使用權限』
- 的錯誤 (err.number=70)。
- 範例程式碼如下 :
MoveFile 移動檔案或更名,語法如下:
FileSystemObject.Movefile source,destination
- Source(來源檔案):必須是已存在的檔案,
- 否則會產生『找不到來 源檔』的錯誤
- (err.numer=53)。
- Destination(目的檔案):必須是不存在的檔案,
- 否則會產生『 檔 案已存在』的錯誤
- (err.number=58)。
- 若source與destination 所在目錄相同,
- 則 MoveFile之 功用是更名,若 source與
- destination所在目錄不同,則MoveFile之
- 功用是移動檔案。 範例程式碼如下 :
FileSystemObject.FileExists(Filename)
檔案若存在,則傳回值為true,否則傳回false ****File Access物件(下) *
*TextStream 物件
TextStream 物件為FileSystemObject 物件的
子物件,建立的方法有兩種 *
*OpenTextFile 開啟檔案
set fs=server.CreateObject("Scripting.FileSystemObject") |
set txt=fs.OpenTextFile(參數...) |
OpenTextFile所傳的參數如下:
OpenTextFile(Filename[,IOmode[,Create]])
Filename(檔案名稱)、 IOmode(開啟模式):可以 有下列三種設定值
設定值 | 說明 |
1 | 開啟成為讀的檔案預設值為1 |
2 | 開啟成唯寫的檔案原檔案內容會被清除 |
8 | 開啟成唯寫的檔案原檔案內如保留資料會 從檔案最後面寫入 |
Create(是否自動建檔):預設為false,表開啟的
檔案必須是已經 存在的檔案,若設成true,
則當所要開啟的檔案不存在時 ,
FileSystemObject會自動建立檔案。
其中IOmode與Create參數可省略。
CreateTextFile 建立新檔案
set fs=server.CreateObject("Scripting.FileSystemObject") |
set txt=fs.CreateTextFile(參數...) |
CreateTextFile所傳的參數如下:
CreateTextFile(Filename[,Overwrite])
OverWrite(是否覆寫原檔案):需建立在檔案 已存在的情況下,此 參數才有效。若設為
true(預設),則原檔案會被覆寫,若 設為false,
則會出現『檔案已存在』的錯誤。
讀取檔案的方法
- ReadLine:從檔案中讀取一行資料,如下例:
- Read(N):從檔案中讀取N個位元組的資料,
- 如下例:
- ReadAll:讀取檔案中的所有資料,如下例:
寫入檔案的方法
- WriteLine:會在資料後加vbCrLf,才將資料
- 寫到檔案中。
- Write:原原本本將資料寫入檔案中,如下例:
***********************THE END*********************