380 likes | 495 Views
第12章 ASP.NET 的 Web 應用程式. 12-1 ASP.NET 應用程式的基礎 12-2 Global.asax 檔的使用 12-3 Application 物件的狀態管理 12-4 Session 物件的狀態管理 12-5 Application 與 Session 物件的使用 12-6 在網頁間傳遞 Web 表單內容 12-7 Web.config 設定 ASP.NET 應用程式. 12-1 ASP.NET 應用程式的基礎. 12-1-1 什麼是 ASP.NET 應用程式 12-1-2 網頁間的資料分享
E N D
第12章 ASP.NET的Web應用程式 • 12-1 ASP.NET應用程式的基礎 • 12-2 Global.asax檔的使用 • 12-3 Application物件的狀態管理 • 12-4 Session物件的狀態管理 • 12-5 Application與Session物件的使用 • 12-6 在網頁間傳遞Web表單內容 • 12-7 Web.config設定ASP.NET應用程式
12-1 ASP.NET應用程式的基礎 • 12-1-1 什麼是ASP.NET應用程式 • 12-1-2 網頁間的資料分享 • 12-1-3 網頁間資料傳遞的方法
12-1-1 什麼是ASP.NET應用程式 • ASP.NET應用程式屬於一種.NET Framework應用程式,這是一種在Web伺服器執行的應用程式,稱為Web應用程式。 • 每一個ASP.NET應用程式擁有很多HttpApplication類別的物件副本,其中一個HttpApplication物件負責處理應用程式的HTTP請求。
12-1-2 網頁間的資料分享 • 網站的分享資料一共有兩種,如下所示: • 分享給網站所有的使用者(例如:目前線上的使用者數),在ASP.NET程式就是所謂的Application變數。 • 只針對每位使用者的專屬資料(例如:登入使用者的權限),在ASP.NET程式就是Session變數。
12-1-3 網頁間資料傳遞的方法-說明 • ASP.NET程式間的資料傳遞方法,換個角度來說,就是如何保留使用者狀態的方法,稱為「狀態管理」(State Management),以資料儲存的位置可以分為兩大類,一是將資料儲存在客戶端,一是儲存在伺服端。
12-1-3 網頁間資料傳遞的方法-客戶端的狀態管理
12-1-3 網頁間資料傳遞的方法-伺服端的狀態管理
12-2 Global.asax檔的使用 • 12-2-1 Global.asax檔案的架構 • 12-2-2 Global.asax檔案的使用
12-2-1 Global.asax檔案的架構 <script language="VB" runat="Server"> Sub Application_Start(sender As Object, e As EventArgs) ' 處理應用程式啟動 End Sub Sub Application_End(sender As Object, e As EventArgs) ' 釋放應用程式的資訊 End Sub Sub Session_Start(sender As Object, e As EventArgs) ' 處理Session期間的開始 End Sub Sub Session_End(Sender As Object, E As EventArgs) ' 釋放session的資源 End Sub </script>
12-2-2 Global.asax檔案的使用-檔案存放的路徑 • 在IIS的Web伺服器,Global.asax檔案能夠放在兩個地方,如下所示: • 網站的主目錄:如果將Global.asax檔案放在此目錄(預設是Web應用程式),不論目錄本身,實際或其虛擬子目錄都可以存取檔案內建立的Application和Session變數。 • 虛擬應用程式的主目錄:如果已經將虛擬目錄設定成Web應用程式,虛擬目錄的根目錄也允許擁有自已的Global.asa檔案。
12-2-2 Global.asax檔案的使用-執行順序 • 如果有Global.asax檔案,它將自動編譯成繼承HttpApplication類別的.NET Framework類別,然後在執行ASP.NET檔案的程式碼前觸發Application_Start事件,執行Global.asax檔案的Application_Start事件程序,接著建立Session物件,因為Global.asax檔案存在,接著執行Session_Start事件處理程序。 • 當Session期間超過TimeOut屬性設定或執行Abandon方法,就表示Session期間結束,就會觸發Session_End執行Session_End事件處理程式在關閉Session物件前執行。 • 當Web伺服器關機時,就會在關閉Application物件前執行Application_End事件處理程序。
12-3 Application物件的狀態管理 • 12-3-1 Application物件 • 12-3-2 網站的訪客計數
12-3-1 Application物件-說明 • Application物件的目的是建立Application變數,這和一般的程式變數並不相同,它是一個Contents物件集合,此變數可以提供造訪網站的每位使用者一個分享資料的管道,因為Application變數的內容允許網站的每位使用者取得或更改其值。 • Application物件會在第一個Session物件建立後建立,Application物件的範圍直到Web伺服器關機或所有的使用者都離線後才會關閉。
12-3-1 Application物件-使用 • 不論網站有多少位使用者同時進入,伺服端只會在記憶體保留一份Application變數,其變數的格式如下: Application("Hit_Counter") = 0 • 上述程式碼是將Application變數Hit_Counter設為0,這個變數和ASP.NET程式變數不一樣,它是取得Contents物件集合的元素,變數名稱是一個字串。
12-3-1 Application物件-同步 • 如果有兩位使用者同時讀取Application變數,那沒有關係,如果有一位更改資料,一位讀取資料,此時資料的衝突情況就會發生,為了避免這種情況,Application的兩個方法【lock】和【unlock】,可以保障在同一時間內只允許一位使用者存取Application變數,其程式碼如下所示: Application.Lock() Application("Hit_Counter") = Application("Hit_Counter") + 1 Application.Unlock()
12-3-2 網站的訪客計數 • 網站的訪客計數是網站的必備元件,其目的是顯示一共有多少位訪客曾經瀏覽網站,顯示的資訊可以是從開站以來的訪客數,或一段時間之內的訪客數。 • ASP.NET設計訪客計數,只需在Global.asax檔案的Session_Start事件處理程序,使用Application變數記錄訪客計數,就可以輕鬆建立網站的訪客計數功能,其式碼如下所示: Application("Hit_Counter") = Application("Hit_Counter") + 1
12-4 Session物件的狀態管理 • 12-4-1 Session物件 • 12-4-2 目前有多少人在線上
12-4-1 Session物件-說明 • 每一個Session物件擁有唯一的Session ID編號,此後在瀏覽ASP.NET程式和即將瀏覽的其它ASP.NET程式的過程,都可以存取此Session物件的變數。 • ASP.NET可以憑藉Session ID判斷使用者是否仍在Session期間,直到Session物件TimeOut屬性設定的時間或執行Abandon方法,當每次讀取新的ASP.NET程式,TimeOut屬性都會歸零重新計算。
12-4-1 Session物件-使用 • Session變數屬於使用者,每一位使用者都擁有一組專屬的Session變數,雖然每位使用者的Session變數擁有相同名稱,但是值可能就不同,而且只有該位使用者才能存取自己的Session變數,例如:使用者hueyan登入網站,建立Session變數的程式碼如下: Session("username") = "hueyan" Session("password") = "1234"
12-4-2 目前有多少人在線上 • 線上使用者是即時狀態,其最大的問題是如何判斷使用者目前仍在線上,可以指定TimeOut屬性,以決定停留在網站多久時間的使用者算為線上的使用者,如下所示: Session.TimeOut = 5 • 上述程式碼指定的值是分鐘,停留5分鐘的使用者才算是目前線上的使用者,不過因為在Application_Start事件並不能指定TimeOut屬性,所以是放在Session_Start事件。
12-5 Application與Session物件的使用 • 12-5-1 正確的使用Application和Session變數 • 12-5-2 使用Application和Session物件儲存物件
12-5-1 正確的使用Application和Session變數 • Session變數的目的是儲存使用者的專屬資料,對於固定內容的變數,就應該採用Application變數。 • 因為Appliction變數是分享給所有使用者,應該將它放在Application_Start的事件處理程序。
12-5-2 使用Application和Session物件儲存物件 • Application和Session變數不只可以儲存數值或字串,在上一節還用來儲存Hashtable的Collection物件,如下所示: 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
12-6 在網頁間傳遞Web表單內容 • 12-6-1 使用URL參數 • 12-6-2 使用Session變數 • 12-6-3 使用Web表單的類別屬性
12-6-1 使用URL參數 • 舊版ASP的網頁間資料傳遞除了使用表單外,還可以使用URL網址傳遞的參數,在接收網頁只需使用QueryString物件集合,就可以取得傳遞值,其優點是簡單,但問題是瀏覽程式可以看到傳遞值。 Sub Page_Load(sender As Object, e As Eventargs) name.Text = Request.QueryString("username") pass.Text = Request.QueryString("password") End Sub
12-6-2 使用Session變數 • 第一步的ASP.NET事件處理程序,如下所示: Sub GotoNextStep(Sender As Object, e As Eventargs) Session("UserName") = user.Text Session("Password") = pass.Text Response.Redirect("Ch12-6-2Second.aspx") End Sub • 使用Response.Redirect方法轉向到第二步的ASP.NET程式。使用Session變數取得傳遞的變數值,如下所示: name.Text = Session("UserName") pass.Text = Session("Password") Session.Remove("UserName") Session.Remove("Password")
12-6-3 使用Web表單的類別屬性-第一步 • 程式的開頭是Page指引,如下所示: <%@ Page Language="VB" ClassName="firstStepClass" %> • 事件處理程序的類別屬性,如下所示: Public ReadOnly Property UserName() As String Get Return user.Text End Get End Property Public ReadOnly Property Password() As String Get Return pass.Text End Get End Property
12-6-3 使用Web表單的類別屬性-第二步 • 程式的開頭是Reference指引,如下所示: <%@ Reference Page="Ch12-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
12-7 Web.config設定ASP.NET應用程式 • 12-7-1 Web.config檔案的基礎 • 12-7-2 appSetting區段應用程式參數 • 12-7-3 在sessionState區段設定Session狀態 • 12-7-4 globalization區段的編碼設定 • 12-7-5 compilation區段的編譯設定 • 12-7-6 customErrors區段的自訂錯誤網頁
12-7-1 Web.config檔案的基礎-說明 • Web.config檔案是ASP.NET應用程式的資源設定檔案,這是一個XML文件,內含各種設定的XML標籤,可以簡化ASP.NET應用程式的相關設定。 • Web.config檔案是儲存在Web伺服器的虛擬目錄,電腦根設定檔案名為【Machine.config】,伺服器所有其它目錄的設定都是繼承此設定檔案,如果需要更改設定就是使用Web.config檔案。
12-7-1 Web.config檔案的基礎-範例 • <configuration> <appSettings> <add key="provider" value="Microsoft.Jet.OLEDB.4.0;"/> <add key="database" value="/Ch12/Products.mdb"/> </appSettings> <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>
12-7-2 appSetting區段的應用程式參數 • Web.config檔案的<appSettings>區段可以新增ASP.NET應用程式所需的參數,它屬於<configuration>標籤的子標籤,如下所示: <configuration> <appSettings> <add key="provider" value="Microsoft.Jet.OLEDB.4.0;"/> <add key="database" value="/Ch12/Products.mdb"/> </appSettings> <system.web> ……… </system.web> </configuration> • 在ASP.NET程式可以使用System.Configuration名稱空間的ConfigurationSettings類別取得參數,如下所示: Dim provider As String = ConfigurationSettings.appSettings("provider") Dim database As String = ConfigurationSettings.appSettings("database")
12-7-3 在sessionState區段設定Session狀態 • ASP.NET的Session狀態管理比ASP擁有更多的擴充性,在Web.config檔案的<sessionState>區段可以設定如何管理Session狀態,這是<system.web>的子標籤,如下所示: <configuration> <system.web> <sessionState cookieless="false" timeout="10"/> ……… </system.web> </configuration>
12-7-4 globalization區段的編碼設定 • globalization區段是<system.web>的子標籤,可以設定ASP.NET程式預設的檔案、請求回應的編碼方式、日期時間格式和數字等本地化的相關設定,如下所示: <configuration> <system.web> <globalization fileEncoding="big5" requestEncoding="big5" responseEncoding="big5" culture="zh-TW"/> ……… </system.web> </configuration>
12-7-5 compilation區段的編譯設定 • compilation區段是<system.web>的子標籤,可以設定ASP.NET程式預設的編譯方式,如下所示: <configuration> <system.web> <compilation defaultLanguage="VB" debug="true"/> ……… </system.web> </configuration>
12-7-6 customErrors區段的自訂錯誤網頁 • 在customErrors區段可以指定錯誤網頁,如下所示: <configuration> <system.web> <customErrors mode="RemoteOnly" defaultRedirect="Ch12-7error.htm"/> ……… </system.web> </configuration>