1 / 54

第 11 章 ASP.NET的Web應用程式

第 11 章 ASP.NET的Web應用程式. 11-1 ASP.NET 應用程式的基礎 11-2 Global.asax 檔的使用 11-3 Application 物件的狀態管理 11-4 Session 物件的狀態管理 11-5 Application 與 Session 物件的使用 11-6 在網頁間傳遞 Web 表單內容 11-7 使用 web.config 組態檔 11-8 ASP.NET 2.0 的網站設定工具. 11-1 ASP.NET應用程式的基礎. 11-1-1 ASP.NET 的 Web 應用程式 11-1-2 網頁間資料分享的基礎

viveca
Download Presentation

第 11 章 ASP.NET的Web應用程式

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第11章 ASP.NET的Web應用程式 • 11-1 ASP.NET應用程式的基礎 • 11-2 Global.asax檔的使用 • 11-3 Application物件的狀態管理 • 11-4 Session物件的狀態管理 • 11-5 Application與Session物件的使用 • 11-6 在網頁間傳遞Web表單內容 • 11-7 使用web.config組態檔 • 11-8 ASP.NET 2.0的網站設定工具

  2. 11-1 ASP.NET應用程式的基礎 • 11-1-1 ASP.NET的Web應用程式 • 11-1-2 網頁間資料分享的基礎 • 11-1-3 網頁間的資料傳遞方法

  3. 11-1-1 ASP.NET的Web應用程式 • ASP.NET應用程式是一種.NET Framework應用程式,它是在Web伺服器上執行的應用程式,稱為Web應用程式。ASP.NET應用程式就是HttpApplication類別的物件,負責處理應用程式的HTTP請求。 • 在IIS的Web伺服器能夠將整個網站,或指定網站目錄建立成Web應用程式。IIS能夠在同一個網站建立多個Web應用程式,每一個虛擬目錄都可以建立成為Web應用程式。

  4. 11-1-2 網頁間資料分享的基礎- Session期間 • ASP.NET的【Session期間】是指Web應用程式從一頁ASP.NET網頁移到其他ASP.NET網頁過程中所花費的時間,並不是指第11-4節的Session物件。 • 在ASP.NET是使用Sytem.Web.SessionState名稱空間的類別來管理Session期間的資訊,也就是建立Session物件來保留Session期間的資料。

  5. 11-1-2 網頁間資料分享的基礎-網站的資料分享 • 當使用者進入網站,如果是會員管理網站,在登入後可以取得使用者的瀏覽權限,但是伺服端並不知道目前客戶端有哪些使用者正在瀏覽,和其使用狀態。因為使用者在移至其他網頁時,使用者登入資料並不會自動傳給下一頁網頁。 • 資料分享主要分為兩種,如下所示: • 分享給網站所有使用者:在ASP.NET程式可以使用Application變數進行分享,例如:目前線上的使用者數。 • 每位使用者的專屬資料:在ASP.NET程式可以使用Session變數進行分享,例如:登入使用者的權限。

  6. 11-1-3 網頁間的資料傳遞方法-說明 • 在ASP.NET程式間的資料傳遞方法,換個角度來說,就是如何保留使用者狀態的方法,稱為「狀態管理」(State Management)。 • 以資料儲存的位置分為兩大類: • 客戶端 • 伺服端

  7. 11-1-3 網頁間的資料傳遞方法-客戶端的狀態管理 • 客戶端的狀態管理是將資料儲存在使用者電腦,或是直接儲存在ASP.NET程式建立的網頁中,如下表所示:

  8. 11-1-3 網頁間的資料傳遞方法-伺服端的狀態管理 • 伺服端的狀態管理是將資料儲存在伺服器電腦,換句話說,它會佔用Web伺服器的系統資源,如下表所示:

  9. 11-2 Global.asax檔的使用 • 11-2-1 Global.asax檔案的架構 • 11-2-2 Global.asax檔案的使用

  10. 11-2-1 Global.asax檔案的架構-新增Global.asax檔案 • ASP.NET的Global.asax檔案是ANSI文字檔案,使用Windows記事本或VWD都可以編輯Global.asax檔案內容。 • Visual Web Developer可以新增Global.asax檔案。請啟動VWD開啟「Ch11」網站後,執行「檔案/新增/檔案」指令,可以看到「加入新項目」對話方塊。

  11. 11-2-1 Global.asax檔案的架構-Global.asax檔案架構 <%@ Application Language="VB" %> <script Runat="server"> Sub Application_Start(ByVal Sender As Object, _ ByVal E As EventArgs) End Sub Sub Application_End(ByVal Sender As Object, _ ByVal E As EventArgs) End Sub Sub Application_Error(ByVal Sender As Object, _ ByVal E As EventArgs) End Sub Sub Session_Start(ByVal sender As Object, _ ByVal e As EventArgs) End Sub Sub Session_End(ByVal sender As Object, _ ByVal e As EventArgs) End Sub </script>

  12. 11-2-1 Global.asax檔案的架構-說明

  13. 11-2-2 Global.asax檔案的使用-執行順序1 • 當使用者請求ASP.NET程式後,就會替每位使用者建立Session期間和Application物件,接著檢查ASP.NET應用程式是否擁有Global.asax檔案。 • 如果有Global.asax檔案,就將它編譯成繼承HttpApplication類別的物件,然後在執行ASP.NET檔案的程式碼前觸發Application_Start事件,執行Global.asax檔案的Application_Start()事件處理程序,接著建立Session物件,因為Global.asax檔案存在,接著執行Session_Start()事件處理程序。

  14. 11-2-2 Global.asax檔案的使用-執行順序2 • 當Session期間超過TimeOut屬性的設定(預設20分鐘)或執行Abandon()方法,表示Session期間結束,就觸發Session_End執行Session_End()事件處理程式,處理程序是在關閉Session物件前執行。 • Web伺服器如果關機,在關閉Application物件前就會執行Application_End()事件處理程序,當然也會結束所有使用者的Session期間,和執行所有使用者的Session_End()事件處理程序。

  15. 11-3 Application物件的狀態管理 • 11-3-1 Application物件的基礎 • 11-3-2 網站的訪客計數

  16. 11-3-1 Application物件的基礎-什麼是Application物件 • Application物件可以建立Application變數,它和一般程式變數不同,Application變數是一個Contents集合物件,此變數可以提供造訪網站的每位使用者一個分享資料的管道,因為Application變數允許網站每位使用者取得或更改其值。 • Application物件是在第1個Session物件建立後建立,Application物件的範圍直到Web伺服器關機或所有的使用者都離線後才會刪除。

  17. 11-3-1 Application物件的基礎-Application變數的使用 • 不論網站有多少位使用者同時瀏覽網站(不是指登入網站的使用者),在伺服端記憶體只保留一份Application變數,其變數格式如下: Application("HitCounter") = 1234 • 上述程式碼將名為Hit_Counter的Application變數設為1234,此變數和ASP.NET程式變數不一樣,它是取得Contents集合物件的元素,變數名稱是字串。

  18. 11-3-1 Application物件的基礎-Application狀態管理的同步 • ASP.NET應用程式的每位使用者都可以存取Application變數,使用者可以同時讀取Application變數,但是如果有一位更改資料,其他讀取資料,此時資料衝突情況就會發生,為了避免此情況,需要考慮同步問題。 • 在Application物件提供Lock()和Unlock()方法,可以保障在同一時間內,只允許一位使用者存取Application變數,其程式碼如下所示: Application.Lock() Application("HitCounter")= _ Application("HitCounter")+1 Application.Unlock()

  19. 11-3-2 網站的訪客計數-說明 • 網站的訪客計數是一種必備元件,其目的是顯示有多少位訪客曾經瀏覽網站,顯示資訊可以從開站以來的訪客數,或一段時間內的訪客數。 • ASP.NET的訪客計數是在Global.asax檔案的Session_Start()事件處理程序,使用Application變數記錄訪客計數,如下所示: Application("HitCounter")= _ Application("HitCounter")+1 • 上述Application變數記錄目前的訪客計數,別忘了!使用Lock()和Unlock()方法。

  20. 11-3-2 網站的訪客計數-圖例

  21. 11-4 Session物件的狀態管理 • 11-4-1 Session物件的基礎 • 11-4-2 目前有多少人在線上

  22. 11-4-1 Session物件的基礎-什麼是Session物件 • 每一個Session物件擁有唯一的Session ID編號,在整個瀏覽ASP.NET應用程式的過程(造訪不同ASP.NET程式時),都可以存取Session物件建立的變數。 • 在ASP.NET的Web應用程式是使用Session ID判斷使用者是否仍在Session期間,它是直到Session物件TimeOut屬性設定時間到時(預設值20分鐘),或執行Abandon()方法後才會結束Session期間。

  23. 11-4-1 Session物件的基礎-Session變數的使用 • Session變數是使用者的專屬資料,雖然每位使用者的Session變數名稱相同,但是值可能不同。而且只有該位使用者才能存取自己的Session變數。 • 例如:使用者hueyan進入網站,建立Session變數的程式碼如下: Session("username") = "hueyan" Session("password") = "1234" • 上述Session變數屬於使用者hueyan。接著另一位使用者jane也進入網站,也會替他建立一組Session變數,其程式碼如下: Session("username") = "jane" Session("password") = "4567"

  24. 11-4-2 目前有多少人在線上 • 訪客計數是歷史記錄,線上使用者數是目前的即時狀態,如果想知道目前有多少位使用者停留在網站?其最大問題是如何判斷使用者目前仍在線上,我們可以指定TimeOut屬性,以停留在網站多久時間來判斷是否為線上使用者,如下所示: Session.TimeOut = 5 • 上述程式碼指定值是分鐘,也就是說停留5分鐘的使用者算是目前線上的使用者,不過,Application_Start()事件處理程序並不能指定TimeOut屬性,它是位在Session_Start()事件處理程序。

  25. 11-5 Application與Session物件的使用 • 11-5-1 正確使用Application和Session變數 • 11-5-2 使用Application和Session物件儲存物件

  26. 11-5-1 正確使用Application和Session變數 • Session變數不同於Application變數,其儲存資料是使用者專屬資料,換句話說,除非是使用者相關資料,否則使用Session變數只是浪費伺服器的記憶體資源。 • Session變數的目的是儲存使用者專屬資料,對於固定內容的變數,應該使用Application變數,因為Appliction變數是分享給所有使用者。

  27. 11-5-2 使用Application和Session物件儲存物件 • Application和Session變數可以用來儲存Hashtable集合物件,如下所示: Dim userArray As Hashtable = New Hashtable(5) Application("UserList") = userArray • 不只如此,還可以儲存ADO.NET的DataView物件,如下所示: Dim objView As DataView= _ New DataView(objDs.Tables(0)) Application("Source") = objView

  28. 11-6 在網頁間傳遞Web表單內容 • 11-6-1 使用URL參數 • 11-6-2 使用Session變數 • 11-6-3 使用Web表單的類別屬性 • 11-6-4 使用PreviousPage物件

  29. 11-6-1 使用URL參數-說明 • 舊版ASP的網頁間資料傳遞除了使用表單外,還可以使用URL網址參數來傳遞資料,在接收網頁是使用QueryString集合物件取得傳遞值,其優點是簡單,但問題是瀏覽程式網址欄會顯示傳遞值。 • 筆者準備建立擁有2個步驟的Web表單,在輸入使用者名稱和密碼後,按【下一步】鈕在第二頁ASP.NET程式顯示使用者資料。

  30. 11-6-1 使用URL參數-步驟一 • 在步驟一的Web表單擁有2個TextBox控制項,可以輸入使用者資料,按【下一步】鈕執行GotoNextStep()事件處理程序,如下所示: Sub GotoNextStep(Sender As Object, E As Eventargs) Dim url As String url = "Ch11-6-1Second.aspx?username=" & _ user.Text & "&password=" & _ pass.Text Response.Redirect(url) End Sub

  31. 11-6-1 使用URL參數-步驟二 • 在步驟二ASP.NET程式的Page_Load()事件處理程序,可以使用QueryString集合物件取得參數值,如下所示: Sub Page_Load(Sender As Object, _ E As Eventargs) name.Text = _ Request.QueryString("username") pass.Text = _ Request.QueryString("password") End Sub

  32. 11-6-2 使用Session變數-步驟一 • 步驟一的Web表單擁有2個TextBox控制項,可以輸入使用者資料,按【下一步】鈕執行GotoNextStep()事件處理程序,如下所示: Sub GotoNextStep(Sender As Object, _ E As Eventargs) Session("UserName") = user.Text Session("Password") = pass.Text Response.Redirect( _ "Ch11-6-2Second.aspx") End Sub

  33. 11-6-2 使用Session變數-步驟二 • 在步驟二ASP.NET程式的Page_Load()事件處理程序,使用Session變數取得傳遞的變數值,如下所示: Sub Page_Load(Sender As Object, _ E As Eventargs) name.Text = Session("UserName") pass.Text = Session("Password") Session.Remove("UserName") Session.Remove("Password") End Sub

  34. 11-6-3 使用Web表單的類別屬性-定義Page類別的屬性 • Web表單可以使用Page類別屬性來傳遞表單資料。我們可以使用Page指引的ClassName屬性指定類別名稱,如下所示: <%@ Page Language="VB" ClassName="firstStepClass" %> • Page指引的CalssName屬性指定類別名稱是firstStepClass,接著可以使用Property指令定義類別的屬性,如下所示: Public ReadOnly Property UserName() As String Get Return user.Text End Get End Property

  35. 11-6-3 使用Web表單的類別屬性-步驟一 • 步驟一的Web表單擁有2個TextBox控制項,可以輸入使用者資料,程式開頭的Page指引指令,如下所示: <%@ Page Language="VB" ClassName="firstStepClass" %> • 按【下一步】鈕執行GotoNextStep()事件處理程序,在<script>標籤的程式碼建立2個屬性UserName和Password,屬性值是TextBox控制項的Text屬性,最後GotoNextStep()程序使用Server.Transfer()方法轉址至步驟二的ASP.NET程式。

  36. 11-6-3 使用Web表單的類別屬性-步驟二 • 步驟二ASP.NET程式的開頭是Reference指引,如下所示: <%@ Reference Page="Ch11-6-3.aspx" %> • Page_Load()事件處理程序可以取得屬性值,如下所示: Sub Page_Load(Sender As Object, E As Eventargs) If Not IsPostBack Then Dim fs As firstStepClass = Context.Handler name.Text = fs.UserName pass.Text = fs.Password End If End Sub

  37. 11-6-4 使用PreviousPage物件-步驟一 • ASP.NET 2.0版可以使用PreviusPage物件執行跨ASP.NET程式的Web表單送回。 • 步驟一的Web表單擁有2個TextBox控制項,可以輸入使用者資料,在Button控制項使用PostBackUrl屬性指定送回的ASP.NET程式,如下所示: <asp:Button Id="Button" Text="下一步" Runat="server“ PostBackUrl="Ch11-6-4Second.aspx"/>

  38. 11-6-4 使用PreviousPage物件-步驟二 • 在步驟二ASP.NET程式的Page_Load()事件處理程序,使用FindControl()方法取得前一頁ASP.NET的控制項,如下所示: Sub Page_Load(Sender As Object, E As Eventargs) If Not IsPostBack Then Dim txt As TextBox txt = PreviousPage.FindControl("user") name.Text = txt.Text txt = PreviousPage.FindControl("pass") pass.Text = txt.Text End If End Sub

  39. 11-7 使用web.config組態檔 • 11-7-1 Web組態檔的基礎 • 11-7-2 appSettings與connectionStrings區段的參數和連結字串 • 11-7-3 在sessionState區段設定Session狀態 • 11-7-4 globalization區段的編碼設定 • 11-7-5 compilation區段的編譯設定 • 11-7-6 customErrors區段的自訂錯誤網頁

  40. 11-7-1 Web組態檔的基礎-說明 • Web組態檔web.config是ASP.NET技術Web應用程式的資源設定檔案,它是一份XML文件,內含Web應用程式相關設定的XML標籤,可以用來簡化ASP.NET應用程式的相關設定。 • Web組態檔web.config是位在Web應用程式的任何目錄,子目錄如果沒有web.config檔案,就是繼承父目錄web.config檔案的相關設定;如果子目錄擁有web.config檔案,就會覆寫父目錄web.config檔案的相關設定。

  41. 11-7-1 Web組態檔的基礎-範例 <configuration> <appSettings> <add key="dbType" value="Access Database"/> </appSettings> <connectionStrings> <add name="provider" connectionString="Microsoft.Jet.OLEDB.4.0;"/> <add name="database" connectionString="/Ch11/Products.mdb"/> </connectionStrings> <system.web> <sessionState cookieless="false" timeout="10"/> <globalization fileEncoding="big5" requestEncoding="big5" responseEncoding="big5" culture="zh-TW"/> <compilation defaultLanguage="VB" debug="true"/> <customErrors mode="RemoteOnly"/> </system.web> </configuration>

  42. 11-7-1 Web組態檔的基礎-標籤說明1

  43. 11-7-1 Web組態檔的基礎-標籤說明2

  44. 11-7-2 appSettings與connectionStrings區段的參數和連結字串-web.config的內容 • 在Web組態檔的<appSettings>區段可以新增ASP.NET程式所需的參數,可以指定資料庫連結字串,如下所示: <configuration> <appSettings> <add key="dbType" value="Access Database"/> </appSettings> <connectionStrings> <add name="provider" connectionString="Microsoft.Jet.OLEDB.4.0;"/> <add name="database" connectionString="/Ch11/Products.mdb"/> </connectionStrings> </configuration>

  45. 11-7-2 appSettings與connectionStrings區段的參數和連結字串-Conifguration API的基礎 • ASP.NET 2.0版的Configuration API可以存取web.config和machine.config組態檔的設定資料。在ASP.NET程式是使用System.Web.Configuration名稱空間的WebConfigurationManager類別來存取相關設定,如下所示: Dim dbType As String = _ WebConfigurationManager.AppSettings("dbType") Dim pd, db As String pd=WebConfigurationManager.ConnectionStrings( _ "provider").ConnectionString db=WebConfigurationManager.ConnectionStrings( _ "database").ConnectionString

  46. 11-7-3 在sessionState區段設定Session狀態 • ASP.NET的Session狀態管理擁有擴充性,我們可以在web.config檔案的<sessionState>區段設定Session狀態管理,它屬於<system.web>的子標籤,如下所示: <configuration> <system.web> <sessionState cookieless="false" timeout="10"/> ……… </system.web> </configuration>

  47. 11-7-4 globalization區段的編碼設定 • 在<system.web>子標籤的<globalization>區段是本地化相關設定,可以設定ASP.NET程式預設的檔案編碼、請求和回應的編碼方式、日期時間格式和數字等本地化等相關設定,如下所示: <configuration> <system.web> <globalization fileEncoding="big5" requestEncoding="big5" responseEncoding="big5" culture="zh-TW"/> ……… </system.web> </configuration>

  48. 11-7-5 compilation區段的編譯設定 • 在<system.web>子標籤的<compilation>區段,可以設定ASP.NET程式預設的編譯方式,如下所示: <configuration> <system.web> <compilation defaultLanguage="VB" debug="true"/> ……… </system.web> </configuration>

  49. 11-7-6 customErrors區段的自訂錯誤網頁-說明 • 在<system.web>子標籤<customErrors>區段,可以設定ASP.NET程式的自訂錯誤網頁。例如:錯誤代碼HTTP 404,如下圖所示:

  50. 11-7-6 customErrors區段的自訂錯誤網頁-指定錯誤網頁 • 在<customErrors>區段可以指定錯誤網頁,如下所示: <configuration> <system.web> <customErrors mode="On“ defaultRedirect="Ch11-7error.htm"/> ……… </system.web> </configuration>

More Related