第2章 Visual Basic語法的ASP.NET程式
2-1 Visual Basic 2005的基礎 2-1-1 微軟Visual Basic 2005 2-1-2 物件的基本觀念
2-1-1 微軟Visual Basic 2005 等到2005年底推出.NET Framework 2.0版和Visual Studio 2005,Visual Basic語言也更名為最新版本Visual Basic 2005。 在新版Visual Basic 2005支援無符號資料型態、Continue敘述和IsNot運算子,在物件導向部分支援運算子過載(Operator Overloading)和泛型程式設計(Generics Programming)等。 它是建立ASP.NET 2.0版預設的腳本語言,所以本書是使用Visual Basic 2005語法來建立ASP.NET 2.0版的Web應用程式。
2-1-2 物件的基本觀念-物件 物件(Objects) 物件為物件導向程式的基礎,簡單的說物件是資料(Data)和包含處理資料函式(稱為方法)的綜合體。 「類別」(Class)可以定義物件,使用類別建立物件,在建立好物件後,並不用考慮物件內部的處理方式,只需知道提供的屬性和方法和如何使用,就可以使用這些物件。
2-1-2 物件的基本觀念-屬性 屬性(Properties) 物件的屬性是物件的性質和狀態,例如:Response物件的ContentType屬性,String物件的Length屬性可以取得字串長度等。
2-1-2 物件的基本觀念-方法 方法(Methods) 方法是物件的處理函數,例如:Response物件擁有的方法,如下所示: Response.Write() Response.Redirect()
2-1-2 物件的基本觀念-事件 事件(Events) 「事件」(Event)是在執行應用程式時,初始化、滑鼠或鍵盤等操作所觸發的一些動作。物件可以建立程序來處理指定的事件,例如:Page物件的Load事件,我們可以建立處理此事件的程序,如下所示: Sub Page_Load(Sender As Object, E As Eventargs) ……. End Sub
2-1-2 物件的基本觀念-集合物件 集合物件(Collections) 集合物件如同此名是一組物件的集合,例如:Response物件的集合物件Cookies(通常是使用屬性來取得此集合物件),如下所示: Response.Cookies("name").Value
2-2 ASP.NET程式的基本架構 2-2-1 建立ASP.NET程式 2-2-2 Visual Basic程式的基本撰寫規格
2-2-1 建立ASP.NET程式-說明 ASP.NET可以將程式碼內嵌在HTML或XHTML文件的標籤中,也就是將Visual Basic程式碼置於「<%」和「%>」符號之間,如下所示: <%………%> 在上述符號間是合法的Visual Basic程式片斷,如果HTML文件擁有上述程式碼,就表示是一頁ASP.NET程式,副檔名為.aspx。
2-2-1 建立ASP.NET程式-執行過程 ASP.NET程式的執行過程是將程式碼編譯執行後,將執行結果傳回瀏覽程式顯示(只有第1次請求ASP.NET程式時,才會進行編譯,之後的請求會直接傳回執行結果,來加速網頁瀏覽效率)。其執行過程如下圖所示:
2-2-1 建立ASP.NET程式-範例 01: <%@ Page Language="VB" %> 02: <html> 03: <head><title>Ch2-2-1.aspx</title></head> 04: <body> 05: <% ' 變數宣告 06: Dim fontSize1,fontSize2, i As Integer 07: fontSize1 = 3 08: fontSize2 = 5 09: ' 設定字型尺寸由小變大 10: For i = fontSize1 To fontSize2 %> 11: <font size=<%=i%>> 12: <p>第一個ASP.NET 2.0程式</p> 13: <% Next 14: Response.Write("大家好!") 15: %> 16: </body> 17: </html>
2-2-1 建立ASP.NET程式-儲存 ASP.NET程式的副檔名【.aspx】,ASP則是【.asp】。當使用Windows【記事本】編輯ASP.NET程式時,其預設儲存的副檔名為【.txt】文字檔案。 請在【存檔類型】選【所有檔案】,【檔案名稱】欄輸入檔案全名,即含副檔名,以此例為【Ch2-2-1.aspx】,按【儲存】鈕儲存成ASP.NET程式檔案。 在Visual Web Developer開啟Web網站【Ch02】後,就可以參考第1-6-3節新增名為【Ch2-2-1.aspx】的ASP.NET程式。
2-2-1 建立ASP.NET程式-測試執行1 ASP.NET程式需要公佈到Web伺服器後才能執行預覽,請將「Ch02」資料夾建立成虛擬目錄。然後啟動Internet Explorer,在【網址】欄輸入URL網址,如下所示: http://localhost/Ch02/Ch2-2-1.aspx
2-2-1 建立ASP.NET程式-測試執行2 在Visual Web Developer開啟「Ch02」Web網站後,按二下Ch2-2-1.aspx就可以編輯ASP.NET程式碼。 請執行「檔案/在瀏覽器中檢視」指令,就可以預覽ASP.NET程式的執行結果。
2-2-2 Visual Basic程式的基本撰寫規格-命名規則 在程式碼除了語言的「關鍵字」(Keywords)外,大部分都是程式設計者自訂的元素名稱,稱為「識別字」(Identifier)。Visual Basic的命名原則,如下所示: 不可使用Visual Basic的關鍵字或系統的物件名稱。 必須是英文字母或底線「_」開頭,如果以底線開頭,至少需要一個英文字母或數字。 名稱長度不可超過16383個字元,不區分英文大小寫,abc和ABC代表同一個名稱。 名稱中間不能有句點「.」或空白,只能是英文字母、數字和底線。 在宣告的有效範圍內須唯一,關於有效範圍的說明,請參閱本章後的程序和函數。
2-2-2 Visual Basic程式的基本撰寫規格-Visual Basic的註解 程式註解是程式設計上很重要的部分,良好註解不但能夠輕易了解程式目的,在維護上,也可以提供更多資訊。 Visual Basic程式的註解是以REM指令或「’」符號開始的列,或程式列上此符號之後的內容,如下所示: REM 變數的宣告 ' 大家好 Dim size1,size2 As Integer ' 變數的宣告
2-2-2 Visual Basic程式的基本撰寫規格-對於太長的程式碼 Dim size1,size2,size3,size4,size5 _ ,size6,size7,size8,size9 As Integer
2-2-2 Visual Basic程式的基本撰寫規格-註解規則 程序和重要變數宣告前最好使用註解文字來說明其用途,對於每一個程序或函數的註解,如下表所示:
2-2-2 Visual Basic程式的基本撰寫規格-程式碼格式和縮排原則 記得使用縮排來編排程式碼,如此可以輕鬆展示程式碼的邏輯和迴路架構,例如:迴路區塊的程式碼縮幾格編排,如下所示: For i = 1 To 10 Step 1 total = total + i Next
2-3 Visual Basic的變數與資料型態 2-3-1 變數的資料型態 2-3-2 變數、常數宣告與指定敘述 2-3-3 陣列
2-3-1 變數的資料型態-說明 Visual Basic變數並沒有強調一定需要宣告資料型態,如果沒有宣告資料型態,預設資料型態是Object。 Object是所有Visual Basic資料型態的根資料型態,如果變數是Object資料型態,表示此變數可以儲存各種資料型態的資料。
2-3-1 變數的資料型態-Visual Basic的資料型態1
2-3-1 變數的資料型態-Visual Basic的資料型態2
2-3-1 變數的資料型態-Visual Basic的資料型態3
2-3-2 變數、常數宣告與指定敘述-變數宣告1 Visual Basic變數是使用【Dim】指令進行宣告,如下所示: Dim size 程式碼宣告變數size,因為沒有指定資料型態,預設資料型態為Object,可以用來儲存各種資料型態的值。在宣告變數時,可以使用As關鍵字來指定使用的資料型態,如下所示: Dim size1,size2 As Integer 程式碼宣告2個整數Integer資料型態的變數。
2-3-2 變數、常數宣告與指定敘述-變數宣告2 如果同一列宣告的2個變數是不同資料型態,也可以分別指定資料型態,如下所示: Dim name As String,size3 As Integer 程式碼宣告2個變數,一為字串,一為整數型態。如果需要,還可以在宣告時,同時指定變數初值,如下所示: Dim name As String ,size3 As Integer=100
2-3-2 變數、常數宣告與指定敘述-常數宣告 常數在程式碼中,只是使用名稱來取代固定數值或字串,與其將常數視為變數,不如說它是名稱轉換,將一些數值的值,使用有意義的名稱來取代。 Visual Basic本身擁有一些內建常數,不過,使用者可以使用Const關鍵字來建立常數,常數在宣告時,同時需要指定其值,如下所示: Const MAX_SIZE = 100
2-3-2 變數、常數宣告與指定敘述-指定敘述 Visual Basic變數可以使用指定敘述來更改變數值,也就是「=」等號運算子,如下所示: size = 3 name = "陳會安" 上述程式碼指定變數值,2個變數分別是宣告成整數和字串型態的變數。
2-3-3 陣列-說明 陣列是一組變數,如果程式需要使用多個相同資料型態的變數時,就可以直接宣告一組變數的陣列,而不用宣告一堆變數。 陣列是使用陣列索引來存取指定陣列元素的值。
2-3-3 陣列-宣告一維陣列 Visual Basic的陣列同樣是使用【Dim】指令宣告,我們可以在宣告時同時指定陣列尺寸。例如:一維整數陣列的宣告,如下所示: Dim size(2) As Integer Dim num(0 To 2) As Integer 程式碼宣告2個一維陣列,括號值是陣列的最大索引,也可以指定最小索引值0 To 2。 因為索引值是從0開始,所以索引值是0~2共有3個元素。在宣告陣列時,可以指定陣列初值,如下所示: Dim size() As Integer = {3, 7, 5} 程式碼宣告的一維陣列size並沒有指定尺寸,其尺寸是後方初值的個數。陣列索引的最大值是初值個數減一,也就是2。
2-3-3 陣列-存取一維陣列 如果陣列沒有指定初值,還可以使用指定敘述來指定陣列值,如下所示: num(0) = 3 num(1) = 7 num(2) = 5 程式碼是使用指定敘述和陣列索引值,來指定陣列元素的值,取出陣列值的程式碼,如下所示: Dim value As Integer value = num(1)
2-3-3 陣列-二維陣列 同樣的方法,可以宣告多維陣列,如下所示: 程式碼宣告6x6的二維陣列,使用逗號分隔的是各維陣列的尺寸。 Dim arraySize(5, 5) As Integer 程式碼宣告6x6的二維陣列,使用逗號分隔的是各維陣列的尺寸。
2-3-3 陣列-動態陣列 Visual Basic的陣列可以使用【ReDim】指令,在程式執行時重新指定尺寸,不過,ReDim指令並不可以宣告陣列,只能更改現有陣列的尺寸,如下所示: ReDim size(4) 程式碼將前面宣告的size陣列尺寸改為4。如果陣列已經擁有內容,可以使用Preserve指令保留原陣列內容,如下所示: ReDim Preserve size(4)
2-4 Visual Basic的運算子 2-4-1 運算子的優先順序 2-4-2 算術與字串連結運算子 2-4-3 比較運算子 2-4-4 邏輯運算子 2-4-5 指定運算子
2-4 Visual Basic的運算子 在Visual Basic指定敘述的等號右邊,可以是運算式或條件運算式,運算式是由運算子和運算元組成。Visual Basic提供完整算術、比較、連結和邏輯運算子,如下所示: A + B – 1 A >= B A < B And A > 1 上述運算式的變數A、B和數值1是運算元,+、-、<、>=和>為運算子。
2-4-1 運算子的優先順序 如果運算子沒有優先順序的差異,運算式依照出現的順序,由左到右依序執行。 括號內比括號外的先執行,括號的目的是推翻現有優先順序,在括號內仍然依照正常的優先順序來執行運算。 當運算式擁有多種運算子時,算術運算子最先,接著是比較運算子,最後才是邏輯運算子,其優先順序如下所示: 算術運算子 > 比較運算子 > 邏輯運算子 比較運算子都擁有相同的優先順序。 算術運算子的加和減法優先順序相同,乘和除法擁有相同的優先順序,不過乘除高於加減,如下所示: ^指數 > (-)負號 > */乘除 > \整數除法 > Mod餘數 > +-加減 > & 邏輯運算子的優先順序,如下所示: Not > And, AndAlso > Or, OrElse, Xor
2-4-2 算術與字串連結運算子 Visual Basic字串連結運算子「&」的優先順序是在算術運算子後,但是在比較運算子之前,如下表所示:
2-4-3 比較運算子 比較運算子沒有優先順序分別,Is和IsNot運算子並非比較物件,而是檢查2個物件是否指向相同物件,或不是指向相同物件,如下表所示:
2-4-4 邏輯運算子-說明 Visual Basic迴路和條件敘述的判斷條件如果不只一個,可以使用邏輯運算子連結多個條件運算式,以便建立出複雜的判斷條件,如下表所示:
2-4-4 邏輯運算子-範例 對於複雜的條件運算式,可以使用邏輯運算子來連結。一些實際的運算式範例,如下表所示:
2-4-5 指定運算子 指定運算子除了使用在指定敘述「=」外,還可以配合其他運算子來簡化運算式,建立簡潔的算術運算式,如下表所示:
2-5 Visual Basic的流程控制 2-5-1 是否選和二選一 2-5-2 多選一的條件敘述 2-5-3 For/Next迴路 2-5-4 Do/While與Until/Loop迴路 2-5-5 Continue與Exit敘述
2-5 Visual Basic的流程控制-說明 一般來說,程式碼除了是一列指令接著一列指令循序的執行外,針對複雜的工作,為了達成預期的執行結果,我們還需要使用「流程控制結構」(Control Structures)來控制程式的執行。 流程控制是使用條件運算式來進行判斷,以便執行不同區塊的程式碼,或是重複執行指定區塊的程式碼。
2-5 Visual Basic的流程控制-種類 流程控制指令分成兩類,如下所示: 條件控制:條件控制是一個選擇題,可能是單一選擇或多選一,依照條件運算式的結果,決定執行哪一個區塊的程式碼。 迴路控制:迴路控制可以重複執行指定區塊的程式碼,而且在迴路中擁有結束條件,可以結束迴路的執行。
2-5-1 是否選和二選一-If/Then條件敘述 If/Then條件敘述只是決定是否執行區塊內的程式碼,如果If條件為True,就執行Then/End If間的程式碼,如下所示: If score >= 60 Then Response.Write("陳會安成績及格<br>") End If 條件如果為True,就執行其間區塊的程式碼,顯示成績及格,如果False就不執行程式碼。 如果If條件True時只會執行一列程式碼,可以省掉End If,如下所示: If score >= 60 Then Response.Write("陳小安及格<br>")
2-5-1 是否選和二選一-If/Then/Else條件敘述 我們只需加上Else指令,If條件為True時執行Then/Else間的程式碼,False執行Else/End If間的程式碼,如下所示: If score >= 60 Then Response.Write("江小魚成績及格<br>") Else Response.Write("江小魚成績不及格<br>") End If
2-5-2 多選一的條件敘述-If/Then/ElseIf條件敘述 If/Then/ElseIf條件敘述是If/Then條件敘述的擴充,只是新增ElseIf關鍵字來建立多選一條件敘述,如下所示: If dayValue = 1 Then Response.Write("星期日<br>") ElseIf dayValue = 2 Then Response.Write("星期一<br>") ……… ElseIf dayValue = 7 Then Response.Write("星期六<br>") Else Response.Write("無法分辨是星期幾<br>") End If
2-5-2 多選一的條件敘述-Select Case條件敘述 Select Case dayValue Case 1: Response.Write("周日假期<br>") Case 2, 3, 4 To 6 Response.Write("工作天<br>") Case 7: Response.Write("周末假日<br>") Case Else Response.Write("無法分辨是星期幾<br>") End Select
2-5-3 For/Next迴路-For/Step/Next迴路 For/Step/Next指令敘述執行的迴路是固定次數,以Step值來增加或減少,如果Step為1可以省略Step關鍵字。例如:使用For/Step/Next迴路,每次增加1,執行1到10次相加的迴路,如下所示: Dim i, total As Integer For i = 1 To 10 Step 1 total += i Next 程式碼是從1加到10計算總和。如果使用負數的Step,如下所示: For i = 10 To 1 Step -1
2-5-3 For/Next迴路-For Each/In/Next迴路 Dim objName As New ArrayList Dim name As String objName.Add("陳會安") objName.Add("江小魚") objName.Add("張無忌") For Each name In objName Response.Write(name & “<br>”) Next
2-5-4 Do/While與Until/Loop迴路-說明 Do迴路是執行迴路到條件為False為止,可以在迴路開始或結束使用While或Until關鍵字來測試迴路條件。 如果在迴路尾測試條件,迴路至少執行一次,請注意!Do迴路需要自己處理迴路的結束條件和計數器增減。
2-5-4 Do/While與Until/Loop迴路-While當條件成立時 Do/Loop迴路如果使用While條件,條件是在迴路開頭檢查,如下所示: Dim total As Integer = 0 Dim counter As Integer = 1 Do While counter <=10 total += counter counter += 1 Loop 迴路的變數counter是計數器,用來控制迴路執行的次數,迴路可以計算從1加到10的總和,結束條件是counter > 10。
2-5-4 Do/While與Until/Loop迴路-Until直到條件成立 Do/Loop迴路如果使用Until條件,結束條件是在迴路尾檢查,如下所示: Dim total As Integer = 0 Dim counter As Integer = 1 Do total += counter counter += 1 Loop Until counter > 10 上述迴路也是從1加到10計算總和,結束條件為counter > 10。
2-5-5 Continue與Exit敘述-1 Continue敘述是Visual Basic 2005新增的程式敘述,可以在迴路中馬上執行下一次迴路,如下所示: For counter = 0 to 100 ……… If counter Mod 2 = 0 Then Continue For Next For/Next迴路當If條件成立時,馬上執行Continue For繼續下一個迴路,換句話說,如果是偶數,就不會執行If條件之後的程式碼。Do/Loop迴路是使用Continue Do來馬上執行下一次迴路。
2-5-5 Continue與Exit敘述-2 在迴路尚未到達結束條件時,我們可以使用Exit敘述強迫跳出迴路來結束迴路的執行,如下所示: For counter = 0 to 100 If counter > 10 Then Exit For ……… Next 在For/Next迴路中,使用If條件判斷是否已經執行到10,如果是,執行Exit For敘述中斷迴路的執行。Do/Loop迴路是使用Exit Do來中斷迴路執行。
2-6 Visual Basic的程序與函數 2-6-1 程序與函數 2-6-2 變數的有效範圍與參數的傳遞
2-6-1 程序與函數-Sub副程序 Sub程序是一個程式區塊的Visual Basic程式碼,使用Sub和End Sub包圍,程序並沒有傳回值,如下所示: Sub addOne2N(maxValue As Integer) Dim total As Integer = 0 Dim counter As Integer = 1 While counter <= maxValue total += counter counter += 1 End While Response.Write("1加到" & maxValue & _ "的和: " & total & "<br>") End Sub
2-6-1 程序與函數-Function函數 Function函數是使用Function和End Function包圍,函數擁有傳回值,傳回方式是使用Return指令,如下所示: Function add2Five() Dim i, total As Integer For i = 1 To 5 Step 1 total += i Next Return total End Function
2-6-1 程序與函數- Call關鍵字呼叫程序與函數 Call關鍵字可以呼叫函數或程序,正確的說,只有在呼叫程序時,才需要使用Call,如下所示: Call addOne2N(15) addOne2N(100) 函數擁有傳回值,所以呼叫函數通常是在運算式的指定敘述右邊,如下所示: total = add2Five()
2-6-1 程序與函數-ASP.NET程式的標籤寫法 ASP.NET程式的程序與函數不能使用「<%」和「%>」符號內嵌於HTML文件,而需要使用<script>標籤,如下所示: <script Language="VB" Runat="server"> ………… </script>
2-6-2 變數的有效範圍與參數的傳遞-變數範圍 Visual Basic的迴路和條件指令程式碼都是一個個「程式區塊」(Blocks),程序與函數也是程式區塊。宣告變數的有效範圍,也就是程式碼可以存取此變數的範圍,如下所示: 區塊變數範圍(Block Scope):使用End、Loop和Next結束的流程控制屬於程式區塊,在程式區塊內宣告的變數,只能在區塊內使用,如果在區塊外就不能使用。 區域變數範圍(Local Scope):程序和函數內宣告的變數,只能在此程序或函數間使用,稱為區域變數。 全域變數範圍(Global Scope):如果變數是在程序和函數外宣告,在程式的各程序和函數都可以使用此變數,稱為全域變數。
2-6-2 變數的有效範圍與參數的傳遞-參數傳遞方式 在程序和函數傳入參數的傳遞方式分為兩種,如下所示: ByVal傳值呼叫:只將變數的值傳入程序或函數,並不會更改變數值。 ByRef傳址呼叫:將變數實際儲存的位置傳入,所以會更改變數值。 Visual Basic預設使用傳值呼叫不用加上ByVal,其實只有使用傳址時,才需要指定ByRef。
2-7 Visual Basic的錯誤處理-程式敘述 Visual Basic提供結構化的錯誤處理敘述,即Try/Catch/Finally/End Try,如下所示: Try ' 測試的錯誤程式碼 ……………… Catch e As Exception ' 錯誤處理的程式碼 Finally …………… End Try
2-7 Visual Basic的錯誤處理-程式敘述說明 Try程式區塊:在Try和Catch指令間的程式區塊是Visual Basic可能需要執行錯誤處理的程式碼。 Catch程式區塊:如果Try程式區塊的程式碼發生錯誤,在Catch到Finally指令間的程式區塊會傳入參數e的Exception例外物件,我們可以呼叫e.ToString()取得錯誤資訊字串,或是建立錯誤處理的補救程式碼。 Finally程式區塊:選擇性的程式區塊,可有可無,不論錯誤是否產生,都會執行此區塊的程式碼,通常是用來執行一些善後的程式碼,例如:關閉資料庫連結。