ASP.NET網頁製作徹底研究

Download Report

Transcript ASP.NET網頁製作徹底研究

第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 網頁間資料傳遞的方法客戶端的狀態管理
使用的方法
說明
Cookies
Cookies 是保留在使用者電腦的小檔案,檔案內容就是這些使
用者資訊
ViewState
ASP.NET 的 ViewState 功能,在表單送回時能夠在網頁使用
ViewState 屬性保留使用者資料
Hidden 隱藏欄位
使用表單的 Hidden 欄位送回表單資料或傳遞資料到其它網頁
QueryString 物件集合 使用網址 URL 參數,我們可以在 URL 網址加上參數,將資料
傳遞給其它網頁
12-1-3 網頁間資料傳遞的方法伺服端的狀態管理
使用的方法
說明
Application 物件
使用 Application 物件的變數儲存使用者資料
Session 物件
使用 Session 物件的變數儲存使用者資料
資料庫
使用資料庫的記錄資料儲存使用者資料
XML 文件或文字檔案 使用 XML 文件或文字檔案儲存使用者資料
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-1 Global.asax檔案的架構事件處理程序
事件處理程序
說明
Application_Start 當第一位使用者進入 ASP.NET 程式時,Application_Start 的事件就
觸發,在觸發後就算有成千上萬位使用者進入網站都不會重新觸
發,除非 Web 伺 服器關 機。程 序內 容通常是 屬於系統設 定的
Application 變數,例如:初始的訪客計數
Application_End 當 Web 伺服器關機,此事件就會觸發
Session_Start
每一位使用者在執行 ASP.NET 程式前,就觸發此事件,如果有 50
位使用者,就觸發 50 次事件處理程式,每個事件是獨立觸發,如
同瀏覽網頁一般,並不會互相影響,程序內容通常是一些使用者專
屬 Session 變數的初始設定
Session_End
使用者在預設的 20 分鐘內沒有進入其它的 ASP.NET 程式,就會觸
發此事件,這個時間是由 TimeOut 屬性設定,程序內容並沒有辦法
處理已經離開網站的使用者,通常屬於一些善後用途的程式碼,例
如:將 Session 變數存入資料庫或文字檔案
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-1 Session物件-屬性和方法
方法
說明
Abandon
使用者建立的 Session 變數都會清除掉,再也不能存取 Session 變數值
Remove
刪除指定的 Session 變數,參數是 Session 變數的名稱字串
屬性
說明
TimeOut
設定和取得超過 Session 期間的時間,從第一次進入 ASP.NET 程式,
到下一次請求的間隔時間,以分鐘計
SessionID
取得使用者唯一的 Session 編號,這是唯讀屬性
LCID
網頁使用的指定區域碼的相關設定,這包括日期時間和貨幣等格式
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>